/*实验一、看门狗操作*/ /*程序:2274 学习板\example_code\2274_C\WDT_Operation\WDT_timer*/ int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; //选择定时模式,并选时钟源为ACLK,即定时时间为ACLK/32768(WDTISx=0) WDTCTL=WDTPW+WDTTMSEL+WDTSSEL+WDTCNTCL; P1OUT |=BIT0; //LED 使能 P1DIR |=BIT0; IE1 |=WDTIE; //使能WDT 定时中断 _BIS_SR(GIE+LPM3_bits); //进入LPM3 模式,ACLK(WDT 时钟源)仍工作,并使能总中断 return 0; } #pragma vector=WDT_VECTOR //看门狗定时中断服务 __interrupt void wdt_timer(void) { P1OUT ^=BIT0; //LED 翻转 } /*********************************************************/ int main( void ) { BCSCTL1 =CALBC1_1MHZ; //设定DCO为1MHZ DCOCTL =CALBC1_1MHZ; P1OUT &=~BIT0; //LED 灭 P1DIR |=BIT0; if(WDTIFG&IFG1) { P1OUT |=BIT0; //如果看门狗溢出LED亮 } else { P1OUT &=~BIT0; } while(1); return 0; } /*实验二、16 位定时器Timer_A 操作*/ /**********(一)定时器A 比较模式*************/ int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; P1DIR |=BIT0; //LED 使能 TACTL=TASSEL1+TACLR; //定时器A 时钟源为SMCLK,并清TAR CCTL0 |=CCIE; //CCR0 中断使能 CCR0 =50000; //计数值为50000 个SMCLK 周期 TACTL |=MC1; //启动定时器A 为连续计数模式 _BIS_SR(GIE+CPUOFF); return 0; } #pragma vector = TIMERA0_VECTOR //ccr0 中断服务 __interrupt void ta0_isr(void) { P1OUT ^=BIT0; //LED 翻转 CCR0 +=50000; //定时补偿 } /**********(二)定时器A 捕获模式************/ volatile unsigned int cap_value; //存两次捕值之差 int main( void ) { volatile unsigned int first_value,second_value,n; WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_8MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_8MHZ; BCSCTL1 |=DIVA_3; //ACLK 输入八分频 do //等待晶振稳定 { IFG1 &=~OFIFG; for(n=5000;n>0;n--); } while(OFIFG&IFG1); TACCTL2=CM1+CCIS_1+CAP; //捕获模式,捕获上升沿,捕获内部ACLK TACTL=TASSEL_2+MC_2+TACLR; //定时器时钟源为SMCLK,启动连续计数,清TAR TACCTL2 &=~CCIFG; //清CCR2 的标志位 while(!(CCIFG&TACCTL2)); //查CCR2 标志位 first_value=TACCR2; //第一个捕获值存入first_value TACCTL2 &=~CCIFG; //清CCR2 的标志位 while(!(CCIFG&TACCTL2)); //查CCR2 标志位 second_value=TACCR2; //第二个捕获值存入second_value TACCTL2 &=~CCIFG; //清CCR2 的标志位 TACCTL2 &=~MC1; //关定时器A cap_value=(second_value-first_value); return 0; } /************(三)定时器PWM 输出程序*****************/ int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; TACTL=TASSEL1+TAR; //SMCLK 为时钟源,清TAR CCR0=512; //设定PWM 周期 CCTL1 |=OUTMOD_7; //CCR1 输出为reset/set 模式 CCR1=384; //CCR1 的PWM 占空比设定 CCTL2 |=OUTMOD_7; //CCR2 输出为reset/set 模式 CCR2=128; //CCR2 的PWM 占空比设定 P1SEL |=BIT2+BIT3; //TA1,TA2 输出功能 P1DIR |=BIT2+BIT3; TACTL |=MC0; //启动定时器A 增计数模式 _BIS_SR(CPUOFF); return 0; } /*实验三、ADC10 操作*/ /******************(一)ADC10 测量单通道单次模式**************/ float ad_value; float temp_value; int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; ADC10CTL1=INCH_10; //选择第10 通道,为片内温度传感器 ADC10CTL0=REFON+SREF_1; //打开1.5V 正参考,地为负参考 ADC10CTL0 |=ADC10ON+ADC10SHT_3+ADC10IE; //打开ADC10 内核,设定采样保持时间为64 个ADC10CLK,使能ADC10 中断 ADC10CTL0 |=ENC+ADC10SC; //启动AD 转换 _BIS_SR(GIE+CPUOFF); //开总中断并进入低功耗 temp_value=((ad_value*1.5/1023)-0.986)/0.0035; //计算温度 return 0; } #pragma vector = ADC10_VECTOR //ADC10 中断服务 __interrupt void adc_isr(void) { ad_value=ADC10MEM; //将AD 采样值存入ad_value _BIC_SR_IRQ(CPUOFF); //退出低功耗0 } /****************(二)ADC10 测量单通道多次模式******************/ volatile unsigned int ad_value[10]; int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; //时钟源选AD 内部时钟并4 分频,选通道10,AD 启动信号来源选TA.OUT1,选单通道连续采样 ADC10CTL1=ADC10DIV_3+INCH_10+SHS_1+CONSEQ_2; //选1.5V 为正向参考,地为负参考,AD 中断使能,打开参考,启动AD 模块(不是启动AD 转换) ADC10CTL0=SREF_1+ADC10SHT_3+ADC10IE+REFON+ADC10ON; TACCR0=30; //延时等待参考稳定 TACCTL0 |=CCIE; //CCR0 中断使能 TACTL=TACLR+MC_1+TASSEL_2; //TA 增计数,时钟源为smclk _BIS_SR(LPM0_bits+GIE); //进入低功耗0,使能总中断,等待参考稳定 TACCTL0 &=~CCIE; //CCR0 中断禁止 _BIC_SR(GIE); //关总中断 ADC10CTL0 |=ENC; //AD 转换使能 TACCTL1=OUTMOD_4; //CCR1 选输出模式4,当TAR=0 时,输出高电平 TACTL =TASSEL_2+MC_2; //TA 改为连续计数,smclk 时钟源 _BIS_SR(LPM0_bits+GIE); //进入低功耗0,使能总中断,等待10AD 完成 _NOP(); return 0; } #pragma vector = TIMERA0_VECTOR //TA0 中断服务,用来参考稳定 __interrupt void ta0_isr(void) { TACTL=0; //关TA _BIC_SR_IRQ(LPM0_bits); //退出低功耗 } #pragma vector = ADC10_VECTOR //ADC10 中断服务 __interrupt void adc_isr(void) { static char i=0; ad_value[i]=ADC10MEM; //保存AD 结果 i++; if(i==10) //作10 次AD _BIC_SR_IRQ(LPM0_bits+GIE); //退出低功耗 } /*=================实验四、OA 操作==================*/ /********************(一)OA 模式2——电压跟随器******************/ int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; P2SEL |=BIT0+BIT1; //P2.0,2.1 第二功能选择 P2OUT |=BIT1; //p2.1,OA0 输出端(不加也没关系) OA0CTL0=OAP_0+OAPM_3+OAADC1; //OAP 选择OA0I0 输入,反馈速度为fast,输 出为A1,A3 或者A5 OA0CTL1=OAFBR_1+OAFC_2; //R2/R1=4R/16R,反馈电阻为4R //OA0CTL1=OAFBR_2+OAFC_2; //R2/R1=8R/8R,反馈电阻为8R //OA0CTL1=OAFBR_3+OAFC_2; //R2/R1=10R/6R,反馈电阻为10R //OA0CTL1=OAFBR_4+OAFC_2; //R2/R1=12R/4R,反馈电阻为12R //OA0CTL1=OAFBR_5+OAFC_2; //R2/R1=13R/3R,反馈电阻为13R //OA0CTL1=OAFBR_6+OAFC_2; //R2/R1=14R/2R,反馈电阻为14R //OA0CTL1=OAFBR_7+OAFC_2; //R2/R1=15R/1R,反馈电阻为15R _NOP(); _BIS_SR(LPM3_bits); //进入低功耗3 _NOP(); return 0; } /******************(二)OA 模式3——比较器***********/ int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; P2SEL |=BIT0+BIT1; P2OUT |=BIT1; OA0CTL0=OAP_0+OAPM_3+OAADC1; //OAP 选择OA0I0 输入,反馈速度为fast,输出// 为 A1,A3 或者A5 OA0CTL1=OAFBR_1+OAFC_3; //运放反向端输入为4/16AVcc;比较器模式 //OA0CTL1=OAFBR_2+OAFC_3; //运放反向端输入为8/16AVcc;比较器模式 //OA0CTL1=OAFBR_3+OAFC_3; //运放反向端输入为10/16AVcc;比较器模式 //OA0CTL1=OAFBR_4+OAFC_3; //运放反向端输入为12/16AVcc;比较器模式 //OA0CTL1=OAFBR_5+OAFC_3; //运放反向端输入为13/16AVcc;比较器模式 //OA0CTL1=OAFBR_6+OAFC_3; //运放反向端输入为14/16AVcc;比较器模式 //OA0CTL1=OAFBR_7+OAFC_3; //运放反向端输入为16/16AVcc;比较器模式 _NOP(); _BIS_SR(LPM3_bits); //进入低功耗3 _NOP(); return 0; } /************(三)OA 模式4——同相比例放大器****************/ int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; P2SEL |=BIT0+BIT1; //P2.0,2.1 第二功能选择 P2OUT |=BIT1; //p2.1,OA0 输出端(不加也没关系) OA0CTL0=OAP_0+OAPM_3+OAADC1; //OAP 选择OA0I0 输入,反馈速度为fast,输 出为A1,A3 或者A5 OA0CTL1=OAFBR_0+OAFC_4; //R2/R1=0R/16R,模式4(同向比例放大器,放 大系数=1+R2/R1) OA0CTL1=OAFBR_1+OAFC_4; //R2/R1=4R/12R OA0CTL1=OAFBR_2+OAFC_4; //R2/R1=8R/8R OA0CTL1=OAFBR_3+OAFC_4; //R2/R1=10R/6R OA0CTL1=OAFBR_4+OAFC_4; //R2/R1=12R/4R OA0CTL1=OAFBR_5+OAFC_4; //R2/R1=13R/3R OA0CTL1=OAFBR_6+OAFC_4; //R2/R1=14R/2R OA0CTL1=OAFBR_7+OAFC_4; //R2/R1=15R/1R _NOP(); _BIS_SR(LPM3_bits); //进入低功耗3 _NOP(); return 0; } /******************(四)OA 模式4、5——二次同相放大*****************/ volatile unsigned int adc_value; int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; P2SEL |=BIT0+BIT1+BIT3+BIT4; //P2.0,2.1,2,3 第二功能选择OA0I0 输入 P2OUT |=BIT3; //p2.3,OA1 输出端(不加也没关系) //设置OA0 为模式4 OA0CTL0=OAP_0+OAPM_3; //OAP 选择OA0I0 输入,反馈速度为fast,OA0OUT 输出内 部路由 OA0CTL1=OAFBR_2+OAFC_4; //选择模式4,放大比例系数为1+8R/8R //设置OA1 为模式5 OA1CTL0=OAP_3+OAPM_3+OAADC1; //正端由内部OA0 输出输入,反馈速度为fast,输出到A3 OA1CTL1=OAFBR_2+OAFC_5; //选择模式5,放大比例系数为1+8R/8R //对OA1 的输出信号进行AD ADC10CTL1=INCH_3; //选择第3 通道 ADC10CTL0=REFON+SREF_1+REF2_5V; //打开2.5V 正参考,地为负参考 ADC10CTL0 |=ADC10ON+ADC10SHT_3+ADC10IE; //打开ADC10 内核,设定采样保持时间为64 个ADC10CLK,使能ADC10 中断 ADC10CTL0 |=ENC+ADC10SC; //启动AD 转换 _BIS_SR(GIE); //使能总中断 _NOP(); return 0; } #pragma vector=ADC10_VECTOR __interrupt void adc_isr(void) { adc_value=ADC10MEM; //将AD 值存入adc_value _NOP(); } /*==================实验五、USCI 模块操作====================*/ /************(一)USCI_A0 模块UART 模式***************/ __no_init char send_data[256] @ 0x0400; //数据存储首地址为0x0400 int main( void ) { WDTCTL =WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; volatile unsigned int n; do //等待晶振稳定 { IFG1 &=~OFIFG; for(n=5000;n>0;n--); } while(OFIFG&IFG1); P1DIR |=BIT0; //点亮LED P1OUT |=BIT0; P3SEL |=BIT4+BIT5; //p3.4 为TX,P3.5 为RX P3DIR |=BIT4; //P3.4 为输出方向 //UCA0STAT |=UCLISTEN; //调试时用于自发自收 UCA0CTL1 |=UCSSEL0; //时钟源选择32768 晶振 UCA0BR1=0; //设置波特率32768/1200=27.3 UCA0BR0=27; UCA0MCTL |=UCBRS1; //UCBRSx=INT(0.3*8)=2 UCA0CTL1 &=~UCSWRST; //退出USCI 设置 IE2 |=UCA0RXIE+UCA0TXIE; //使能收发中断 _BIS_SR(LPM3_bits+GIE); //进入低功耗3 并使能总中断 _NOP(); return 0; } #pragma vector =USCIAB0RX_VECTOR __interrupt void rx_isr(void) { static char i=0; P1OUT ^=BIT0; //如果作为接收方,每收一帧LED 翻转一次 send_data[i]=UCA0RXBUF; //将收到的数据放入0x0400 开始的RAM 地址 if(i==255) //比较是否已经收到了256 个数据 { i=0; //接收了256 个后,再从0x0400 开始放数据 } else { i++; } } #pragma vector =USCIAB0TX_VECTOR __interrupt void tx_isr(void) { static char j=0; P1OUT ^=BIT0; //如果作为接收方,每收一帧LED 翻转一次 unsigned int x; for(x=0;x<15000;x--); //在发送前一段延时,确保对方已经处理完上一帧数据 UCA0TXBUF=j; //将待发数据放入发送缓存寄存器中 j++; } /*****************实验三、FLASH 读写擦操作******************/ #define SEGD_START 0x1000 #define SEGC_START 0x1040 void erase_seg(unsigned int); void write_seg(unsigned int); void copy_d_to_c(void); void sega_op(void); int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; erase_seg(SEGD_START); //擦除信息段D write_seg(SEGD_START); //写住信息段D copy_d_to_c(); //将数据从信息段D 复制到段C //FCTL3=FWKEY+LOCKA; //复位LOCKA sega_op(); //对LOCKA 进行反向操作 return 0; } void erase_seg(unsigned int erase) //段擦除子程序 { char * seg_ptr; seg_ptr=(char *)erase; //指向段地址 FCTL2=FWKEY+FSSEL1+FN1; //flash 时钟源为SMCLK,f(FTG)=SMCLK/3 FCTL3=FWKEY; //复位LOCK FCTL1=FWKEY+ERASE; //段擦除使能 *seg_ptr=0; //空写启动 FCTL3=FWKEY+LOCK; //置位LOCK } void write_seg(unsigned int write) //段写子程序 { char write_value; char * write_addr=(char *)write; //指向段首地址 FCTL3=FWKEY; //复位LOCK FCTL1=FWKEY+WRT; //写使能 for(write_value=0;write_value<64;write_value++) { (*write_addr++)=write_value; //循环写入 } FCTL3=FWKEY+LOCK; //置位LOCK } void copy_d_to_c(void) //段复制程序 { char n; char * segd=(char *)SEGD_START; //segd 指向D 段首地址 char * segc=(char *)SEGC_START; //segc 指向C 段首地址 erase_seg(SEGC_START); //先擦除信息段C FCTL3=FWKEY; //复位LOCK FCTL1=FWKEY+WRT; //写使能 for(n=0;n<64;n++) { *segc++=*segd++; //循环复制 } FCTL3=FWKEY+LOCK; //置位LOCK } void sega_op(void) //LOCKA 位开关 { if(LOCKA&FCTL3) { FCTL3=FWKEY+LOCKA; } else { FCTL3=FWKEY+LOCKA; } } /*************实验二、时钟模块操作**************************/ int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 #if(DCO_FREQUENCY==1) BCSCTL1=CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL=CALDCO_1MHZ; #elif (DCO_FREQUENCY==8) BCSCTL1=CALBC1_8M; //设定DCO 为8MHZ DCOCTL=CALDCO_8MHZ; #elif (DCO_FREQUENCY=12) BCSCTL1=CALBC1_12MHZ; //设定DCO 为12MHZ DCOCTL=CALDCO_12MHZ; #elif (DCO_FREQUENCY=16) BCSCTL1=CALBC1_16MHZ; //设定DCO 为16MHZ DCOCTL=CALDCO_16MHZ; #endif P1SEL |=BIT4; //P1.4 输出SMCLK P1DIR |=BIT4; P2SEL |=BIT0+BIT1; //P2.1 输出SMCLK,P2.0 输出ACLK P2DIR |=BIT0+BIT1; #ifdef ACLK_VLOCLK BCSCTL3 |=LFXT1S1; //ACLK 来源VLO #endif #ifdef SMCLK_LFC BCSCTL2 |=SELS; //SMCLK 来源LFC(LFXT1CLK 或VLOCLK 由ACLK_VLOCLK 决定) #endif #ifdef MCLK_XT2_OR_LFC //MCLK 时钟源选择设定 BCSCTL2 |=SELM1; #endif return 0; } /*********************实验一、I/O 端口操作***********************/ int main( void ) { volatile unsigned int i; WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; P1DIR |=BIT0; //P1.0 为输出方式 P1OUT |=BIT0; while(1) { for(i=5000;i>0;i--); //延时 P1OUT ^=BIT0; //LED 翻转 } return 0; } /*实验一、看门狗操作*/ /*程序:2274 学习板\example_code\2274_C\WDT_Operation\WDT_timer*/ int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; //选择定时模式,并选时钟源为ACLK,即定时时间为ACLK/32768(WDTISx=0) WDTCTL=WDTPW+WDTTMSEL+WDTSSEL+WDTCNTCL; P1OUT |=BIT0; //LED 使能 P1DIR |=BIT0; IE1 |=WDTIE; //使能WDT 定时中断 _BIS_SR(GIE+LPM3_bits); //进入LPM3 模式,ACLK(WDT 时钟源)仍工作,并使能总中断 return 0; } #pragma vector=WDT_VECTOR //看门狗定时中断服务 __interrupt void wdt_timer(void) { P1OUT ^=BIT0; //LED 翻转 } /*********************************************************/ int main( void ) { BCSCTL1 =CALBC1_1MHZ; //设定DCO为1MHZ DCOCTL =CALBC1_1MHZ; P1OUT &=~BIT0; //LED 灭 P1DIR |=BIT0; if(WDTIFG&IFG1) { P1OUT |=BIT0; //如果看门狗溢出LED亮 } else { P1OUT &=~BIT0; } while(1); return 0; } /*实验二、16 位定时器Timer_A 操作*/ /**********(一)定时器A 比较模式*************/ int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; P1DIR |=BIT0; //LED 使能 TACTL=TASSEL1+TACLR; //定时器A 时钟源为SMCLK,并清TAR CCTL0 |=CCIE; //CCR0 中断使能 CCR0 =50000; //计数值为50000 个SMCLK 周期 TACTL |=MC1; //启动定时器A 为连续计数模式 _BIS_SR(GIE+CPUOFF); return 0; } #pragma vector = TIMERA0_VECTOR //ccr0 中断服务 __interrupt void ta0_isr(void) { P1OUT ^=BIT0; //LED 翻转 CCR0 +=50000; //定时补偿 } /**********(二)定时器A 捕获模式************/ volatile unsigned int cap_value; //存两次捕值之差 int main( void ) { volatile unsigned int first_value,second_value,n; WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_8MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_8MHZ; BCSCTL1 |=DIVA_3; //ACLK 输入八分频 do //等待晶振稳定 { IFG1 &=~OFIFG; for(n=5000;n>0;n--); } while(OFIFG&IFG1); TACCTL2=CM1+CCIS_1+CAP; //捕获模式,捕获上升沿,捕获内部ACLK TACTL=TASSEL_2+MC_2+TACLR; //定时器时钟源为SMCLK,启动连续计数,清TAR TACCTL2 &=~CCIFG; //清CCR2 的标志位 while(!(CCIFG&TACCTL2)); //查CCR2 标志位 first_value=TACCR2; //第一个捕获值存入first_value TACCTL2 &=~CCIFG; //清CCR2 的标志位 while(!(CCIFG&TACCTL2)); //查CCR2 标志位 second_value=TACCR2; //第二个捕获值存入second_value TACCTL2 &=~CCIFG; //清CCR2 的标志位 TACCTL2 &=~MC1; //关定时器A cap_value=(second_value-first_value); return 0; } /************(三)定时器PWM 输出程序*****************/ int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; TACTL=TASSEL1+TAR; //SMCLK 为时钟源,清TAR CCR0=512; //设定PWM 周期 CCTL1 |=OUTMOD_7; //CCR1 输出为reset/set 模式 CCR1=384; //CCR1 的PWM 占空比设定 CCTL2 |=OUTMOD_7; //CCR2 输出为reset/set 模式 CCR2=128; //CCR2 的PWM 占空比设定 P1SEL |=BIT2+BIT3; //TA1,TA2 输出功能 P1DIR |=BIT2+BIT3; TACTL |=MC0; //启动定时器A 增计数模式 _BIS_SR(CPUOFF); return 0; } /*实验三、ADC10 操作*/ /******************(一)ADC10 测量单通道单次模式**************/ float ad_value; float temp_value; int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; ADC10CTL1=INCH_10; //选择第10 通道,为片内温度传感器 ADC10CTL0=REFON+SREF_1; //打开1.5V 正参考,地为负参考 ADC10CTL0 |=ADC10ON+ADC10SHT_3+ADC10IE; //打开ADC10 内核,设定采样保持时间为64 个ADC10CLK,使能ADC10 中断 ADC10CTL0 |=ENC+ADC10SC; //启动AD 转换 _BIS_SR(GIE+CPUOFF); //开总中断并进入低功耗 temp_value=((ad_value*1.5/1023)-0.986)/0.0035; //计算温度 return 0; } #pragma vector = ADC10_VECTOR //ADC10 中断服务 __interrupt void adc_isr(void) { ad_value=ADC10MEM; //将AD 采样值存入ad_value _BIC_SR_IRQ(CPUOFF); //退出低功耗0 } /****************(二)ADC10 测量单通道多次模式******************/ volatile unsigned int ad_value[10]; int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; //时钟源选AD 内部时钟并4 分频,选通道10,AD 启动信号来源选TA.OUT1,选单通道连续采样 ADC10CTL1=ADC10DIV_3+INCH_10+SHS_1+CONSEQ_2; //选1.5V 为正向参考,地为负参考,AD 中断使能,打开参考,启动AD 模块(不是启动AD 转换) ADC10CTL0=SREF_1+ADC10SHT_3+ADC10IE+REFON+ADC10ON; TACCR0=30; //延时等待参考稳定 TACCTL0 |=CCIE; //CCR0 中断使能 TACTL=TACLR+MC_1+TASSEL_2; //TA 增计数,时钟源为smclk _BIS_SR(LPM0_bits+GIE); //进入低功耗0,使能总中断,等待参考稳定 TACCTL0 &=~CCIE; //CCR0 中断禁止 _BIC_SR(GIE); //关总中断 ADC10CTL0 |=ENC; //AD 转换使能 TACCTL1=OUTMOD_4; //CCR1 选输出模式4,当TAR=0 时,输出高电平 TACTL =TASSEL_2+MC_2; //TA 改为连续计数,smclk 时钟源 _BIS_SR(LPM0_bits+GIE); //进入低功耗0,使能总中断,等待10AD 完成 _NOP(); return 0; } #pragma vector = TIMERA0_VECTOR //TA0 中断服务,用来参考稳定 __interrupt void ta0_isr(void) { TACTL=0; //关TA _BIC_SR_IRQ(LPM0_bits); //退出低功耗 } #pragma vector = ADC10_VECTOR //ADC10 中断服务 __interrupt void adc_isr(void) { static char i=0; ad_value[i]=ADC10MEM; //保存AD 结果 i++; if(i==10) //作10 次AD _BIC_SR_IRQ(LPM0_bits+GIE); //退出低功耗 } /*=================实验四、OA 操作==================*/ /********************(一)OA 模式2——电压跟随器******************/ int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; P2SEL |=BIT0+BIT1; //P2.0,2.1 第二功能选择 P2OUT |=BIT1; //p2.1,OA0 输出端(不加也没关系) OA0CTL0=OAP_0+OAPM_3+OAADC1; //OAP 选择OA0I0 输入,反馈速度为fast,输 出为A1,A3 或者A5 OA0CTL1=OAFBR_1+OAFC_2; //R2/R1=4R/16R,反馈电阻为4R //OA0CTL1=OAFBR_2+OAFC_2; //R2/R1=8R/8R,反馈电阻为8R //OA0CTL1=OAFBR_3+OAFC_2; //R2/R1=10R/6R,反馈电阻为10R //OA0CTL1=OAFBR_4+OAFC_2; //R2/R1=12R/4R,反馈电阻为12R //OA0CTL1=OAFBR_5+OAFC_2; //R2/R1=13R/3R,反馈电阻为13R //OA0CTL1=OAFBR_6+OAFC_2; //R2/R1=14R/2R,反馈电阻为14R //OA0CTL1=OAFBR_7+OAFC_2; //R2/R1=15R/1R,反馈电阻为15R _NOP(); _BIS_SR(LPM3_bits); //进入低功耗3 _NOP(); return 0; } /******************(二)OA 模式3——比较器***********/ int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; P2SEL |=BIT0+BIT1; P2OUT |=BIT1; OA0CTL0=OAP_0+OAPM_3+OAADC1; //OAP 选择OA0I0 输入,反馈速度为fast,输出// 为 A1,A3 或者A5 OA0CTL1=OAFBR_1+OAFC_3; //运放反向端输入为4/16AVcc;比较器模式 //OA0CTL1=OAFBR_2+OAFC_3; //运放反向端输入为8/16AVcc;比较器模式 //OA0CTL1=OAFBR_3+OAFC_3; //运放反向端输入为10/16AVcc;比较器模式 //OA0CTL1=OAFBR_4+OAFC_3; //运放反向端输入为12/16AVcc;比较器模式 //OA0CTL1=OAFBR_5+OAFC_3; //运放反向端输入为13/16AVcc;比较器模式 //OA0CTL1=OAFBR_6+OAFC_3; //运放反向端输入为14/16AVcc;比较器模式 //OA0CTL1=OAFBR_7+OAFC_3; //运放反向端输入为16/16AVcc;比较器模式 _NOP(); _BIS_SR(LPM3_bits); //进入低功耗3 _NOP(); return 0; } /************(三)OA 模式4——同相比例放大器****************/ int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; P2SEL |=BIT0+BIT1; //P2.0,2.1 第二功能选择 P2OUT |=BIT1; //p2.1,OA0 输出端(不加也没关系) OA0CTL0=OAP_0+OAPM_3+OAADC1; //OAP 选择OA0I0 输入,反馈速度为fast,输 出为A1,A3 或者A5 OA0CTL1=OAFBR_0+OAFC_4; //R2/R1=0R/16R,模式4(同向比例放大器,放 大系数=1+R2/R1) OA0CTL1=OAFBR_1+OAFC_4; //R2/R1=4R/12R OA0CTL1=OAFBR_2+OAFC_4; //R2/R1=8R/8R OA0CTL1=OAFBR_3+OAFC_4; //R2/R1=10R/6R OA0CTL1=OAFBR_4+OAFC_4; //R2/R1=12R/4R OA0CTL1=OAFBR_5+OAFC_4; //R2/R1=13R/3R OA0CTL1=OAFBR_6+OAFC_4; //R2/R1=14R/2R OA0CTL1=OAFBR_7+OAFC_4; //R2/R1=15R/1R _NOP(); _BIS_SR(LPM3_bits); //进入低功耗3 _NOP(); return 0; } /******************(四)OA 模式4、5——二次同相放大*****************/ volatile unsigned int adc_value; int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; P2SEL |=BIT0+BIT1+BIT3+BIT4; //P2.0,2.1,2,3 第二功能选择OA0I0 输入 P2OUT |=BIT3; //p2.3,OA1 输出端(不加也没关系) //设置OA0 为模式4 OA0CTL0=OAP_0+OAPM_3; //OAP 选择OA0I0 输入,反馈速度为fast,OA0OUT 输出内 部路由 OA0CTL1=OAFBR_2+OAFC_4; //选择模式4,放大比例系数为1+8R/8R //设置OA1 为模式5 OA1CTL0=OAP_3+OAPM_3+OAADC1; //正端由内部OA0 输出输入,反馈速度为fast,输出到A3 OA1CTL1=OAFBR_2+OAFC_5; //选择模式5,放大比例系数为1+8R/8R //对OA1 的输出信号进行AD ADC10CTL1=INCH_3; //选择第3 通道 ADC10CTL0=REFON+SREF_1+REF2_5V; //打开2.5V 正参考,地为负参考 ADC10CTL0 |=ADC10ON+ADC10SHT_3+ADC10IE; //打开ADC10 内核,设定采样保持时间为64 个ADC10CLK,使能ADC10 中断 ADC10CTL0 |=ENC+ADC10SC; //启动AD 转换 _BIS_SR(GIE); //使能总中断 _NOP(); return 0; } #pragma vector=ADC10_VECTOR __interrupt void adc_isr(void) { adc_value=ADC10MEM; //将AD 值存入adc_value _NOP(); } /*==================实验五、USCI 模块操作====================*/ /************(一)USCI_A0 模块UART 模式***************/ __no_init char send_data[256] @ 0x0400; //数据存储首地址为0x0400 int main( void ) { WDTCTL =WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; volatile unsigned int n; do //等待晶振稳定 { IFG1 &=~OFIFG; for(n=5000;n>0;n--); } while(OFIFG&IFG1); P1DIR |=BIT0; //点亮LED P1OUT |=BIT0; P3SEL |=BIT4+BIT5; //p3.4 为TX,P3.5 为RX P3DIR |=BIT4; //P3.4 为输出方向 //UCA0STAT |=UCLISTEN; //调试时用于自发自收 UCA0CTL1 |=UCSSEL0; //时钟源选择32768 晶振 UCA0BR1=0; //设置波特率32768/1200=27.3 UCA0BR0=27; UCA0MCTL |=UCBRS1; //UCBRSx=INT(0.3*8)=2 UCA0CTL1 &=~UCSWRST; //退出USCI 设置 IE2 |=UCA0RXIE+UCA0TXIE; //使能收发中断 _BIS_SR(LPM3_bits+GIE); //进入低功耗3 并使能总中断 _NOP(); return 0; } #pragma vector =USCIAB0RX_VECTOR __interrupt void rx_isr(void) { static char i=0; P1OUT ^=BIT0; //如果作为接收方,每收一帧LED 翻转一次 send_data[i]=UCA0RXBUF; //将收到的数据放入0x0400 开始的RAM 地址 if(i==255) //比较是否已经收到了256 个数据 { i=0; //接收了256 个后,再从0x0400 开始放数据 } else { i++; } } #pragma vector =USCIAB0TX_VECTOR __interrupt void tx_isr(void) { static char j=0; P1OUT ^=BIT0; //如果作为接收方,每收一帧LED 翻转一次 unsigned int x; for(x=0;x<15000;x--); //在发送前一段延时,确保对方已经处理完上一帧数据 UCA0TXBUF=j; //将待发数据放入发送缓存寄存器中 j++; } /****************(二)USCI_A0 模块SPI 模式******************/ /*2274 学习板\example_code\2274_C\USCI_Operation\usci_spi_tx 2274 学习板\example_code\2274_C\USCI_Operation\usci_spi_rx*/ /======主机程序=======/ __no_init char rec_data[256] @ 0x0400; char send_data=1; int main( void ) { unsigned int n; WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; do{ //等待晶振稳定 IFG1 &=~OFIFG; for(n=5000;n>0;n--); }while(OFIFG&IFG1); P1DIR |=BIT0; //LED 使能 P3SEL |=BIT0+BIT4+BIT5; //p3.4 为TX,P3.5 为RX,P3.0 为UCA0CLK P3DIR |=BIT4; //P3.4 为输出方向 UCA0CTL1 |=UCSSEL0; //时钟源选择32768 晶振 UCA0CTL0 |=UCMST+UCSYNC+UCCKPL+UCMSB; //spi 主机模式,spi 通讯,时钟极性选为高 电平无效,选择最高有效位先发 UCA0BR1=0; //32768/1200=27.3 UCA0BR0=27; UCA0MCTL=0; UCA0CTL1 &=~UCSWRST; //进入SPI 工作模式 IE2 |= UCA0RXIE; //使能spi 接收中断 _BIS_SR(GIE); //使能总中断 UCA0TXBUF=send_data; //主机首先发一帧,其收到的第一个数据不确定 _BIS_SR(LPM3_bits); //进入低功耗3 return 0; } #pragma vector=USCIAB0RX_VECTOR __interrupt void rx_isr(void) { static unsigned int i=0; rec_data[i]=UCA0RXBUF; //将收到的数据放入0x0400 开始的ram 地址 i++; if(i==256) //到了256 个,再从头开始放 { i=0; } while(!(UCA0TXIFG&IFG2)); //查询发送标志位 send_data++; //增1 后发送 UCA0TXBUF=send_data; P1OUT ^=BIT0; //LED 翻转 } /==========从机程序=============/ int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; P1DIR |=BIT0; //使能LED P3SEL |=BIT4+BIT5+BIT0; //p3.4 为SIMO,P3.5 为SOMI,P3.0 为UCA0CLK P3DIR |=BIT5; //P3.5 为输出方向 UCA0CTL0 |=UCSYNC+UCCKPL+UCMSB; //spi 从机模式,时钟极性选为高电平无效,选择最 高有效位先发 UCA0CTL1 &=~UCSWRST; //进入spi 工作模式 IE2 |=UCA0RXIE; //使能接收中断 _BIS_SR(GIE+LPM3_bits); //使能总中断并进入低功耗3 return 0; } #pragma vector=USCIAB0RX_VECTOR //spi 接收中断服务 __interrupt void rx_isr(void) { while(!(UCA0TXIFG&IFG2)); //查询发送标志位 UCA0TXBUF=UCA0RXBUF; //将接收缓存器的数据放入发送缓存里 P1OUT ^=BIT0; //led 翻转 } /******************(三)USCI_B0 模块I2C 模式*******************/ /=======主机程序=====================/ char send_data=0; int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; P1DIR |=BIT0; //LED 能使 P3SEL |=BIT1+BIT2; //p3.1 为UCB0SDA,P3.2 为UCB0SCL UCB0CTL1 |=UCSSEL1; //时钟源选择smclk UCB0BR1=0; //SMCLK/11 UCB0BR0=11; UCB0CTL0 |=UCMST+UCSYNC+UCMODE1+UCMODE0; //选择I2C 主机模式 UCB0I2CSA=88; //设定从机地址为88 UCB0CTL1 &=~UCSWRST; //进入I2C 工作模式 IE2 |=UCB0TXIE; //使能UCB0TX 发送中断 UCB0CTL1 |=UCTR+UCTXSTT; //发送起始位,并将主机设为发送模式 _BIS_SR(CPUOFF + GIE); //进入低功耗0 while(UCTXSTP&UCB0CTL1); //等待停止位发送完毕 _NOP(); for(;;); return 0; } #pragma vector = USCIAB0TX_VECTOR //发送中断服务 __interrupt void i2c_tx_isr(void) { if(send_data!=100) //发完100 个数据? { UCB0TXBUF=send_data; send_data++; } else //100 个数据发完则发送停止位 { UCB0CTL1 |=UCTXSTP; //发停止位 IFG2 &=~UCB0TXIFG; //清发送标志位 _BIC_SR_IRQ(LPM0_bits); //发完退出低功耗 } } /**********(三)USCI_B0 模块I2C 模式*************/ /*2274 学习板\example_code\2274_C\USCI_Operation\i2c_int_ma (主机) 2274 学习板\example_code\2274_C\USCI_Operation\i2c_int_sa (从机)*/ /*=====================主机程序====================*/ char send_data=0; int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; P1DIR |=BIT0; //LED 能使 P3SEL |=BIT1+BIT2; //p3.1 为UCB0SDA,P3.2 为UCB0SCL UCB0CTL1 |=UCSSEL1; //时钟源选择smclk UCB0BR1=0; //SMCLK/11 UCB0BR0=11; UCB0CTL0 |=UCMST+UCSYNC+UCMODE1+UCMODE0; //选择I2C 主机模式 UCB0I2CSA=88; //设定从机地址为88 UCB0CTL1 &=~UCSWRST; //进入I2C 工作模式 IE2 |=UCB0TXIE; //使能UCB0TX 发送中断 UCB0CTL1 |=UCTR+UCTXSTT; //发送起始位,并将主机设为发送模式 _BIS_SR(CPUOFF + GIE); //进入低功耗0 while(UCTXSTP&UCB0CTL1); //等待停止位发送完毕 _NOP(); for(;;); return 0; } #pragma vector = USCIAB0TX_VECTOR //发送中断服务 __interrupt void i2c_tx_isr(void) { if(send_data!=100) //发完100 个数据? { UCB0TXBUF=send_data; send_data++; } else //100 个数据发完则发送停止位 { UCB0CTL1 |=UCTXSTP; //发停止位 IFG2 &=~UCB0TXIFG; //清发送标志位 _BIC_SR_IRQ(LPM0_bits); //发完退出低功耗 } } /*=================从机程序====================*/ __no_init char data_ptr[100] @ 0x0400;//定义接收缓存的首地址为0x0400 int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; P1DIR |=BIT0; //led 使能 P3SEL |=BIT1+BIT2; //p3.1 为UCB0SDA,P3.2 为UCB0SCL UCB0CTL0=UCSYNC+UCMODE_3; //UCB0 为I2C 从机模式 UCB0I2COA=88; //设定本机从机地址位88 UCB0CTL1 &=~UCSWRST; //进入I2C 工作模式 UCB0I2CIE |=UCSTPIE+UCSTTIE; //开始位和停止位中断使能 IE2 |=UCB0RXIE; //使能I2C 接收中断 _BIS_SR(CPUOFF + GIE); //进入低功耗0 _NOP(); /用于调试 while(1); return 0; } #pragma vector = USCIAB0TX_VECTOR //数据接收中断服务 __interrupt void i2c_rx_isr(void) { static char i=0; data_ptr[i]=UCB0RXBUF; //将收到的数据存入0x0400 开始的RAM 中 i++; } #pragma vector = USCIAB0RX_VECTOR //数据开始,停止位标志中断服务 __interrupt void i2c_stt_stp(void) { if(UCSTPIFG&UCB0STAT) { _BIC_SR_IRQ(LPM0_bits); //当接收到停止位时退出低功耗 } UCB0STAT &=~(UCSTPIFG+UCSTTIFG); //清开始,停止标志为 }