#include #include"cry1602.h" #define uchar unsigned char #define uint unsigned int unsigned char disbuff[]="The Distance is:"; uchar shuzi[] = {"0123456789.M"}; /********************************************* 超声波模块必须的变量 **********************************************/ #define csb_pjzcs 4 unsigned long csb_sum; uint csb_results[csb_pjzcs]; unsigned long int Period;//脉宽存放结果变量 unsigned long int csb_s;//存放超声波测距的距离 unsigned char Edge=1;//当前触发沿 uint csb_jcbz=1; uchar fzsbl;//防止进程死锁的变量,死到一定时间自动复活 /****************************************************** 定义两个延时函数 ******************************************************/ void csb_s_delay_us(uint us) { uint i; for(i=0;i _NOP(); } } void csb_s_delay_ms(uint ms) { uint i; for(i=0;i csb_s_delay_us(1000); } } /******************************************************* 初始化系统时钟函数 *******************************************************/ void init_clk() { unsigned char i; BCSCTL1&=~XT2OFF;//打开XT振荡器 do { IFG1 &= ~OFIFG;//清除振荡错误标志 for(i = 0; i < 0xff; i++);//延时等待 } while (IFG1&OFIFG);//如果标志为1继续循环等待 BCSCTL2|=SELM_2+SELS;//MCLK 8M and SMCLK 8M } /******************************************************** 初始化定时器A函数 ********************************************************/ void init_timerA() { P1DIR |= BIT2;//P1.2输出 P1DIR &=~BIT1;//P1.1输入 P1SEL |=BIT1;//P1.1第二功能,捕获输入 TACTL= TASSEL_2+MC_2+ID_3+TACLR;//SMCLK,8分频,连续计数,中断允许,计数器清零 TACCTL0= CAP+CM_1+CCIS_0+SCS+CCIE;//捕获模式,上升沿捕获,CCI1A输入,同步捕获,中断允许 _EINT(); } void display(uint csb_s,uchar m,uchar n) { uchar prt[6],i; prt[1]=10; prt[0]=csb_s/1000; prt[2]=csb_s%1000/100; prt[3]=csb_s%1000%100/10; prt[4]=csb_s%1000%100%10; prt[5]=11; for(i=0;i<6;i++) { Disp1Char((m+i),n,shuzi[prt[i]]); } } /**************************************** 启动超声波测距模块 ****************************************/ void startmode() { _DINT(); P1OUT&=~BIT2; P1OUT|= BIT2; csb_s_delay_us(20); P1OUT &=~BIT2; _EINT(); } /************************************************************ 多次测量超声波距离求平均值 ************************************************************/ void csb_pjz() { uint i; csb_sum=0; for(i=0;i startmode(); fzsbl=500; while(csb_jcbz) { ;///只要此处有语句就会卡死 }//if(fzsbl==0) csb_jcbz=0; csb_jcbz=1; csb_s=(Period*173)/1000;//此时测出来的是mm csb_results[i]=csb_s; } for(i=0;i csb_sum +=csb_results[i]; } csb_sum >>=2; } void main() { /*下面六行程序关闭所有的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;//停止看门狗 while(1) { LcdReset(); init_clk(); init_timerA(); csb_pjz(); display(csb_sum,1,1); csb_s_delay_ms(200); } } //定时器A服务程序 //===============此处一定要注意中断向量TIMER0_VECTOR只指向CCR0(捕获比较寄存器0)而TIMER1_VECTOR指向CCR1、2以及TA====// #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A(void) { if(Edge==1)//上升沿捕获一次 { TAR = 0; TACCTL0= CAP+CM_2+CCIS_0+SCS+CCIE;//改为下降沿捕 Edge = 0;//下降沿捕获标志 } else { Period = TACCR0; TACCTL0= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获 Edge = 1;//上升沿捕获标志 csb_jcbz =0; //让进程继续执行 if(csb_jcbz==0) DispNChar(0,0,16,disbuff); } }
上一篇:MSP430F5529火箭板 --->基于定时器A的LED灯闪烁实验(含Timer_A分析)
下一篇:MSP430 单片机内指针或结构体赋值为NULL,却有默认值的解决办法
推荐阅读最新更新时间:2024-11-11 10:40
设计资源 培训 开发板 精华推荐
- 使用 Microchip Technology 的 TC04AC 的参考设计
- AM2F-1207SH52Z 7.2V 2瓦DC-DC转换器的典型应用
- 涂鸦IoT红外语音助手
- LT1576、5V/1.25A 降压转换器
- DC1554A-A,使用 LTM2882-3 RS232 模块隔离器 @ 3.3V 电源的演示板
- 具有 PowerPath 的 LTC4162IUFD-SAD 12V USB 供电充电器的典型应用
- (c52) IV-18VFD荧光管时钟
- DI-122 - 适用于白色家电的 13 W(峰值 17.2 W)非隔离电源
- 2021年H题-用电器分析识别装置
- MC34072AMTTBG 二阶高通有源滤波器的典型应用
- 答题赢好礼|机器故障防患未然 大机器健康状态监测为您助力
- MPS e-store清空购物车2020
- EEWORLD芯积分上线,加分规则公示~关系到每一个EE网友
- 是德科技有奖问答活动之一,A4WP无线充电测试的示波器方案,答题闯关赢好礼!
- 已结束|Maxim IO-Link通信协议设计方案详解,5大优势助你轻松联网!
- TI 嵌入式处理器最新产品发布会 全程在线直播 4月16日精彩为您呈现!预报名、看直播、享好礼
- 有奖直播:Littelfuse电动车充电桩及车载充电器保护设计方案
- [直播预报名] TI 最新蓝牙技术培训,2017 震撼首发!
- EEWorld 2018年度最具影响力网友评选
- 有奖直播|如何借助Mentor Xpedition AMS对汽车CAN总线进行仿真优化分析?