本程序是《MSP430系列单片机系统工程设计与实践》书里面的源码,(包含工程文件 (例2.8.19)))完整例程下载:http://www.51hei.com/bbs/dpj-46245-1.html

- #include <msp430x42x.h>
- #include "LCD_Display.h"
- #define Circle 207 /*轮圈周长,单位cm*/
- unsigned int TA_OverflowCnt; //TA溢出次数存放变量
- unsigned long int Period; //周期测量结果存放变量
- unsigned int Speed;
- void main( void )
- {
- WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
- FLL_CTL0 |= XCAP18PF; // 配置晶振负载电容
- P1DIR &=~(BIT7); // P1.7设为输入(可省略)
- P1IES |= BIT7; // P1.7设为下降沿中断
- P1IE |= BIT7; // 允许P1.7中断
- TACTL = TASSEL_1 + MC_2 + TAIE + TACLR; // TA清零并开始计时,ACLK,开中断
- BTCTL=0;
- LCD_Init();
- _EINT(); // 总中断允许
- LPM3;
- }
- #pragma vector = PORT1_VECTOR //P1口中断入口
- __interrupt void P1_ISR(void)
- {
- int i;
- _BIC_SR(SCG0); //清除SR寄存器的SCG0控制位,恢复时钟准确性
- for(i=0;i<600;i++); //抗抖动,略延迟后再做判断
- if((P1IN & BIT7) == BIT7) //如果P1.7变高(断开),则判为毛刺
- {
- P1IFG=0; return; //认为开关信号无效,不作处理直接退出
- }
- if(P1IFG & BIT7) //判断P1中断标志第7位(P1.7)
- {
- Period=TA_OverflowCnt*65536+TAR; //得到相邻两次中断之间的间隔时间
- TA_OverflowCnt=0;
- TACTL |= TACLR; // TA清零,重新计时
- Speed=(long)32768*Circle*36/(10*Period);
- LCD_DisplayDecimal(Speed,2);
- }
- P1IFG=0; //清除P1所有中断标志位
- }
- #pragma vector=TIMERA1_VECTOR
- __interrupt void TA_ISR(void) //计满至65536溢出
- {
- switch( TAIV )
- {
- case 2: break;
- case 4: break;
- case 10: TA_OverflowCnt++; //TA每次溢出,溢出次数变量+1
- break;
- }
- }
复制代码
|