分享一个基于51单片机的倒车系统仿真,带减小距离和增加距离调节以及报警功能.还有一个功能键
用HC-SR04超声波模块组成的LCD1602显示的超声波测距板仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
电路原理图如下:
HC-SR04超声波倒车雷达的单片机源程序如下:
- #include <REGX52.H>
- #include <stdio.h>
- #include "LCD.H"
- #include "18B20.H"
- #include "delay.h"
- sbit k1=P3^5;
- sbit k2=P3^6;
- sbit csb=P2^5;
- sbit csbint=P3^2;
- sbit bg=P2^6;
- sbit fmq=P3^3;
- unsigned char aa[]={' ',' ','D','i','s','t','a','n','c','e',':'}; //Distance
- unsigned char bb[11]={' ',' ',' ',' ','.',' ',' ',' ',' ',' ',};
- unsigned char cc[]={'A','.','A','A','m'};
- unsigned char zf,a1,a2,a3,xs,e,n,m,z; //zf 温度正负标志位;a1,a2,a3,按键设定程序中定值的米、分米、厘米临时存储变量
- //xs,e 用于按键程序中设定位闪动显示的变量;flag,未用,n,是背光控制标志位变量;m,z;
- unsigned int dz,k,s,j,bgz,k;
- int temp;
- float temperature,csbc,wdz;
- bit wh;
- main()
- {
- TH0=0;
- TL0=0;
- TMOD=0X11; //T1,T0为16位定时器
- EA=0;
- bg=0;
- n=0;
- m=0;
- z=0;
- init();
- Init_DS18B20();
- dz=80;
- bb[6]=0xdf;
- bb[7]=0x43;
- e=4;
- cc[0]=dz/100+'0';
- cc[2]=dz/10%10+'0';
- cc[3]=dz%10+'0';
- LCD_Write_String(0,0,aa);
- LCD_Write_String(11,1,cc);
- while(1)
- {
- temp=ReadTemperature();
- fmq=1;
- DelayMs(100);
- if(temp<0)
- {
- temp=-(temp-1);
- zf=1;
- bb[0]='-';
- }
- else
- {
- zf=0;
- bb[0]=' ';
- }
- csb=0; //启动一次模块
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- csb=1;
- ET0=1; //启动计数器T0,用以计时
- TR0=1;
- EA=1;
- j=80; //延时
- while(j--)
- {
- }
- csbint=1;
- j=0;
- while(csbint) //判断接收回路是否收到超声波的回波
- {
- j++;
- if(j>=2500) //如果达到一定时间没有收到回波,则将csbint置零,退出接收回波处理程序
- csbint=0;
- }
- TR0=0;
- s=TH0*256+TL0; //读取时间数据
- TH0=0;
- TL0=0;
- wdz=0.00000607*temp; //温度补偿计算
- if(zf==0)
- {
- csbc=0.03315+wdz;
- }
- else csbc=0.03315-wdz;
- csbc=csbc/2;
- s=s*csbc-8;
- if(s<5) //测量值小于下限
- {
- cc[0]='-';
- cc[2]='-';
- cc[3]='-';
- }
- else if(s>500) //测量值大于上限
- {
- cc[0]='C';
- cc[2]='C';
- cc[3]='C';
- }
- else
- {
- cc[0]=s/100+'0';
- cc[2]=s/10%10+'0';
- cc[3]=s%10+'0';
- }
- if(s<dz)
- {
- bgz=s*5;
- for (k=0;k<bgz;k++)
- {
- DelayUs2x(150);
- fmq=!fmq; //BEEP取反
- }
- }
- bb[1]=temp/1000+0x30;
- bb[2]=temp/100%10+0x30;//显示十位
- bb[3]=temp%100/10+0x30;//显示个位
- bb[5]=temp%10+0x30; //小数
- if(zf==0)
- {
- if(temp<1000)
- {
- bb[1]=' ';
- if(temp<100)
- {
- bb[2]=' ';
- }
- }
- }
- else
- {
- if(temp<1000)
- {
- bb[1]='-';
- bb[0]=' ';
- if(temp<100)
- {
- bb[0]=' ';
- bb[1]=' ';
- bb[2]='-';
- }
- }
- }
- LCD_Write_String(0,1,bb);
- LCD_Write_String(11,0,cc);
- while(!k2) //液晶背面开关
- {
- n=1;
- }
- if(n==1)
- {
- bg=~bg; //bg=0;时开背光灯
- n=0;
- }
- if(!k1) //按键处理程序
- {
- TR1=0;
- TR0=0;
- cc[0]='A';
- cc[1]='.';
- cc[2]='A';
- cc[3]='A';
- cc[4]='m';
- LCD_Write_String(11,1,cc);
- k=500;
- while(k)
- {
- k--;
- DelayMs(2);
- }
- cc[0]=dz/100+'0';
- cc[2]=dz/10%10+'0';
- cc[3]=dz%10+'0';
- LCD_Write_String(11,1,cc);
- a1=dz/100;
- a2=dz/10%10;
- a3=dz%10;
- n=1;
- while(n)
- {
- if(!k2)
- {
- while(!k2);
- e=1;
- xs=3;
- a1+=1;
- if(a1>5)
- a1=0;
- cc[0]=a1+'0';
- }
- if (e==1)
- {
- xs++;
- cc[0]=a1+'0';
- if(xs>6)
- {
- xs=0;
- e=0;
- }
- }
- else
- {
- cc[0]=' ';
- xs++;
- if(xs>3)
- {
- xs=0;
- e=1;
- }
- }
- LCD_Write_String(11,1,cc);
- if(!k1)
- {
- while(!k1);
- cc[0]=a1+'0';
- m=1;
- while(m)
- {
- if(!k2)
- {
- while(!k2);
- e=1;
- xs=3;
- a2+=1;
- if(a2>9)
- a2=0;
- cc[2]=a2+'0';
- LCD_Write_String(11,1,cc);
- }
- if (e==1)
- {
- xs++;
- cc[2]=a2+'0';
- if(xs>6)
- {
- xs=0;
- e=0;
- }
- }
- else
- {
- cc[2]=' ';
- xs++;
- if(xs>3)
- {
- xs=0;
- e=1;
- }
- }
- LCD_Write_String(11,1,cc);
-
- if(!k1)
- {
- while(!k1);
- cc[2]=a2+'0';
- z=1;
- while(z)
- {
- if(!k2)
- {
- while(!k2);
- e=1;
- xs=3;
- a3+=1;
- if(a3>9)
- a3=0;
- cc[3]=a3+'0';
- LCD_Write_String(11,1,cc);
- }
- if (e==1)
- {
- xs++;
- cc[3]=a3+'0';
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
Keil代码与Proteus7.8仿真(dsn文件 只能用7.8版本打开)下载:
超声波倒车雷达.zip
(122.01 KB, 下载次数: 1026)
|