MSP430C语言例题免费版
(完整word版)单片机C语言程序设计实训100例
《单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例第 01 篇基础程序设计01 闪烁的LED/*名称:闪烁的LED说明:LED按设定的时间间隔闪烁*/#include<reg51.h〉#define uchar unsigned char#define uint unsigned intsbit LED=P1^0;//延时void DelayMS(uint x){uchar i;while(x-—){for(i=0;i〈120;i++);}}//主程序void main(){while(1){LED=~LED;DelayMS(150);}}02 从左到右的流水灯/* 名称:从左到右的流水灯说明:接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果*/#include〈reg51。
h〉#include<intrins。
h>#define uchar unsigned char #define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x—-){for(i=0;i〈120;i++);}}//主程序void main(){P0=0xfe;while(1){P0=_crol_(P0,1); //P0的值向左循环移动DelayMS(150);}}03 8只LED左右来回点亮/*名称:8只LED左右来回点亮说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果*/#include<reg51.h>#include〈intrins.h>#define uchar unsigned char #define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x——){for(i=0;i〈120;i++);}}//主程序void main(){uchar i;P2=0x01;while(1){for(i=0;i〈7;i++){P2=_crol_(P2,1); //P2的值向左循环移动DelayMS(150);}for(i=0;i<7;i++){P2=_cror_(P2,1); //P2的值向右循环移动DelayMS(150);}}}04 花样流水灯/* 名称:花样流水灯说明:16只LED分两组按预设的多种花样变换显示*/#include<reg51。
基于msp430单片机的智能台灯设计(C语言)综述
桂林理工大学信息学院实习报告实习名称:电子系统设计创新与实践设计题目:基于单片机的智能台灯设计专业班级:姓名:学号:组员:指导老师:实习时间:目录1概述 (3)1.1 题目名 (3)1.2 功能和技术指标要求 (3)1.3 国内外相关情况概述 (3)1.4 调光技术的选择 (4)2. 技术方案 (5)2.1 光照强度检测传感器的基本原理介绍 (5)2.2 总体技术方案 (5)3 硬件设计 (6)3.1 总体电路原理图 (6)3.2 各模块分别介绍 (7)3.2.1 MSP430G2553单片机模块 (7)3.2.2 BISS0001 人体红外感应模块热释电传感器 (8)3.2.3光敏电阻控制模块 (11)3.2.4 光敏电阻的应用 (12)3.3 灯光控制模块 (12)3.4 PWM调光说明 (13)3.5 硬件调试 (13)3.5.1 调试方法 (13)3.5.2 调试步骤 (14)4. 软件设计 (15)4.1 软件功能说明 (15)4.2 软件总流程 (15)4.3 软件测试 (15)5. 性能测试 (16)5.1 测试方法 (16)5.2 给出相应记录 (16)5.3 对实验数据进行分析以及提出相应的改进办法 (17)6.总结 (17)附录(程序清单):................................................. 错误!未定义书签。
参考文献: (18)1概述1.1 题目名基于单片机的智能台灯设计1.2 功能和技术指标要求本项目针对台灯的节电和使用的方便性进行创新设计与研究,以单片机为核心,综合运用热释电红外、光检测等技术,设计制作出智能型多功能LED台灯。
该台灯具有自动开、关,自动调光等功能,实现了LED的亮度随周围光照强度的变化而变化。
本设计一智能台灯控制器,实现照明控制系统的人性化,即当亮度足够时灯光关闭,在亮度不足时,有人走近自动点亮,并根据周围环境的亮度自动调节灯泡的功率的节能环保的智能型LED台灯的设计理念。
Msp430频率计c语言代码实现
Msp430频率计c语言代码实现#include <msp430x14x.h>#define uint unsigned intuint i,f;unsigned char table[] = " Hz";//******************延时函数*******************************void delay(uint z){uint t,y;for(t=z;t>0;t--)for(y=110;y>0;y--);}//*******************写命令********************************** void write_com(unsigned char com){P3OUT&=~BIT0; //作为RS选择端低电平有效P3OUT&=~BIT1; //rw位置低P4OUT = com;delay(5);P3OUT|=BIT2; //E选择端置高电平;P3OUT&=~BIT2; //E置低电平}//*******************写数据********************************** void write_data(unsigned char date){P3OUT|=BIT0; //作为RS选择端高电平有效P3OUT&=~BIT1 ; //rw位置低P4OUT=date;delay(5);P3OUT|=BIT2; //E选择端置高电平;P3OUT&=~BIT2; //E置低电平}//********************初始化***********************************void init(){P3DIR=0xff; //P3输出作控制口P3SEL=0;P3OUT=0x00;P3OUT&=~BIT2; //EP3OUT&=~BIT0; //RSP4DIR=0XFF; //P4输出作数据口P4SEL=0;P4OUT=0X00;write_com(0x38); //显示模式设置write_com(0x0c); //开显示,不显光标write_com(0x06); //数据地址指针write_com(0x01); //清屏_BIS_SR(GIE); //开总中断}//********************液晶显示函数************************void display(unsigned char x,unsigned char *p){unsigned int NUM;write_com(x);for(NUM=0;NUM<10;NUM++){write_data(table[NUM]);}}//***********************主函数**************************************************void main(void){WDTCTL = WDT_ADLY_250; // WDT 250ms, ACLK, interval timer IE1 |= WDTIE; // Enable WDT interruptTACTL = TASSEL_0 + TACLR + TAIE + MC1; //定时器A选择外部时钟源,开中断,连续计数模式P1DIR &= ~BIT0; //P1.0输入P1SEL |= BIT0; //P1.0做定时器A的外部信号源输入端口_EINT(); //开总中断while(1){if(f != 0){IE1 &= ~WDTIE; //关看门狗中断table[0] = f/100000 + '0'; //设置液晶输出数组table[1] = f/10000 - 10*(f/100000) + '0';table[2] = f/1000 - 10*(f/10000) + '0';table[3] = f/100 - 10*(f/1000) + '0';table[4] = f/10 - 10*(f/100) + '0';table[5] = f - 10*(f/10) + '0';init();while(1){display(0x80,table); //液晶显示}}}}// Watchdog Timer interrupt service routine#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){i = TAR;f = 4*i;}。
430单片机测试题
430 单片机测试题1、PWM波设计,要求:三个按键,一个增加占空比,一个减少占空比,步进5%。
一个改变周期//*此函数用CCR0,CCR1产生一路占空比,周期可调的PWM波//*输出引脚为p1.2//*其中p1.5为周期增加,p1.4为占空比增加,p1.3为占空比较少#include"msp430g2553.h"void main( void ){WDTCTL = 0X5A80;DCOCTL=CALDCO_1MHZ; //*选择DCO为1MHZ时钟BCSCTL1= CALBC1_1MHZ;TACTL=TASSEL_2+TACLR+MC_1; //*设置时钟计数TACCTL1=OUTMOD_7; //* 输出为复位置位CCR0=5000;CCR1=2500;P1DIR|=BIT2;P1SEL|=BIT2;P1IFG=0;P1DIR&=~(BIT5+BIT4+BIT3); //*设置5为周期3,4为占空比P1REN |=BIT5+BIT4+BIT3; //* 上拉P1IES|=BIT5+BIT4+BIT3; //* 下降沿触发中断P1IE|=BIT5+BIT4+BIT3; //*打开中断_EINT();while(1){ LPM0; }}#pragma vector=PORT1_VECTOR__interrupt void PORT_I(void){LPM0_EXIT;_delay_cycles(1500);if (P1IFG&BIT5) // 若1.0 按钮(周期)接通可用端口标志位判断是那个端口接通因为端口中断标志不会自动复位{CCR0 +=2500;P1IFG &= ~BIT5 ;}if (P1IFG&BIT4){CCR1 += 0.05*CCR0 ;P1IFG &= ~BIT4 ;if (CCR1>0.95*CCR0) CCR1=CCR0-CCR1 ;}if (P1IFG&BIT3){CCR1 -= 0.05*CCR0 ;P1IFG &= ~BIT3 ;if (CCR1<0.05*CCR0) CCR1=CCR1+CCR0 ;}}2、数字电压表。
ds1302-msp430c语言程序
}
CLK_1;
RST_0;
} */
/********************************************************************
*
* 名称: v_BurstW1302R
* 说明: 先写地址,后写数据(寄存器多字节方式)
* 功能: 往DS1302写入时钟数据(多字节方式)
* 调用: v_RTInputByte()
* 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
* 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
#define CLK_OUT P1DIR |= BIT2 // P1.2 scl
#define CLK_1 P1OUT |= BIT2
#define CLK_0 P1OUT &= ~BIT2
uchar ACC;
void delay (unsigned int TT)
{
for ( ; TT!=0; TT--);
* 功能: 往DS1302寄存器数写入数据(多字节方式)
* 调用: v_RTInputByte()
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
***********************************************************************/
MSP430 单片机C语言和汇编语言混合编程
MSP430 单片机C语言和汇编语言混合编程Mixing C and Assembler With the MSP430刘玉宏Liu,Yuhong摘要:为了发挥C语言和汇编语言各自的优点,二者需要相互调用函数。
本文首先介绍了MSP430单片机的C语言函数的参数传递规则,然后对C语言和汇编语言的混合编程进行了详细描述,最后给出应用实例。
关键字:MSP430单片机IAR C语言汇编语言混合编程中图分类号:TP368.1 文献标识码:AAbstract:In order to play the vritues of c and assembler language,they need to call each other’s function. This paper describes the rules of C-Compiler for passing variables between functions, mixing c and assembler with MSP430 in details,then gives an application example.Keyword:MSP430 MCU;IAR C-Compiler;Assembler Language;Mixing ProgrammingMSP430是一款16位的单片机,它具有超低功耗、丰富的片内外围模块、多样的可选型号、软件对硬件的灵活控制能力等优点。
因此特别适合于以电池为电源的应用场合或手持设备,目前在国内主要应用于三表系统和消防设备方面。
MSP430单片机的开发软件较常用的是IAR公司的IAR Embedded Workbench集成开发环境,它可以编辑、汇编和编译汇编语言和C语言源文件,并且其C语言和汇编语言具有相同格式的头文件,给开发带来了灵活性。
C语言具有编程简单,可以移植等优点,但是产生代码较长,对硬件的直接控制能力相对较弱;汇编语言产生的代码较小,控制硬件灵活,但是可读性差,移植困难,因此为了发挥各自优点,产生高速度、高效率的代码混合编程是最好的选择。
msp430练习题
MSP430G2553练习题
基础练习题:
1.LED
大约0.2秒的循环灯
2.按键
按键中断控制LED亮灭
3.时钟
将内部时钟ACK,SMCLK从IO口输出,并改变SMCLK频率,达到20MHz。
观察ACK的频率和稳定性。
4.定时器
使用定时器,在定时器中取反IO口,输出500Hz方波。
5.PWM波
通过IO口输出1K的PWM波,控制LED亮度。
用按键控制PWM波的占空比:按下时,LED渐灭;放开后,LED渐亮。
6.串口
完成单片机与电脑的串口通信,通过串口调试助手向430单片机发送“Hello!”,430单片机回复“Hello,World!”。
7.AD
使用AD进行100Hz的周期采样,并将采样的数据发送到PC串口调试助手显示出来.
扩展:
8.SPI
熟悉SPI协议,使用SPI控制tlv5616.
9.I2C
熟悉I2C协议,使用I2C控制ADS1115.
综合练习题:
输出1K的SPWM波,用截止频率为10Hz无源RC低通滤波滤出10Hz以内的正弦波,可以用按键改变滤出波形的频率(1Hz为步进).然后用IO口的AD进行100Hz周期采样,将采样的数据用串口发回电脑,并用MFC或matlab显示出来.
要求:
在五一前完成所有的基础练习题,并交与学长验收.
综合练习题要求以组为单位,交一份程序和实验结果与学长验收.
扩展也要求在暑假前完成.。
MSP430 C语言例题
微控设计网中国MSP430单片机专业网站 微控设计网 微控设计网中国MSP430单片机专业网站MSP430 C语言例题由微控技术论坛会员Slam 提供Page 1 of 21基于模拟前端信号处理与控制技术的专业论坛、网站 微控设计网中国MSP430单片机专业网站 微控设计网本章选择了一些简单的C语言程序例题,这些程序的结构简单,编程技巧不多,题目虽然简单,但是非常适合入门单片机的学习者学习MSP430单片机的C语言编程。
如下列出了C语言例题运行的MSP430F149实验板硬件资源环境,熟悉这些硬件资源,对于理解程序非常重要。
(1)数码管:左侧数码管与P5口相连,a~g,h对应P5.0~P5.7右侧数码管与P4口相连,a~g,h对应P4.0~P4.7(2)发光二极管8个发光二极管与P3口连接(3)按钮:左侧8个按钮与P2口相连,引脚号标在按钮上方右侧8个按钮与P1口相连,引脚号标在按钮上方(4)P2.3引脚还是模拟比较器输入(5)P6.0,P6.1引脚连接模拟量电位器,用于模拟量实验9.1 通过C语言编程例入门MSP430C语言编程如下例子都在MSP430F149实验板上通过验证。
例1:使与P3口的P3.0引脚连接的发光二极管闪烁。
#include <msp430x14x.h> //声明库void main(void) //主函数{unsigned int i; //变量声明WDTCTL=WDTPW+WDTHOLD; //关掉看门狗P3DIR |=BIT0; //设置P3.0为输出,这里BIT0=0x0001while(1) //无限次while循环{for (i=0;i<20000;i++) //for语句,i为循环变量,i每次循环加1,当i<20000时,//循环延时P3OUT=0x00; 使P3.0输出低电平,发光二极管亮,(低电平使发光二极管亮)for (i=0;i<20000;i++) //再次循环延时P3OUT=0x01; 使P3.0输出高电平,发光二极管灭,(高电平使发光二极管灭)}}例2:8个发光二极管1、3、5、7与2、4、6、8交替发光的例子#include <msp430x14x.h>void main(void){unsigned int i;WDTCTL=WDTPW+WDTHOLD;P3DIR=0XFF; //设置P3口为输出while(1){for (i=0;i<20000;i++)P3OUT=0X55; //使发光二极管1、3、5、7 灭,2、4、6、8亮for (i=0;i<20000;i++)P3OUT=0XAA;//使发光二极管1、3、5、7亮,2、4、6、8灭}}例3:定时器控制的发光二极管闪烁。
msp430_c语言
一、实验目的1.巩固编写和调试C语言程序的方法;2.了解简单电路的控制方法二、实验任务1.简单电子表的设计用8 个发光二极管以秒为单位显示时间值,按下面步骤完成一个简单电子表的设计:1)硬件连线:用跳线将L6~L1 分别与P2.5~P2.0 连接,L6~L1 用于显示秒值;用双口杜邦线将L7 与P5.0 连接,L8 与P5.1 连接,L8~L7 用于显示分钟值;蜂鸣器的控制端Buzz 与P4.1 连接;2)编写完整程序:计数秒值,用8 个发光二极管以二进制将时间显示出来,如图3-1,其中高两位显示分钟值(L8、L7),低6 位显示秒值(L6~L1),每60 秒,分钟值加1,黑色表示灯亮,则显示的时间表示表示3 分27 秒。
每计数到4 分钟时,控制蜂鸣器发出一报警声,然后又从0 开始重新计数。
其中1 秒时间可通过执行for(i=0;i<0x3FFFF;i++); 语句所花时间来调整。
实验的硬件图如下所示经过编写和调试程序,下面的程序可以满足试验的要求。
#include "io430.h"int main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P2SEL=0;P1SEL=0;P2DIR=0xFF;P1DIR=0xFF;unsignedinti,j,k,m;for(k=0;k<4;){for(j=0;j<60;j++){P2OUT=j;for(i=0;i<0xFFFF;i++);}k++;P1OUT=k;for(m=0;m<0x3FFFF;m++);}}3)(选做)增加按键控制功能:当按下KEY2 键时清零;按下KEY3 键时开始(或称继续)计时;按下KEY4 键时暂停计时。
硬件图如下图所示:程序如下所示#include "io430.h"void delay(unsigned inti) //定义一个1秒钟延时函数{unsignedint j;while(i--){for(j=0;j<125;j++);}}int main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P1SEL=0x00;P1DIR=0X00;P2SEL=0X00;P2DIR=0XFF;P4SEL_bit.P1=0;P4DIR_bit.P1=1;P5SEL=0x00;P5DIR=0xff;unsignedintl,m;while(1){P4OUT_bit.P1=1;P5OUT=0xff;P2OUT=0xff;if(P1IN_bit.P3==0){while(1){m=0;loop1:while(m<=3){for(l=0;l<60;l++){P2OUT=~l;if(P1IN_bit.P4==0){P2OUT=~l;P5OUT=~m;while((P1IN_bit.P3)&1==1);}if(P1IN_bit.P2==0){P2OUT=0xff;P5OUT=0xff;while((P1IN_bit.P3)&1==1){;} goto loop1;;}delay(100);}m++;P5OUT=~m;if((P5OUT&0x03)==0x03){ P4OUT_bit.P1=0;delay(10);P4OUT_bit.P1=1;P2OUT=0xff;}}}}}}思考题:1)如果硬件连线是将发光二极管LED8~LED1 分别与P2.7~P2.0 连接,按键Key4~Key2 分别与P1.4~P1.2 连接,蜂鸣器BUZZ 与P6.5 连接的话,实验板上连线,如何编程实现任务1?答:和选做部分几乎一样,只要改一下端口的连接,不在赘述了。
补充:MSP430_C语言程序设计(自学)
io430x14x.h中对P2口及其位定义
__no_init volatile union { unsigned __READ char P2IN;
struct { unsigned __READ char P2IN_0 : 1; unsigned __READ char P2IN_1 : 1; unsigned __READ char P2IN_2 : 1; unsigned __READ char P2IN_3 : 1; unsigned __READ char P2IN_4 : 1; unsigned __READ char P2IN_5 : 1; unsigned __READ char P2IN_6 : 1; unsigned __READ char P2IN_7 : 1; } P2IN_bit; } @ 0x0028; __no_init volatile union { unsigned char P2OUT; struct { unsigned char P2OUT_0 : 1; unsigned char P2OUT_1 : 1; unsigned char P2OUT_2 : 1; unsigned char P2OUT_3 : 1; unsigned char P2OUT_4 : 1; unsigned char P2OUT_5 : 1; unsigned char P2OUT_6 : 1; unsigned char P2OUT_7 : 1; } P2OUT_bit; } @ 0x0029;
四、五、六中出现有问题, 返回二、三步骤
IAR下给msp430的C程序模板
#include "io430.h"
int main( void ) {
WDTCTL = WDTPW + WDTHOLD;
msp430题库及答案(word文档良心出品)
一、填空题本题共5小题,每小题4分。
1.// Port1 interrupt service routine#pragma vector = ()__interrupt void Port_1 (void)A.PORT1_VECTOR[正确答案]:[试题解析]:[阅卷得分(4)]:42.// Configure TimerATACTL = (); // Source: ACLK, UP modeCCR0 = 5100; //Timer count 5100CCR1 = 100; //Timer count 100CCTL0 = CCIE; //CCR0 interrupt enabled CCTL1 = CCIE; //CCR1 interrupt enabledA.TASSEL_1 + MC_1;[正确答案]:[试题解析]:[阅卷得分(4)]:43.// Configure Basic ClockBCSCTL1 =(); // Set rangeDCOCTL =(); // Set DCO step + modulation BCSCTL3 |= LFXT1S_2; // Set LFXT1A.CALBC1_1MHZ;B.CALDCO_1MHZ;[正确答案]:[试题解析]:[阅卷得分(4)]:44.// Port1 interrupt service routineP1OUT ^= BIT0; // P1.0 = toggle()&= ~BIT3; // P1.3 IFG clearedA.P1IFG[正确答案]:[试题解析]:[阅卷得分(4)]:45.// Timer A1 interrupt service routine#pragma vector = ()__interrupt void Timer_A1 (void)A.TIMER0_A1_VECTOR[正确答案]:[试题解析]:[阅卷得分(4)]:4二、单选题本题共40题,每小题2分。
MSP430单片机复习题1
【例6.3.1】比较器B输入通道CB0接外部模拟输入信号,并引至比较器“+”输入端。
内部参考电压发生器利用共享电压源产生2.0V参考电压,并引至比较器“-”输入端。
最终产生以下结果:当CB0输入模拟信号电压高于2.0V时,CBOUT输出高电平;当CB0输入模拟信号电压低于2.0V时,CBOUT输出低电平。
#include <msp430f5529.h>void main(void){WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗P1DIR |= BIT6;P1SEL |= BIT6; // P1.6选择功能为比较器输出CBOUT// 以下步骤设置比较器BCBCTL0 |= CBIPEN + CBIPSEL_0; // 启用CB0,并将其引至正输入端CBCTL1 |= CBPWRMD_1; // 正常电源模式CBCTL2 |= CBRSEL; // 内部参考电压VREF引至负输入端CBCTL2 |= CBRS_3+CBREFL_2; // 梯形电阻电路禁用,产生2.0V内部共享电压CBCTL3 |= BIT0; // 启用P6.0/CB0比较器功能CBCTL1 |= CBON; // 打开比较器B_ _delay_cycles(75); // 延迟以待参考电压稳定_ _bis_SR_register(LPM4_bits); // 进入LPM4}【例6.3.2】比较器B输入通道CB0接外部模拟输入信号,并引至比较器“+”输入端。
内部参考电压发生器利用共享电压源产生1.5V参考电压,并引至比较器“-”输入端。
利用比较器中断,当CB0输入模拟信号电压高于1.5V时,拉高P1.0引脚;当CB0输入模拟信号电压低于1.5V时,拉低P1.0引脚。
#include <msp430f5529.h>void main(void){WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗P1DIR |= BIT0; // 将P1.0设为输出CBCTL0 |= CBIPEN + CBIPSEL_0; // 启用CB0,并将其引至正输入端CBCTL1 |= CBPWRMD_1; // 正常电源模式CBCTL2 |= CBRSEL; // 内部参考电压VREF引至负输入端CBCTL2 |= CBRS_3+CBREFL_1; // 梯形电阻电路禁用,产生1.5V内部共享电压 CBCTL3 |= BIT0; // 启用P6.0/CB0比较器功能_ _delay_cycles(75); // 延迟以待参考电压稳定CBINT &= ~(CBIFG + CBIIFG); // 清除比较器中断标志位CBINT |= CBIE; // 使能比较器CBIFG上升沿中断(CBIES=0) CBCTL1 |= CBON; // 打开比较器B_ _bis_SR_register(LPM4_bits+GIE);// 进入LPM4}【例6.5.1】利用MSP430F6736单片机的LCD_C模块,采用4MUX动态驱动模式,使段码液晶循环显示0123456789。
MSP430系列单片机实用C语言程序设计
MSP430系列单片机实用C语言程序设计——March 2, 2011扩展的关键字1.asm也可以写成__asm。
功能是在C程序中直接嵌入汇编语言。
语法:asm(“string”);其中string必须是有效的汇编语句。
2.__interrupt放在函数前面,标志中断函数。
下面这段程序是异步串行口UART0的接收中断函数。
UART0RX_VECTOR为异步串行口UART0的接收中断向量。
举例:#pragma vector=UART0RX_VECTOR__interrupt void UART0_R(void) //UART0接收中断{TXBUF0=RXBUF0;}3.__monitor放在函数前面,功能是但这一函数执行的时候自动关闭中断。
应该尽量缩短这样的函数,否则,中断事件无法得到及时的响应。
4.__no_init放在全局变量前面,功能是使程序启动时不为变量赋初值。
5.__raw编译中断函数时,编译器会自动生成一段代码,首先保存当时所用到CPU内寄存器的内容,退出中断程序时再进行恢复。
将__raw放在中断函数前可以禁止保存CPU内寄存器的过程,当然退出时也不会恢复。
是否为中断函数使用此关键字要根据需要而定。
6.__regvar放在变量前面,作用是声明变量为寄存器变量。
可以用于整数、指针、32位浮点数以及只含有一个元素的结构和联合。
寄存器变量的地址只能为R4或者R5,也不能用指针指向这个寄存器变量,而且必须用__no_init禁止初始化。
如:__regvar __no_init unsigned char q0 @ __R4;其他不常用的关键字还有:__data16、__intrinsic、__noreturn、__root、__task、__word16。
内部函数本节将介绍内部函数的原型和功能。
1.__bcd_add_shortunsigned short __bcd_add_short(unsigned short, unsigned short);功能:两个16位BCD格式的数相加,返回和。
msp430f149的24c02标准C语言程序
机,msp430,avr单片机,单片机开发板单片机教程网()是专业提供各种单片机教程、资料、程序,为初学者打造一个良好的学习交流的平台!msp430f149的24c02标准C语言程序#include <msp430x14x.h>typedef unsigned char uchar;typedef unsigned int uint;#define SCL_H P3OUT |= BIT3#define SCL_L P3OUT &= ~BIT3#define SDA_H P3OUT |= BIT1#define SDA_L P3OUT &= ~BIT1#define SDA_in P3DIR &= ~BIT1 //SDA改成输入模式#define SDA_out P3DIR |= BIT1 //SDA变回输出模式#define SDA_val P3IN&BIT1 //SDA的位值#define TRUE 1#define FALSE 0#define deviceaddress 0xa0 //AT24C02的设备地址/********************************************//*******************************************函数名称:delay功能:延时约15us的时间参数:无返回值:无********************************************/void delay(void){uchar i;for(i = 0;i 15;i++)_NOP();}/******************************************* 函数名称:start功能:完成IIC的起始条件操作参数:无返回值:无********************************************/ void start(void){SCL_H;SDA_H;delay();SDA_L;delay();SCL_L;delay();}/******************************************* 函数名称:stop功能:完成IIC的终止条件操作参数:无返回值:无********************************************/ void stop(void) {SDA_L;delay();SCL_H;delay();SDA_H;delay();}/*******************************************函数名称:mack功能:完成IIC的主机应答操作参数:无返回值:无********************************************/void mack(void){SDA_L;SCL_H;delay();SCL_L;_NOP();_NOP();SDA_H;delay();}/******************************************* 函数名称:mnack功能:完成IIC的主机无应答操作参数:无返回值:无********************************************/ void mnack(void){SDA_H;_NOP(); _NOP();SCL_H;delay();SCL_L;_NOP(); _NOP();SDA_L;delay();}/**********检查应答信号函数******************/ /*如果返回值为1则证明有应答信号,反之没有*/ /******************************************* 函数名称:check功能:检查从机的应答操作参数:无返回值:从机是否有应答:1--有,0--无********************************************/ uchar check(void){uchar slaveack;SDA_H;_NOP(); _NOP();SCL_H;SDA_in;_NOP(); _NOP();slaveack = SDA_val; //读入SDA数值SCL_L;delay();SDA_out;if(slaveack) return FALSE;else return TRUE;}/******************************************* 函数名称:write1功能:向IIC总线发送一个1参数:无返回值:无********************************************/ void write1(void){SDA_H;delay();SCL_H;delay();SCL_L;delay();}/******************************************* 函数名称:write0功能:向IIC总线发送一个0参数:无返回值:无********************************************/ void write0(void){SDA_L;delay();SCL_H;delay();SCL_L;delay();}/******************************************* 函数名称:write1byte功能:向IIC总线发送一个字节的数据参数:wdata--发送的数据返回值:无********************************************/ void write1byte(uchar wdata){uchar i;for(i = 8;i > 0;i--){if(wdata & 0x80) write1();else write0();wdata <= 1;}SDA_H;_NOP();}/******************************************* 函数名称:writeNbyte功能:向IIC总线发送N个字节的数据参数:outbuffer--指向发送数据存放首地址的指针n--数据的个数返回值:发送是否成功的标志:1--成功,0--失败********************************************/ uchar writeNbyte(uchar * outbuffer,uchar n) {uchar i;for(i = 0;i n;i++){write1byte(* outbuffer);if(check()){outbuffer++;}else{stop();return FALSE;}}stop();return TRUE;}/******************************************* 函数名称:read1byte功能:从IIC总线读取一个字节参数:无返回值:读取的数据********************************************/ uchar read1byte(void){uchar rdata = 0x00,i;uchar flag;for(i = 0;i 8;i++){SDA_H;delay();SCL_H;SDA_in;delay();flag = SDA_val;rdata <= 1;if(flag) rdata |= 0x01;SDA_out;SCL_L;delay();}return rdata;}/******************************************* 函数名称:readNbyte功能:从IIC总线读取N个字节的数据参数:inbuffer--读取后数据存放的首地址n--数据的个数返回值:无********************************************/ void readNbyte(uchar * inbuffer,uchar n){uchar i;for(i = 0;i n;i++){inbuffer[i] = read1byte();if(i (n-1)) mack();else mnack();}stop();}/*******************************************函数名称:delay_10ms功能:延时约6ms,等待EEPROM完成内部写入参数:无返回值:无********************************************/ void delay_10ms(void){uint i = 1000;while(i--);}/*******************************************函数名称:Write_1Byte功能:向EEPROM中写入1个字节的数据参数:Wdata--写入的数据dataaddress--数据的写入地址返回值:写入结果:1--成功,0--失败********************************************/ uchar Write_1Byte(uchar wdata,uchar dataaddress) {start();write1byte(deviceaddress);if(check())write1byte(dataaddress);elsereturn 0;if(check())write1byte(wdata);elsereturn 0;if(check()) stop();else return 0;delay_10ms(); //等待EEPROM完成内部写入return 1;}/*******************************************函数名称:Write_NByte功能:向EEPROM中写入N个字节的数据参数:outbuf--指向写入数据存放首地址的指针n--数据个数,最大不能超过8,由页地址决定其最大长度dataaddress--数据写入的首地址返回值:写入结果:1--成功,0--失败********************************************/uchar Write_NByte(uchar * outbuf,uchar n,uchar dataaddress) {uchar flag;start();write1byte(deviceaddress); //写入器件地址if(check() == 1)write1byte(dataaddress); //写入数据字地址elsereturn 0;if(check())flag=writeNbyte(outbuf,n);elsereturn 0;delay_10ms(); //等待EEPROM完成内部写入if(flag) return 1;else return 0;}/*******************************************函数名称:Read_1Byte_currentaddress功能:从EEPROM的当前地址读取1个字节的数据参数:无返回值:读取的数据********************************************/uchar Read_1Byte_currentaddress(void){uchar temp;start();write1byte((deviceaddress|0x01));if(check())temp = read1byte();elsereturn 0;mnack();stop();return temp;}/*******************************************函数名称:Read_NByte_currentaddress功能:从EEPROM的当前地址读取N个字节的数据参数:readbuf--指向保存数据地址的指针n--读取数据的个数返回值:读取结果:1--成功,0--失败********************************************/uchar Read_NByte_currentaddress(uchar * readbuf,uchar n) {start();write1byte((deviceaddress|0x01));if(check())readNbyte(readbuf,n);elsereturn 0;return 1;}/*******************************************函数名称:Read_1Byte_Randomaddress功能:从EEPROM的指定地址读取1个字节的数据参数:dataaddress--数据读取的地址返回值:读取的数据********************************************/uchar Read_1Byte_Randomaddress(uchar dataaddress){uchar temp;start();write1byte(deviceaddress);if(check())write1byte(dataaddress);elsereturn 0;if(check()){start();write1byte((deviceaddress|0x01));}elsereturn 0;if(check())temp = read1byte();elsereturn 0;mnack();stop();return temp;}/*******************************************函数名称:Read_NByte_Randomaddress功能:从EEPROM的指定地址读取N个字节的数据参数:readbuf--指向保存数据地址的指针n--读取数据的个数dataaddress--数据读取的首地址返回值:读取结果:1--成功,0--失败********************************************/uchar Read_NByte_Randomaddress(uchar * readbuf,uchar n,uchar dataaddress){start();write1byte(deviceaddress);if(check())write1byte(dataaddress);elsereturn 0;if(check()){start();write1byte(deviceaddress|0x01);}elsereturn 0;if(check())readNbyte(readbuf,n);elsereturn 0;return 1;}本例程是基于msp430f149单片机的24C02的程序,主要让我们熟悉的掌握IIC 协议的操作,虽然没有写主函数进行读写操作,但是这模块化非常实用,无论是扩展成24C16还是其它I2C对新手朋友有非常好的参考价值。
msp430题库及答案(word文档良心出品)
一、填空题本题共5小题,每小题4分。
1.// Port1 interrupt service routine#pragma vector = ()__interrupt void Port_1 (void)A.PORT1_VECTOR[正确答案]:[试题解析]:[阅卷得分(4)]:42.// Configure TimerATACTL = (); // Source: ACLK, UP modeCCR0 = 5100; //Timer count 5100CCR1 = 100; //Timer count 100CCTL0 = CCIE; //CCR0 interrupt enabled CCTL1 = CCIE; //CCR1 interrupt enabledA.TASSEL_1 + MC_1;[正确答案]:[试题解析]:[阅卷得分(4)]:43.// Configure Basic ClockBCSCTL1 =(); // Set rangeDCOCTL =(); // Set DCO step + modulation BCSCTL3 |= LFXT1S_2; // Set LFXT1A.CALBC1_1MHZ;B.CALDCO_1MHZ;[正确答案]:[试题解析]:[阅卷得分(4)]:44.// Port1 interrupt service routineP1OUT ^= BIT0; // P1.0 = toggle()&= ~BIT3; // P1.3 IFG clearedA.P1IFG[正确答案]:[试题解析]:[阅卷得分(4)]:45.// Timer A1 interrupt service routine#pragma vector = ()__interrupt void Timer_A1 (void)A.TIMER0_A1_VECTOR[正确答案]:[试题解析]:[阅卷得分(4)]:4二、单选题本题共40题,每小题2分。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中国MSP430单片机专业网站
微控设计网
微控设计网 中国 MSP430 单片机专业网站 MSP430 C 语言例题
由微控技术论坛会员 Slam 提供
Page 1 of 21 基于模拟前端信号处理与控制技术的专业论坛、网站
微控设计网
#include <msp430x14x.h> #define XTOFF 0x40; unsigned int i=0,j=0; //声明数据类型 unsigned char seg_7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //数码管字型码数组 unsigned int bit[8]={0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080}; //发光二极管点亮顺序数组 void main (void) { WDTCTL= WDTPW + WDTHOLD; //关看门狗 TACTL = TASSEL0 + TACLR; // 设置定时器A控制寄存器, // TASSEL0=0x0100,选择辅助时钟ACLK(32kHz) // TACLR=0x0004,清除定时器A计数器 CCTL0 = CCIE; //使能定时器A捕捉与中断功能,CCIE=0x0010 CCR0 =32768; // 设置计数器CCR0初值 TACTL |= MC0; //设置定时器工作模式为加计数到CCR0初值 P3DIR = 0XFF; //P3口为输出 P4DIR = 0XFF; //P4口为输出 P5DIR = 0XFF; //P5口为输出 P3OUT = 0X7E; //P3口输出为0111 1110 _EINT(); 调用C430编译器内部函数使能中断 while(1); //没有循环体的无限次while循环 } interrupt[TIMERA0_VECTOR] void Timer_A (void) //定时器A的中断函数 { i+=1; i每次循环加1 if (i==10) //如果i=1 { i=0; //使i=0 j+=1; j每次加1 P3OUT ^= bit[j]; //数组的第j个元素取反后从P3口输出,使发光二极管顺序点亮 if (j==6) //如果j=6 { j=0; 使j=0 } } P4OUT =seg_7[i];//数码管字型数组中取第i个元素,送到P4口输出 P5OUT = seg_7[j]; //数码管字型数组中取第j个元素,送到P5口输出 }
9.1 通过 C 语言编程例入门 MSP430C 语言编程
如下例子都在 MSP430F149 实验板上通过验证。 例 1:使与 P3 口的 P3.0 引脚连接的发光二极管闪烁。
#include <msp430x14x.h> //声明库 void main(void) //主函数 { unsigned int i; //变量声明 WDTCTL=WDTPW+WDTHOLD; //关掉看门狗 P3DIR |=BIT0; //设置P3.0为输出,这里BIT0=0x0001 while(1) //无限次while循环 { for (i=0;i<20000;i++) //for语句,i为循环变量,i每次循环加1,当i<20000时, //循环延时 P3OUT=0x00; 使P3.0输出低电平,发光二极管亮,(低电平使发光二极管亮) for (i=0;i<20000;i++) //再次循环延时 P3OUT=0x01; 使P3.0输出高电平,发光二极管灭,(高电平使发光二极管灭) } }
基于模拟前端信号处理与控制技术的专业论坛、网站
微控设计网
中国MSP430单片机专业网站
微控设计网
} interrupt[TIMERA0_VECTOR] void Timer_A (void) { P3OUT ^= BIT7; } (3)看门狗使输出 P3.7 引脚连接的发光二极管每秒闪烁一次的例子: #include <msp430x14x.h> void main (void) { WDTCTL= WDTPW + WDTTMSEL+WDTSSEL; IE1|=WDTIE; P3DIR |=BIT7; _EINT(); while(1); } interrupt[WDT_VECTOR] void WDT_interrupt (void) { P3OUT ^= BIT7; } 例 5: P4 和 P5 输出口连接的数码管显示 1 和 2。 #include <msp430x14x.h> void main(void) { unsigned char seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //定义七段译码的共阳数码管显示数组 // hgfg dcba //0=1100 0000 //1=1111 1001 //2=1010 0100 //…… //9=1001 0000 WDTCTL=WDTPW+WDTHOLD; //关闭看门狗,以便于调试 P4DIR=0XFF; //设置P4口为输出 P5DIR=0XFF;//设置P5口为输出 P4OUT=seg[1];//向P4口输出数组的第1个元素,数字1的段码 P5OUT=seg[2];//向P5口输出数组的第2个元素,数字2的段码 } 例 6:与 P5 口连接的数码管加 1 计数,与 P4 口相连的数码管显示数字 8。 #include <msp430x14x.h> void main(void) { int i,x; //声明数据类型 unsigned char seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; WDTCTL=WDTPW+WDTHOLD;//关看门狗 P4DIR=0XFF; //P4口为输出,连接有共阳极数码管 P5DIR=0XFF; //P5口为输出,连接有共阳极数码管 P4OUT=seg[8]; //P4输出数字8 P5OUT=seg[0]; //P5输出数字0 while(1) //无限次While循环 { for(i=0;i<=9;i++) //循环变量I从0到9循环 for(x=0;x<20000;x++) //没有循环体的for循环,用于延迟时间 P5OUT=seg[i]; //按照循环变量i的数值,取出相应的数组元素 } }
(2)使用32768Hz晶体产生1s信号的程序如下:
#include <msp430x14x.h> void main (void) { WDTCTL= WDTPW + WDTHOLD; TACTL =TASSEL0+TACLR+MC0; CCTL0 = CCIE; CCR0 =16384; P3DIR |=BIT7; _EINT(); while(1); Page 3 of 21 基于模拟前端信号处理与控制技术的专业论坛、网站
例7:使用定时器输出精确的秒信号。从0开始计时,数码管显示0~60秒,每隔10秒使数码管 更换显示,并顺序点亮发光二极管。
Page 4 of 21 基于模拟前端信号处理与控制技术的专业论坛、网站
基于模拟前端信号处理与控制技术的专业论坛、网站
微控设计网
中国MSP430单片机专业网站
基于模拟前端信号处理与控制技术的专业论坛、网站
微控设计网
中国MSP430单片机专业网站
微控设计网
本章选择了一些简单的 C 语言程序例题,这些程序的结构简单,编程技巧不多,题目虽然 简单,但是非常适合入门单片机的学习者学习 MSP430 单片机的 C 语言编程。 如下列出了 C 语言例题运行的 MSP430F149 实验板硬件资源环境,熟悉这些硬件资源,对 于理解程序非常重要。 (1)数码管: 左侧数码管与 P5 口相连,a~g,h 对应 P5.0~P5.7 右侧数码管与 P4 口相连,a~g,h 对应 P4.0~P4.7 (2)发光二极管 8 个发光二极管与 P3 口连接 (3)按钮: 左侧 8 个按钮与 P2 口相连,引脚号标在按钮上方 右侧 8 个按钮与 P1 口相连,引脚号标在按钮上方 (4)P2.3 引脚还是模拟比较器输入 (5)P6.0,P6.1 引脚连接模拟量电位器,用于模拟量实验
基于模拟前端信号处理与控制技术的专业论坛、网站
微控设计网
中国MSP430单片机专业网站
微控设计网
#include <msp430x14x.h> void main (void) { WDTCTL= WDTPW + WDTHOLD; //设置看门狗控制寄存器,关看门狗 TACTL = TASSEL0 + TACLR; // 设置定时器A控制寄存器, // TASSEL0=0x0100,选择辅助时钟ACLK, // TACLR=0x0004,清除定时器A计数器 CCTL0 = CCIE; //设置捕获/比较控制寄存器,CCIE=0x0010,使能捕获比较中断 CCR0 =16384; //设置捕获/比较寄存器,初始值为16384,对于32768Hz的频率,相当于0.5s P3DIR |=BIT7; //P3.7为输出 TACTL |= MC0; //设置定时器A控制寄存器,MC0=0x0010,使计数模式为增计数 _EINT(); //使能中断,这是一个C编译器支持的内部过程。 while(1); //无限次while循环 } interrupt[TIMERA0_VECTOR] void Timer_A (void) //定时器A的CC0中断处理程序 //TIMERA0_VECTOR=6*2,等于基地址0xFFE0+12=0xFFEC { P3OUT ^= BIT7; //将P3.7引脚取反,就是使发光二极管闪烁 } 例 4:选择不同的时钟源,使 P3.7 连接的发光二极管闪烁。 (1)使用 XT2 时钟源,8MHz 频率,用定时器 A 分频,产生 1s 脉冲,使 P3.7 引脚的发光二极管闪烁。 #include <msp430x14x.h> #define XTOFF 0x40; void main (void) { WDTCTL= WDTPW + WDTHOLD; //关闭看门狗 BCSCTL1 &= ~XT2OFF; //基础时钟控制寄存器BCSCTL1的第7位置0,使XT2启动 BCSCTL2 = SELS + DIVS1 + DIVS0; //基础时钟控制寄存器BCSCTL2设置,第3位置1,选择 //XT2CLK作为SMCLK时钟;将第2和第1位置1,使分频比为8 TACTL =0x02D4; //定时器A控制寄存器设置,第2位置1:清除;第4、5位置1、0:加计数模式 //加计数至CCR0,然后重新开始;第6、7位1、1,所以是8分频;第8、9位是 //0、1,所以TA使用SMCLK时钟。 CCTL0 = CCIE; //CCIE=0x0010,使能定时器A中断 CCR0 =62500; //设置计数器CCR0的初值,((8MHz/8)/8)/2=62500,相当于0.5s的时间 P3DIR |=BIT7; //将P3.7设置为输出 _EINT(); //调用C430编译器内部函数,使能中断 while(1); //无限次循环 } interrupt[TIMERA0_VECTOR] void Timer_A (void) //定时器A中断函数 { P3OUT ^= BIT7; //P3.7位取反 }