超声波倒车雷达

来源:互联网 发布: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();   }     }  }}