1) 基本任务
(1) 当车距(HC-SR04 超声波测距的位置)离障碍物小于 1 米,报警器响起, 发出一定
频率的“滴滴” 声音, 报警指示灯闪烁。
(2) LCD1602 液晶屏显示超声波模块安装位置与障碍物之间的距离。
2) 扩展任务:
(1) 随着车距与障碍物的距离的缩小,报警器声音越来越尖锐急促(声音频率越来越高)。
(2) 随着车距与障碍物的距离的缩小, 报警指示灯闪烁频率增加。
(3) 按键调整报警门限距离, 当车距离障碍物小于该值(默认值为 1 米),声音报警。
(4) LCD1602 第一行显示超声波模块安装位置与障碍物之间的距离;第二行实时显示按
键所调整的报警门限距离。
倒车雷达仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
倒车雷达的单片机源程序如下:- #include <REGX52.H>
- #include <stdio.h>
- #include "LCD.H"
- #include "delay.h"
- #define uint unsigned int
- #define uchar unsigned char
-
- //定义引脚
- sbit k1=P3^5;
- sbit k2=P3^6;
- sbit Trig=P2^5; //trig 发射脉冲
- sbit Echo=P3^2; //echo 接受脉冲
- sbit bg=P2^6;
- sbit beep=P3^3; //beep
- sbit led=P1^2;
- //定义固定显示
- uchar juli[5]={'A','.','A','A','m'};
- uchar set_juli[]={'A','.','A','A','m'};
- uchar zifu[]={'D','i','s',':'}; //Distance
- //定义全局变量
- uchar time0_flag=0; //定时器溢出中断
- uint time=0; //定时器定时时间
- uchar one_final=0; //一次测量完成
- uint distance=0.0,set_dis=100; //距离和设定报警距离
- void display();
- void Trig_SR04();
- void button_choose();
- void judge_baojing();
- void main()
- {
-
- EA=1; //外部中断0下降沿触发 定时器0加门控位 高电平开启
- TMOD=0x09; //16位 TR0=1; INT0=1; 开启
- TR0=1;
- EX0=1;
- IT0=1; //下降沿触发
-
- TH0=0;
- TL0=0;
- init(); //1602初始化
- Trig_SR04();
- while(1)
- {
- if(one_final) //一次完成后再次触发
- {
- Trig_SR04();
- one_final=0;
- }
- judge_baojing();
- display(); //液晶显示
- button_choose(); //按键调整
- }
- }
- void INT0_hander() interrupt 0
- {
- time = TH0*256+TH0; // time us
- distance=time*0.0170; //cm 34000cm*10e-6*time/2
- one_final=1;
- TH0=0;
- TL0=0;
- }
- void Trig_SR04() //仿真里是地脉冲触发
- {
- Trig=0;
- Trig=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- Trig=0;
- }
- void judge_baojing()
- {
- uint time_baojing,i;
- if(distance<set_dis)
- {
- time_baojing=distance*10;
- for (i=0;i<time_baojing;i++)
- {
- DelayUs2x(100);
- beep=!beep; //BEEP取反
- }
- for (i=0;i<time_baojing;i++)
- {
- led=~led;
- DelayUs2x(time_baojing);
- }
- }
- }
- void display()
- {
- if(distance<5) //测量值小于下限
- {
- juli[0]='-';
- juli[2]='-';
- juli[3]='-';
- }
- else if(distance>500) //测量值大于上限
- {
- juli[0]='C';
- juli[2]='C';
- juli[3]='C';
- }
- else
- {
- juli[0]=distance/100+'0';
- juli[2]=distance/10%10+'0';
- juli[3]=distance%10+'0';
- }
- set_juli[0]=set_dis/100+'0';
- set_juli[2]=set_dis/10%10+'0';
- set_juli[3]=set_dis%10+'0';
-
- LCD_Write_String(11,0,juli); //显示测距
- LCD_Write_String(5,0,zifu); //显示distance
- LCD_Write_String(11,1,set_juli); //显示报警距离
- }
- void button_choose()
- {
- uint k,e,xs; //e 控制个性化显示 xs显示周期
- uchar a1,a2,a3,n=0,m=0,z=0; //按键调整 a1,a2,a3调整设定距离的三位从高到低 nmz控制循环
- if(!k1) //按键处理程序
- {
- EA=0;
- TR0=0;
- set_juli[0]='A';
- set_juli[1]='.';
- set_juli[2]='A';
- set_juli[3]='A';
- set_juli[4]='m';
- LCD_Write_String(11,1,set_juli);
- k=500;
- while(k)
- {
- k--;
- DelayMs(2);
- }
- set_juli[0]=set_dis/100+'0';
- set_juli[2]=set_dis/10%10+'0';
- set_juli[3]=set_dis%10+'0';
- LCD_Write_String(11,1,set_juli);
- a1=set_dis/100;
- a2=set_dis/10%10;
- a3=set_dis%10;
-
-
- //按键调整最小距离
- n=1;
- while(n)
- {
- if(!k2)
- {
- while(!k2);
- e=1;
- xs=3;
- a1+=1;
- if(a1>5)
- a1=0;
- juli[0]=a1+'0';
- }
- if (e==1)
- {
- xs++;
- juli[0]=a1+'0';
- if(xs>6)
- {
- xs=0;
- e=0;
- }
- }
- else
- {
- juli[0]=' ';
- xs++;
- if(xs>3)
- {
- xs=0;
- e=1;
- }
- }
- LCD_Write_String(11,1,juli);
- if(!k1)
- {
- while(!k1);
- juli[0]=a1+'0';
- m=1;
- while(m)
- {
- if(!k2)
- {
- while(!k2);
- e=1;
- xs=3;
- a2+=1;
- if(a2>9)
- a2=0;
- juli[2]=a2+'0';
- LCD_Write_String(11,1,juli);
- }
- if (e==1)
- {
- xs++;
- juli[2]=a2+'0';
- if(xs>6)
- {
- xs=0;
- e=0;
- }
- }
- else
- {
- juli[2]=' ';
- xs++;
- if(xs>3)
- {
- xs=0;
- e=1;
- }
- }
- LCD_Write_String(11,1,juli);
-
- if(!k1)
- {
- while(!k1);
- juli[2]=a2+'0';
- z=1;
- while(z)
- {
- if(!k2)
- {
- while(!k2);
- e=1;
- xs=3;
- a3+=1;
- if(a3>9)
- a3=0;
- juli[3]=a3+'0';
- LCD_Write_String(11,1,juli);
- }
- if (e==1)
- {
- xs++;
- juli[3]=a3+'0';
- if(xs>6)
- {
- xs=0;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
附件如下:带仿真和keil源码
51超声波测距报警.zip
(113.86 KB, 下载次数: 382)
|