完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 uranuschu 于 2015-3-17 21:12 编辑
菜鸟学习中,我想编一个两个超声波测距模块US-100测出来的数值相加的c程序采用分时控制 用的是stc89c51单片机,1602显示。大神能不能讲解一下,或者给个范例。 最直接的当然是编一个我参考啦。。先谢谢了 下面是我测试成功的一个超声波测距的程序 修改了网上的,但是还是不太懂。 奖励分数不多还请见谅 #include #include #define uint unsigned int #define uchar unsigned char #define RX P1_2 #define TX P1_1 #define LCM_RW P3_6 //定义LCD引脚 #define LCM_RS P3_5 #define LCM_E P3_4 #define LCM_Data P0 #define Busy 0x80 //用于检测LCM状态字中的Busy标识 unsigned char code mcustudio[] ={" The distance "}; unsigned char code Cls[] = {" "}; unsigned char code ASCII[16] = {'0','1','2','3','4','5','6','7','8','9','.','-','C','M'}; static unsigned char DisNum = 0; //显示用指针 uint time=0; unsigned long S=0; bit flag =0; uchar di***uff[4]={ 0,0,0,0,}; /*********************5ms延时************/ void delay5Ms(void) { uint TempCyc = 5552; while(TempCyc--); } /***********400ms延时******************/ void delay400Ms(void) { uchar TempCycA = 5; uint TempCycB; while(TempCycA--) { TempCycB=7269; while(TempCycB--); }; } /*********************延迟****************/ void delayms(uint ms) { unsigned char i=100,j; for(;ms;ms--) { while(--i) { j=10; while(--j); } } } /**************读状态**********************************/ uchar readStatusLCM(void) { LCM_Data = 0xFF; LCM_RS = 0; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; while(LCM_Data & Busy); //检测忙信号 return(LCM_Data); } /*****************读数据***************************************/ /*uchar readDataLCM(void) { LCM_RS = 1; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; return(LCM_Data); } */ /******************写数据*********************************/ void writeDataLCM(uchar WDLCM) { readStatusLCM(); //检测忙 LCM_Data = WDLCM; LCM_RS = 1; LCM_RW = 0; LCM_E = 0; //若晶振速度太高可以在这后加小的延时 LCM_E = 0; //延时 LCM_E = 1; } /*****************写指令*********************************/ void writeCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测 { if (BuysC) readStatusLCM(); //根据需要检测忙 LCM_Data = WCLCM; LCM_RS = 0; LCM_RW = 0; LCM_E = 0; LCM_E = 0; LCM_E = 1; } /*************初始化*************************************/ void LCMInit(void) //LCM初始化 { writeCommandLCM(0x38,0); //显示模式设置,不检测忙信号 delay5Ms(); writeCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号 writeCommandLCM(0x08,1); //关闭显示 writeCommandLCM(0x01,1); //显示清屏 writeCommandLCM(0x06,1); // 显示光标移动设置 writeCommandLCM(0x0c,1); // 显示关及光标设置 } //按指定位置显示一个字符 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) { Y &= 0x1; X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) { X |= 0x40; //当要显示第二行时地址码+0x40; } X |= 0x80; //算出指令码 writeCommandLCM(X, 1); //发命令字 writeDataLCM(DData); //发数据 } /**************显示字符*************************************/ //按指定位置显示一串字符 void displayListChar(uchar X, uchar Y, uchar code *DData) { uchar ListLength; ListLength = 0; Y &= 0x1; X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>0x19) //若到达字串尾则退出 { if (X <= 0xF) //X坐标应小于0xF { DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符 ListLength++; X++; } } } /************计数*****************************/ void count(void) { time=TH0*256+TL0; TH0=0; TL0=0; S=(time*1.7)/100; //算出来是CM if((S>=700)||flag==1) //当距离超出测量时,范围显示“-” { flag=0; DisplayOneChar(4, 1, ASCII[11]); DisplayOneChar(5, 1, ASCII[11]); DisplayOneChar(6, 1, ASCII[11]); DisplayOneChar(7, 1, ASCII[12]); //显示C DisplayOneChar(8, 1, ASCII[13]); //显示M } else //当距离未超出距离限制时,正常显示 { di***uff[0]=S%1000/100; di***uff[1]=S%1000%100/10; di***uff[2]=S%1000%10 %10; DisplayOneChar(4, 1, ASCII[di***uff[0]]); DisplayOneChar(5, 1, ASCII[di***uff[1]]); DisplayOneChar(6, 1, ASCII[di***uff[2]]); DisplayOneChar(7, 1, ASCII[12]); //显示C DisplayOneChar(8, 1, ASCII[13]); //显示M } } /*************************中断**************************/ void timer0() interrupt 1 //T0中断用来计数器溢出,超过测距范围 { flag=1; //中断溢出标志 } /******************启动模块*********************************/ void startModule() //启动模块 { uchar i; TX=1; //启动一次模块 for(i=0;i<20;i++) //延迟 以便于进行传送数据 { _nop_(); } TX=0; } /*****************主函数***********************************/ void main() { LCMInit(); //LCM初始化 delay5Ms(); //延时片刻(可不要) displayListChar(0, 0, mcustudio); displayListChar(0, 1, Cls); TMOD=0x01; //设T0为方式1,GATE=1; TH0=0; TL0=0; ET0=1; //允许T0中断 EA=1; //开启总中断 while(1) { startModule(); while(!RX); //当RX为零时等待 TR0=1; //开启计数 while(RX); //当RX为1计数并等待 TR0=0; //关闭计数 count(); //计算 delayms(80); //80MS } } |
|
相关推荐
3个回答
|
|
|
|
|
|
我最近也在搞双测距模块,你程序搞好了吗?
|
|
|
|
你既然能写出一个超声波测距,再加一个超声波原理还不是一样啊?
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)ADC采集+PWM输出
54 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验
395 浏览 0 评论
439 浏览 0 评论
如何用OpenCV的相机捕捉视频进行人脸检测--基于米尔NXP i.MX93开发板
1265 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十章 YOLO2人手检测实验
529 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11744 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 17:36 , Processed in 1.599825 second(s), Total 77, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号