实例均已验证过,请用notepad++以C语言的方式查看,配合函数列表插件,否则会看的眼晕,点这里下载最新版 配合用户手册,相信应该很容易理解了吧,我看着感觉比较好的手册,波特率设置文档里已有,自己看看就明白了 ,点这里下载用户手册 添加一份比较好的材料 同样是寄存器和代码示例 点这里下载 时钟模块: void 时钟源(支持四个时钟源) { 外接晶振模块(以外接晶振频率高低划分的) { (1)LFXT1CLK,为低速/高速晶振源,通常接32.768kHz,也可以接(400kHz~16Mhz); low frequency 低频 可通过软件设置来源 接低频振荡器。典型为接32768HZ的时钟振荡器, 在LF模式(XTS=0),直接连接在XIN与XOUT之间, 此时振荡器不需要接负载电容,软件控制XCAPx位来设置LF模式下内部提供的负载电容。 可选1、6、10、12.5pF。 F2xx增加了一个新的超低功耗晶振VLO(12kHz),具有500nA的待机模式。他的使用与LFXT1互斥。BCSCTL3|=LFXT1S1;//ACLK来源于VLO (2)XT2CLK,可选高频振荡器,外接标准高速晶振,通常是接8Mhz,也可以接(400kHz~16Mhz); 接450KHZ~8MHZ的标准晶体振荡器。外部标准晶体振荡器接在XT2IN和XT2OUT之间,此时需要接负载电容,不用时可以关闭。 低频振荡器主要用来降低能量消耗,如使用电池供电的系统,高频振荡器用来对事件做出快速反应或者供CPU进行大量运算 在HF模式(XTS=1),可以接450KHZ~8MHZ的标准晶体振荡器, 此时需要接负载电容.LXFT1产生的频率信号为ACLK.低速时钟需要上百毫秒的建立时间才能稳定下来. } 内部晶振模块 { (1)DCOCLK,数控振荡器,为内部晶振,由RC震荡回路构成; (DCO是Digital Control Oscillation的缩写,即表示数字振荡器) 数控RC振荡器。它在芯片内部,不用时可以关闭。 DCO的振荡频率会受周围环境温度和MSP430工作电压的影响,且同一型号的芯片所产生的频率也不相同。 但DCO的调节功能可以改善它的性能,他的调节分为以下3步: a:选择BCSCTL1.RSELx确定时钟的标称频率; b:选择DCOCTL.DCOx在标称频率基础上分段粗调; c:选择DCOCTL.MODx的值进行细调。 实例: BCSCTL1 =CALBC1_8MHZ; //设定DCO为1MHZ DCOCTL = CALDCO_8MHZ; //CALBC1_XMHZ和CALDCO_XMHZ共8个数据保存在Flash信息存储器Segment段0x10F8~0x10FF地址中。共可设置1,8,12,16MHZ。 (2)VLOCLK,内部低频振荡器,12kHz标准振荡器 } } void 时钟系统(四个时钟源可分成三个时钟系统) { (1)ACLK,Auxiliary Clock,辅助时钟,通常由LFXT1CLK或VLOCLK作为时钟源,可以通过软件控制更改时钟的分频系数; 供外围模块使用。并在使用前可以通过各模块的寄存器实现分频。 但ACLK只能由LFXT1进行1、2、4、8分频作为信号源。可以作为后台时钟用来唤醒CPU. (2)MCLK,Master Clock,系统主时钟单元,为系统内核提供时钟,它可以通过软件从四个时钟源选择; 其实就是CPU时钟 除了CPU运算使用此时钟以外,外围模块也可以使用。 MCLK可以选择任何一个振荡器所产生的时钟信号并进行1、2、4、8分频作为其信号源。 (3)SMCLK,Sub-Main Clock,系统子时钟,也是可以由软件选择时钟源。 供外围模块使用。并在使用前可以通过各模块的寄存器实现分频。 SMCLK可以XT2CLK或者DCOCLK振荡器所产生的时钟信号并进行1、2、4、8分频作为其信号源。 相关缩写 Basic Clock Module Registers(基础时钟寄存器) DCO control register DCOCTL Basic clock system control 1 BCSCTL1 Basic clock system control 2 BCSCTL2 Basic clock system control 3 BCSCTL3 SFR interrupt enable register 1 IE1 SFR interrupt flag register 1 IFG1 PUC复位后(就是默认情况),MCLK和SMCLK的信号源为DCO,DCO的振荡频率为800K或1MHZ。ACLK的信号源为LFXT1。 } void 时钟相关寄存器(完成频率的选择功能 四个寄存器) { (1)DCOCTL,DCO控制寄存器,地址为56H,初始值为60H(控制内部振荡器时钟) DCO2 DCO1 DCO0 MOD4 MOD3 MOD2 MOD1 MOD0 DCO0~DCO2: DCO Select Bit,定义了8种频率之一,而频率由注入直流发生器的电流定义。 MOD0~MOD4: Modulation Bit,频率的微调。 一般不需要DCO的场合保持默认初始值就行了。 (2)BCSCTL1 ,Basic Clock System Control 1,地址为57H,初始值为84H(用来设置ACLOCK) XT2OFF XTS DIVA1 DIVA0 XT5V RSEL2 RSEL1 RSEL0 RSEL0~RSEL2: 选择某个内部电阻以决定标称频率.0最低,7最高。 XT5V: 1. DIVA0~DIVA1:选择ACLK的分频系数。DIVA=0,1,2,3,ACLK的分频系数分别是1,2,4,8; XTS: 选择LFXT1工作在低频晶体模式(XTS=0)还是高频晶体模式(XTS=1)。 XT2OFF: 控制XT2振荡器的开启(XT2OFF=0)与关闭(XT2OFF=1)。 正常情况下把XT2OFF复位就可以了. (3)BCSCTL2,Basic Clock System Control 2,地址为58H,初始值为00H(用来设置MCLOCKSMCLOCK) SEM1 SELM0 DIVM1 DIVM0 SELS DIVS1 DIVS0 DCOR DCOR: Enable External Resistor. 0,选择内部电阻;1,选择外部电阻 DIVS0~DIVS1: DIVS=0,1,2,3对应SMCLK的分频因子为1,2,4,8 SELS: 选择SMCLK的时钟源, 0:DCOCLK; 1:XT2CLK/LFXTCLK. DIVM0~1: 选择MCLK的分频因子, DIVM=0,1,2,3对应分频因子为1,2,4,8. SELM0~1: 选择MCLK的时钟源, 0,1:DCOCLK, 2:XT2CLK, 3:LFXT1CLK 我用的时候一般都把SMCLK与MCLK的时钟源选择为XT2。(外部高速时钟) 其它: 1. LFXT1: 一次有效的PUC信号将使OSCOFF复位,允许LFXT1工作,如果LFXT1信号没有用作SMCLK或MCLK,可软件置OSCOFF关闭LFXT1. 2. XT2: XT2产生XT2CLK时钟信号,如果XT2CLK信号没有用作时钟MCLK和SMCLK,可以通过置XT2OFF关闭XT2,PUC信号后置XT2OFF,即XT2的关闭的。 3. DCO振荡器:振荡器失效时,DCO振荡器会自动被选做MCLK的时钟源。如果DCO信号没有用作SMCLK和MCLK时钟信号时,可置SCG0位关闭DCO直流发生器。 4. 在PUC信号后,由DCOCLK作MCLK的时钟信号,根据需要可将MCLK的时钟源另外设置为LFXT1或XT2,设置顺序如下: (1)清OSCOFF/XT2 (2)清OFIFG (3)延时等待至少50uS (4)再次检查OFIFG,如果仍置位,则重复(1)-(4)步,直到OFIFG=0为止。 (5)设置BCSCTL2的相应SELM。 MSP430内部含有晶体振荡器失效监测电路,当时钟信号丢失50us时,监测电路捕捉到振荡器失效。 监测LFXT1(工作在高频模式或低频模式)和XT2输出的时钟信号, 若失效,分别为LFXT1OF和XT2OF置位,振荡器失效标志位OFIFG置位。 如果MCLK信号来自LFXT1或者XT2,那么MSP430自动把MCLK的信号切换为DCO,这样可以保证程序继续运行。 当测试到晶体振荡器失效(LFXT1OF或XT2OF)时,振荡器失效标志位OFIFG置位,并且锁定到POR。 当OFIFG置位,MCLK来自DCO,并且如果OFIE置位,那么产生非屏蔽中断。 中断得到响应后,OFIE自动复位。OFIFG必须软件清零。失效源可以通过测试各个失效位识别。 补充:POR(Power-On-Reset)是上电复位信号,它只在以下两个事件发生时产生: 1、芯片上电。 2、RST/NMI设置成复位模式,在RST/NMI引脚上出现低电平信号。(Non Maskable Interrupt)——不可屏蔽中断(即CPU不能屏蔽) POR信号的产生总会产生PUC(Power-UP-Clear)信号,但PUC信号的发生不会产生POR信号。PUC信号是上电清除信号,产生它的事件为: 1、发生POR信号。 2、处于看门狗模式下,看门狗定时时间到。 3、看门狗定时器写入错误的安全键值。 4、RST/NMI设置成NMI模式,在RST/NMI引脚上出现低电平信号, 5、FLASH存储器写入错误的安全键值。 } 实例分析 1、CPU运行在VLO时钟下:(VLO 内部慢速时钟) 这是最慢的时钟,在约12千赫兹下运行。因此,我们将通过可视化的LED闪烁的红色慢慢地在约每3秒钟率。我们可以让时钟系统默认这种状态,设置专门来操作VLO。我们将不使用任何ALCK外设时钟在此实验室工作,但你应该认识到,ACLK来自VLO时钟。 #include void main(void) { WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗定时器 P1DIR = 0x40; // P1.6 配置输出 P1OUT = 0; // 关闭LED BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO 选择低频震荡的来源 是32768 还是VLO IFG1 &= ~OFIFG; // 清除OSCFault 标志 OFIFG=0表示稳定 __bis_SR_register(SCG1 + SCG0); // 关闭 DCO BCSCTL2 |= SELM_3 + DIVM_3; // MCLK = VLO/8 while(1) { P1OUT = 0x40; // 开启LED _delay_cycles(100); P1OUT = 0; // 关闭 LED _delay_cycles(5000); } } 2、CPU运行在晶振(32768Hz)时钟下:(外部低速时钟) 晶体频率为32768赫兹,约3倍的VLO。如果我们在前面的代码中使用晶振,指示灯应闪烁大约每秒一次。你知道为什么32768赫兹是一个标准?这是因为这个数字是2的15次方,因此很容易用简单的数字计数电路,以每秒一次获得率 ——手表和其他时间时基。认识到ACLK来自外部晶振时钟。 #include void main(void) { WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗定时器 P1DIR = 0x41; // P1.0 和P1.6配置输出 P1OUT = 0x01; // 开启P1.0 BCSCTL3 |= LFXT1S_0; // LFXT1 = 32768Hz 晶振 while(IFG1 & OFIFG) { IFG1 &= ~OFIFG; // 清除 OSCFault 标志 外部晶振 等待50us震稳 OFIFG=0表示稳定 _delay_cycles(100000); // 为可见的标志延时 } P1OUT = 0; // 关闭P1 __bis_SR_register(SCG1 + SCG0); // 关闭 DCO BCSCTL2 |= SELM_3 + DIVM_3; // MCLK = 32768/8 while(1) { P1OUT = 0x40; // 开启 LED _delay_cycles(100); P1OUT = 0; //关闭LED _delay_cycles(5000); } } 3、CPU运行在晶振(32768Hz)和DCO时钟下: 最慢的频率,我们可以运行DCO约在1MHz(这也是默认速度)。因此,我们将开始切换MCLK到DCO下。在大多数系统中,你会希望ACLK上运行的VLO或32768赫兹晶振。由于ACLK在我们目前的代码是在晶体上运行,我们会打开DCO计算。 #include void main(void) { WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗定时器 if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF) { //上面是出场校准DCO的数据,存在FALSH的信息存储区,这个就是检测FLASH中是否还存在出场校准的时钟数据,因为FLASH擦除后是1,所以0xFF就代表已经被擦除了 while(1); // If cal const erased, 挂起 } BCSCTL1 = CALBC1_1MHZ; // Set range DCOCTL = CALDCO_1MHZ; //设置DCO模式 P1DIR = 0x41; // P1.0 和P1.6配置输出 P1OUT = 0x01; // P1.0 开启 BCSCTL3 |= LFXT1S_0; // LFXT1 = 32768Hz 选择低频震荡的来源 是32768 还是VLO while(IFG1 & OFIFG) { IFG1 &= ~OFIFG; // 清除OSCFault 标志 外部晶振 等待50us震稳 OFIFG=0表示稳定 _delay_cycles(100000); // 为可见标志延时 } P1OUT = 0; // P1.6 关闭 // __bis_SR_register(SCG1 + SCG0); // 关闭DCO BCSCTL2 |= SELM_0 + DIVM_3; // MCLK = DCO while(1) { P1OUT = 0x40; // P1.6 开启 _delay_cycles(100); P1OUT = 0; //P1.6 关闭 _delay_cycles(5000); } } 4、CPU运行在DCO时钟下:(内部高速时钟) 最慢的频率,我们可以运行DCO约在1MHz(这也是默认速度)。因此,我们将开始切换MCLK到DCO下。在大多数系统中,你会希望在VLO或者是晶振下运行ACLK。由于ACLK在我们目前的代码是在VLO上运行,我们会打开DCO运行。 #include void main(void) { WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗定时器 if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF) { //上面是出场校准DCO的数据,存在FALSH的信息存储区,这个就是检测FLASH中是否还存在出场校准的时钟数据,因为FLASH擦除后是1,所以0xFF就代表已经被擦除了 while(1); // If cal const erased,挂起 } BCSCTL1 = CALBC1_1MHZ; // Set range DCOCTL = CALDCO_1MHZ; // 设置DCO模式 P1DIR = 0x40; // P1.6 配置输出 P1OUT = 0; // P1关闭 BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO 选择低频震荡的来源 是32768 还是VLO IFG1 &= ~OFIFG; // 清除 OSCFault 标志 //__bis_SR_register(SCG1 + SCG0); // 关闭DCO BCSCTL2 |= SELM_0 + DIVM_3; // MCLK = DCO/8 while(1) { P1OUT = 0x40; // P1.6 关闭 _delay_cycles(100); P1OUT = 0; // P1.6 开启 _delay_cycles(5000); } } } 端口模块: void 端口输入输出 { (1)输出流程: P1DIR|=BIT0; //设置为输出 P1OUT|=BIT0; //P1.0输出高 (2)输入流程: PIDIR&=~BIT0; //设置为输入 P1REN|=BIT0; //使用上拉下拉电阻模式 P1OUT|=BIT0; //设置为上拉电阻方式 //P1OUT&=~BIT0; //设置为下拉电阻方式 P1IES|=BIT3;//选择输入中断触发方式 边沿触发 0上升沿 1 下降沿 无电平触发 P1IFG&=~BIT3; //清楚中断标志 P1IE|=BIT3; //启动输入中断使能 以下为中断处理函数 的格式 写在main函数结束后的下面 void main() { .......; } //中断函数的格式 #pragma vector=PORT1_VECTOR //中断向量填写,vector 右边填写相应触发中断,下接对应中断向量的中断处理 __interrupt void PORT_1(void)// __interrupt void类型 函数名 () { P1IFG&=~BIT3; //清楚中断标志 .......; //add your code here! } 中断模式和扫描模式: 实例代码: #include //输入为中断模式 void main(void) { WDTCTL=WDTPW+WDTHOLD; P1DIR|=BIT0; P1IE|=BIT3; //启动输入中断使能 P1IES|=BIT3;//选择输入中断触发方式 边沿触发 0上升沿 1 下降沿 无电平触发 P1REN|=BIT3; P1OUT|=BIT3; P1IFG&=~BIT3;//按键输入中断标志清零 __enable_interrupt(); //启用全部中断 while(1); } #pragma vector=PORT1_VECTOR //中断向量填写,下接对应中断向量的中断处理 __interrupt void PORT_1(void)// __interrupt void类型 函数名 () 是格式 { P1IFG&=~BIT3; while((P1IN&BIT3)==0); //松手检测 P1OUT^=BIT0; } (3)使用引脚第二功能: 由P1SEL.X P1SEL2.X USIP.X JTAG MODE CAPD.Y ADC10AE.X 共同决定 JATG 是用TEST 和 RST引脚来实现下载调试的 区别于单片机的串口 (1)串口模块: 操作流程 #include #define uchar unsigned char #define uint unsigned int void delay(uchar x) { uchar a,b; for(a=x;a>0;a--) for(b=100;b>0;b--); } void uart_init() { UCA0CTL1|= UCSWRST;//表示正在配置串口寄存器 //UCA0CTL0|=UCMSB; UCA0CTL1|=UCSSEL_2; UCA0BR0=104; //波特率为9600 UCA0BR1=0;//波特率为9600 UCA0MCTL=UCBRS0; P1SEL|=BIT1+BIT2; //将P1.1 P1.2设为第二功能 P1SEL2 = BIT1 + BIT2; //将P1.1 P1.2设为第二功能 UCA0CTL1&=~UCSWRST;//串口寄存器配置完毕,以后便不可写入,除非重新打开 UCA0CTL1|= UCSWRST; IE2|=UCA0RXIE;//开启接收中断 注倘若开启了发送中断,必须写发送中断处理函数 中断后清除中断标志 否则程序死掉 } //以下为发送一个字符的程序 void send(uchar c) { UCA0TXBUF=c; while(!(IFG2&UCA0TXIFG)); IFG2&=~UCA0TXIFG; } //以下为发送一个字符串的程序 void Uart0Sends(char *s) { while(*s!='\0') { UCA0TXBUF=*s; while((IFG2&UCA0TXIFG)==0); //查询发送是否结束 IFG2&=~UCA0TXIFG; //清除发送一标志位 s++; } } void port_init() { P1DIR&=~BIT3; //设置方向为输出 P1REN|=BIT3;//使用拉电阻模式 P1OUT|=BIT3;//选择上拉 P1IES|=BIT3;//触发方式为下降沿 P1IFG&=~BIT3;//清楚中断标志 P1IE|=BIT3;//输入中断使能 } void main() { WDTCTL=WDTPW+WDTHOLD; //关闭看门狗 DCOCTL=CALDCO_1MHZ; //将DCO设为1mhz BCSCTL1=CALBC1_1MHZ; //将DCO设为1mhz uart_init(); //初始化串口 port_init(); //初始化端口 _BIS_SR(GIE); //启用全部中断 while(1) { Uart0Sends("b"); delay(20); } } #pragma vector=USCIAB0RX_VECTOR //串口接收中断 __interrupt void get() { while(!(IFG2&UCA0RXIFG)); //标志位变 1 接收完成 uchar c; c=UCA0RXBUF; //接收字符 IFG2&=~UCA0RXIFG; //清除接收中断标志 //UCA0TXBUF=c; // 改用简单的延时 同时清楚发送标志位 //IFG2&=~UCA0TXIFG; send(c); send('m'); } #pragma vector=PORT1_VECTOR __interrupt void key() { send('k'); send('e'); send('y'); P1IFG&=~BIT3; } } 定时器模块: 实例代码: #include void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer if (CALBC1_1MHZ == 0xFF || CALDCO_1MHZ == 0xFF) { while(1); // If calibration constants erased, trap CPU!! } BCSCTL1 = CALBC1_1MHZ; // Set range DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO IFG1 &= ~OFIFG; // Clear OSCFault flag 使用外部晶振 最好加上等待起震 BCSCTL1 |= DIVA_3; // ACLK = VLO/8 BCSCTL2 |= SELM_3 + DIVM_3 + DIVS_3; // MCLK = DCO/8, SMCLK = DCO/8 P1DIR = 0x40; // P1.6 output (green LED) P1OUT = 0; // LED off //TACTL = TASSEL_2 + MC_1; // SMCLK, UP mode TACTL = TASSEL_1 + MC_1; // ACLK, UP mode 设置定时器时钟来源 CCR0 = 5100;//Timer count 5100 定时器定时时间 CCR1 = 2000;//Timer count 100 //比较器参数 CCTL0 = CCIE; //interrupt enabled 定时器使能 //CCTL1 = CCIE; //interrupt enabled 比较器使能 _BIS_SR(LPM0_bits + GIE);//Enter Low Power Mode //进入CPUOFF 模式 打开总中断 for(;;); } // Timer A0 interrupt service routine #pragma vector=TIMER0_A0_VECTOR //定时器中断 __interrupt void Timer_A0 (void) { P1OUT |= BIT6; // P1.6 output High } // Timer_A2 Interrupt Vector (TA0IV) handler #pragma vector=TIMER0_A1_VECTOR//比较器中断 __interrupt void Timer_A1(void) { switch( TA0IV ) //TA0IV=TAIV 比较器标志位 { case 2: P1OUT &= ~BIT6;break;// P1.6 output Low //为2为 CCR1中断 case 4: break; //为4为CCR2中断 case 10: //为10为溢出中断 default : } } } 比较器模块: {实例代码: #include /***************************************************** * 函数名: compare_init() * 功能: 电压比较器 初始化 **************************************************/ void compare_init() { CACTL1 =CARSEL+CAON+CAREF_2; // CAEX=0 CARSEL =1 比较器 为反向比较 阈值为0.5vcc 打开比较器 CACTL2 =P2CA0; //设置比较输入口 P1.0为COMP+ //CAPD |=CAPD0; //断开与IO的输入 } /***************************************************** * 函数名: compare() * 功能: 电压比较器 功能函数 **************************************************/ int compare() { if((CACTL2 | 0xFE)==0xFF) //CACTL2 COUT 置1 { CACTL1 &= 0xfe; // CAIFG = 0 return 1; } else return 0; } void main() { compare_init() ; P1DIR|=BIT6; //写完之后默认输出1 P1OUT=0; while(1) { if(compare()) P1OUT|=BIT6; else P1OUT&=~BIT6; } } AD采集: #include #include #include void delay_1ms(void); void delay_nus(unsigned int n); void delay_nms(unsigned int n); void lcd_diaoyong(); void lcd_diaoyong1(); void uart_init() { UCA0CTL1|= UCSWRST;//表示正在配置串口寄存器 //UCA0CTL0|=UCMSB; UCA0CTL1|=UCSSEL_2; UCA0BR0=104; //波特率为9600 UCA0BR1=0;//波特率为9600 UCA0MCTL=UCBRS0; P1SEL|=BIT1+BIT2; //将P1.1 P1.2设为第二功能 P1SEL2 = BIT1 + BIT2; //将P1.1 P1.2设为第二功能 UCA0CTL1&=~UCSWRST;//串口寄存器配置完毕,以后便不可写入,除非重新打开 UCA0CTL1|= UCSWRST; IE2|=UCA0RXIE;//开启接收中断 注倘若开启了发送中断,必须写发送中断处理函数 中断后清除中断标志 否则程序死掉 } void send(unsigned char c) { UCA0TXBUF=c; while(!(IFG2&UCA0TXIFG)); IFG2&=~UCA0TXIFG; } unsigned int j=0,i=0; unsigned int shuzhi=0,qushu=0; void main() { WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗 DCOCTL=CALDCO_1MHZ; //将DCO设为1mhz BCSCTL1=CALBC1_1MHZ; //将DCO设为1mhz ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled 采样、保持时间设置 ,ADC10开关,ADC中断使能 ADC10CTL1 = INCH_1; // input A1模拟信号输入选择通道A1即p1.1 ADC10AE0 |= 0x02; // PA.1 ADC option select使p1.1允许AD模拟输入信号 P1DIR |= 0x01; // Set P1.0 to output direction TA0CCTL0 = CCIE; // CCR0 1ms中断 TA0CCR0 = 312; TA0CTL = TASSEL_2 + MC_1; // SMCLK, upmode //_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt TA1CCTL0 = CCIE; // CCR0 1ms中断 TA1CCR0 = 31200; TA1CTL = TASSEL_2 + MC_1; // SMCLK, upmode uart_init(); _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt while(1); } #pragma vector=TIMER0_A0_VECTOR __interrupt void Timer0_A (void) { ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start开始转换 qushu=ADC10MEM; send(qushu/256); send(qushu%256); delay_1ms(); j++; __bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exit __bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR) } #pragma vector=TIMER1_A0_VECTOR __interrupt void Timer1_A (void) { P1OUT ^= 0x01; __bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR) } #pragma vector=ADC10_VECTOR __interrupt void ADC10_ISR(void) { __bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR) } void delay_1us(void) { asm("nop"); } void delay_nus(unsigned int n) { unsigned int i; for (i=0;i