超声波倒车雷达
来源:互联网 发布:coc石头人升级数据 编辑:程序博客网 时间:2024/04/27 11:59
同学的毕业设计!我帮忙做的,所以..(一下省略N个字!)
=======================================
用到器件:51单片机,超声波传感器、蜂鸣器、led、1602显示模块。。
硬件比较简单了,怎么用,自己去查资料吧。。
我就发下源码:
#include <reg52.h>#include <intrins.h>#define LCM_Data P0#define Busy 0x80 //用于检测LCM状态字中的Busy标识sbit LCM_RW = P3^4 ;//定义LCD引脚sbit LCM_RS = P3^3;sbit LCM_E = P3^5;sbit FM = P2^3;//蜂鸣器sbit RX = P3^0;sbit TX = P3^1;void LCMInit(void);//LCD初始化函数void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);//LCD显示一个字符函数void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);//LCD显示一个字符串函数void Delay5Ms(void);//延时5毫秒函数void Delay400Ms(void);//延时400毫秒函数void Decode(unsigned char ScanCode);void WriteDataLCM(unsigned char WDLCM);//LCD1602写数据函数void WriteCommandLCM(unsigned char WCLCM,BuysC);//LCD写命令函数//unsigned char ReadDataLCM(void);unsigned char ReadStatusLCM(void);unsigned char code Range[] ="==Range Finder==";//LCD1602显示格式unsigned char code ASCII[13] = "0123456789.-M";unsigned char code table[]="Distance:000.0cm";unsigned char code table1[]="!!! Out of range";//static unsigned char DisNum = 0; //显示用指针 unsigned int time=0;unsigned long S=0;bit flag =0;unsigned char disbuff[4]={ 0,0,0,0,};//写数据void WriteDataLCM(unsigned char 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;}//读数据/*unsigned char ReadDataLCM(void){LCM_RS = 1; LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;return(LCM_Data);}*///读状态unsigned char 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);}void LCMInit(void) //LCM初始化{LCM_Data = 0;WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms(); WriteCommandLCM(0x38,0);Delay5Ms(); 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不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCM(X, 1); //发命令字WriteDataLCM(DData); //发数据}//按指定位置显示一串字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData){unsigned char ListLength; ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]>0x19) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}//5ms延时void Delay5Ms(void){unsigned int TempCyc = 5552;while(TempCyc--);}//400ms延时void Delay400Ms(void){unsigned char TempCycA = 5;unsigned int TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);};}/********************************************************/ void Conut(void){ time=TH0*256+TL0; TH0=0; TL0=0; S=(time*1.7)/10+10; //算出来是MM if((S>=7000)||flag==1) //超出测量范围 { flag=0; DisplayListChar(0, 1, table1); } else { if(S>500) FM=1; else FM=0; disbuff[0]=S%10; disbuff[1]=S/10%10; disbuff[2]=S/100%10; disbuff[3]=S/1000; DisplayListChar(0, 1, table); DisplayOneChar(9, 1, ASCII[disbuff[3]]); DisplayOneChar(10, 1, ASCII[disbuff[2]]); DisplayOneChar(11, 1, ASCII[disbuff[1]]); DisplayOneChar(12, 1, ASCII[10]); DisplayOneChar(13, 1, ASCII[disbuff[0]]); }}/********************************************************/ void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围 { flag=1; //中断溢出标志RX=0; }/********************************************************/ void StartModule() //启动模块 { TX=1; //启动一次模块 _nop_(); TX=0; }/********************************************************/ /*void delayms(unsigned int ms){unsigned char i=100,j;for(;ms;ms--){while(--i){j=10;while(--j);}}}*/void Timer_Count(void){TR0=1;//开启计数while(RX);//当RX为1计数并等待TR0=0;//关闭计数 Conut();//计算}/*********************************************************/void main(void){ unsigned int valA;Delay400Ms(); //启动等待,等LCM讲入工作状态LCMInit(); //LCM初始化Delay5Ms(); //延时片刻DisplayListChar(0, 0, Range);DisplayListChar(0, 1, table);//ReadDataLCM();//测试用句无意义 TMOD=0x01;//设T0为方式1,GATE=1; EA=1; TH0=0; TL0=0; ET0=1; //允许T0中断 //开启总中断 while(1) {RX=1; StartModule(); for(valA=7510;valA>0;valA--) { if(RX==1) { Timer_Count(); } } }}
- 超声波倒车雷达
- msp430g2553的倒车雷达超声波测距子系统
- 倒车雷达原理篇
- 逻辑电路设计:倒车雷达项目
- 无所不能 自动刹车的倒车雷达
- 选择倒车雷达要做到心中有“数”
- 汽车倒车雷达全接触:五年发展有六代技术
- 倒车
- 隐喻:层与层之间的控制关系与倒车雷达
- 汽车示教板_汽车倒车雷达的构成及探测原理
- 超声波
- 雷达
- 倒车方法
- 如何倒车
- 关于倒车
- 超声波测距
- 超声波。。。。-原理--
- 超声波模块
- MYSQL 5.5从零开始学——数据表的基本操作
- mysql中utf8_bin、utf8_general_ci、utf8_general_cs编码区别
- 虚析构函数的重要性
- Opengl中列表的显示
- linux下的echo命令
- 超声波倒车雷达
- 初探eXtreme scale
- MFC网页访问的实现示例
- 使用 HttpClient 和 HtmlParser 实现简易爬虫
- Spring IOC 机制
- MyGUI_Orge官网教程_4.使用委托delegate
- Laravel 4 IoC Container
- OpenCV形态学操作
- [poj 1904]King's Quest[Tarjan强连通分量]