完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
/**超声波测距离HC-SR04模块,在12864上显示出来,误差为5cm以内********/
#include #include "Config.h" #include "12864.c" #define uchar unsigned char #define uint unsigned int #define ulong unsigned long #define CLK_Trig P1OUT &= ~BIT0 //P1.0产生脉冲引脚 #define SET_Trig P1OUT |= BIT0 //P1.0产生脉冲引脚 #define Echo (P1IN & BIT2) //回波引脚 //unsigned char tt[]=" hc-sr04 "; //uchar distance[]="distance: CM"; uchar distance[3]; unsigned int distance_data, M; uchar succeed_bit; uint count=0; //函数的声明// /*20us延时函数*/ void Delay20us() { uchar i; for(i=0; i<20; i++); } /***测量获取数据**/ void Measure() { /******************************HC-sr04的初始化部分****************************/ succeed_bit=0; _DINT(); SET_Trig;//P1.0产生脉冲引脚 Delay20us();//延时20us,把Trig的引脚的电位拉高20us//之后,超声波内部自动发送8个40KHz的脉冲 CLK_Trig;//再输出低电平 _EINT();//中断使能,打开中断,上升沿捕获和下降沿捕获 /********************************************************************* *********************************************************************/ while(Echo == 0);//判断echo是否变为高电平,上升沿 TACTL &= ~MC_1; TACTL |= TACLR; //连续计数 清除TA的计数值 TACTL |= TASSEL_2 + MC_1 + ID_3 ;//选择SMLK时钟频率,8分频,1M,增计数模式 TACCTL0 &= ~CCIFG; //清中断标志 TACCTL0 |= CM_2; //下降沿捕捉 while(Echo == 1); //等待echo变回低电平,下降沿 distance_data = CCR0;//TA0R是所需时间 while(!(succeed_bit));//等待succeed为 1 M =(distance_data * 17)/1000;//测量结果为CM succeed_bit = 0; } //显示函数 void display() { distance[2] = M%10+0x30; //取个位 distance[1] = M/10%10+0x30; //取十位 distance[0] = M/100+0x30; //取百位 LCD_write_str(0x01,2,distance); delay_ms(60); } void main(void) { uchar i; //Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; Port_init(); Clock_Init(); BCSCTL2 |= SELM_2 + SELS +DIVS_3;//使MCLK和SMCLK都为高频振荡器,8分频 CCTL0 |= CCIE + CM_3 + SCS + CAP + CCIS_1 ; TACTL |= TASSEL_2 + MC_1 + ID_3 ;//选择SMLK时钟频率,8分频,1M,增计数模式 P1DIR &= ~BIT2;//设置P1.1为输入端 P1DIR |= BIT0;//设置P1.0为输出端 P1OUT &= ~BIT0;//先输出0 delay_ms(600); LCD_init(); LCD_Desk(); _EINT(); //进入全局中断 while(1) { Measure(); display(); LCD_write_str(0x00,2,distance); } } #pragma vector = TIMERA0_VECTOR __interrupt void vector_TimeA(void) { TACTL &= ~TAIFG ; //中断标志清零 succeed_bit =1; CCTL0 &= ~CCIE; //关闭中断使能; } |
|
相关推荐
1个回答
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
3029个成员聚集在这个小组
加入小组2917 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3579 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2337 浏览 1 评论
4795 浏览 1 评论
2571 浏览 1 评论
1317浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3580浏览 2评论
2917浏览 1评论
1495浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 19:55 , Processed in 1.359584 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号