|
超声波测距的IAR程序- #include <msp430x14x.h>
- #include "cry1602.h"
- uchar tishi[]={"the distance is:"};
- uchar geshi[]={".cm"};//26.2cm
- uchar num[]={"0123456789 "};
- uchar Edge=1;
- uint RiseCapVal; //上升沿时刻捕获值存放变量
- //uint TA_Overflow_Cnt; //TA溢出次数存放变量,可能距离远超过65535
- unsigned long int Period; //脉宽存放结果变量,高电平时间
- unsigned long int S; // 定义距离长度,单位厘米
- #define RISE 1
- #define FALL 0
- uint one,two,three;
- void Delay_ms(void);
- /**
- * main.c
- */
- void Conut(void)
- {
- one=S%1000/100;
- two=S%1000%100/10;
- three=S%1000%10 %10;
- Disp1Char(10,1,num[one]);
- Disp1Char(11,1,num[two]);
- Disp1Char(13,1,num[three]);
- }
- #pragma vector=TIMERA1_VECTOR
- __interrupt void Timer_A(void)
- {
- switch(TAIV)
- {
- case 2 :if(Edge==RISE)
- {
- RiseCapVal = TACCR1;
- TACCTL1 |= CAP+CM_2+CCIS_0+SCS+CCIE;//改为下降沿捕获
- Edge = FALL;//下降沿捕获标志
- }
- else
- {
- _DINT();
- Period = TACCR1-RiseCapVal; //这里要注意是否考虑溢出,跟测试距离有关,希望大家拓展
- S=(Period*17)/100; // 距离计算 s=340m/s*Period/2*10^(-6)*1000(mm)
- TACCR1 = 0;
- TACCTL1|= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
- Edge = RISE;//上升沿捕获标志
- _EINT();
- }
- break;
- case 4 : break;
- case 10: //TA_Overflow_Cnt++; //溢出标志
- break;
- }
- }
- void init_timerA(void)
- {
- TACTL |= TASSEL_2+MC_2+TAIE+TACLR+ ID_3;//SMCLK,8MHz,8分频,连续计数,中断允许,计数器清零
- TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//捕获模式,上升沿捕获(CM_2),CCI1A输入,同步捕获,中断允许
- }
- void init_IO(void)
- {
- P1DIR |= BIT1; //P1.1输出,普通I/O
- P1DIR &=~ BIT2; //P1.2输入
- P1SEL |= BIT2; //P1.2第二功能,捕获输入
- P1OUT &=~BIT1; // 开始低电平,控制驱动波形发生
- }
- void init_clk(void)
- {
- uchar i;
- BCSCTL1&=~XT2OFF; //打开XT振荡器
- BCSCTL2|=SELM_2+SELS;//MCLK 8M and SMCLK 8M
- do
- {
- IFG1 &= ~OFIFG;//清除振荡错误标志
- for(i = 0; i < 0xff; i++) _NOP();//延时等待
- }
- while ((IFG1 & OFIFG) != 0);//如果标志为1继续循环等待晶振起振
- IFG1&=~OFIFG;
- }
- void main(void)
- {
- /*下面六行程序关闭所有的IO口*/
- P1DIR = 0XFF;P1OUT = 0XFF;
- P2DIR = 0XFF;P2OUT = 0XFF;
- P3DIR = 0XFF;P3OUT = 0XFF;
- P4DIR = 0XFF;P4OUT = 0XFF;
- P5DIR = 0XFF;P5OUT = 0XFF;
- P6DIR = 0XFF;P6OUT = 0XFF;
- WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
- LcdReset();
- DispStr( 0, 0,tishi);
- Disp1Char(12,1,geshi[0]);
- Disp1Char(14,1,geshi[1]);
- Disp1Char(15,1,geshi[2]);
- init_clk();
- init_IO();
- _EINT(); //开全局中断
- while(1)
- {
- init_timerA();
- P1OUT |= BIT1; // P1.1 高电平,超过10us
- Delay5ms();
- P1OUT &=~BIT1;
- Delay5ms();
- Conut();
- Delay_ms();
- }
- }
复制代码
|
|