|
1) 基本任務(wù)
(1) 當(dāng)車距(HC-SR04 超聲波測距的位置)離障礙物小于 1 米,報警器響起, 發(fā)出一定
頻率的“滴滴” 聲音, 報警指示燈閃爍。
(2) LCD1602 液晶屏顯示超聲波模塊安裝位置與障礙物之間的距離。
2) 擴(kuò)展任務(wù):
(1) 隨著車距與障礙物的距離的縮小,報警器聲音越來越尖銳急促(聲音頻率越來越高)。
(2) 隨著車距與障礙物的距離的縮小, 報警指示燈閃爍頻率增加。
(3) 按鍵調(diào)整報警門限距離, 當(dāng)車距離障礙物小于該值(默認(rèn)值為 1 米),聲音報警。
(4) LCD1602 第一行顯示超聲波模塊安裝位置與障礙物之間的距離;第二行實時顯示按
鍵所調(diào)整的報警門限距離。
倒車?yán)走_(dá)仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
倒車?yán)走_(dá)的單片機(jī)源程序如下:- #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 發(fā)射脈沖
- 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; //距離和設(shè)定報警距離
- void display();
- void Trig_SR04();
- void button_choose();
- void judge_baojing();
- void main()
- {
-
- EA=1; //外部中斷0下降沿觸發(fā) 定時器0加門控位 高電平開啟
- TMOD=0x09; //16位 TR0=1; INT0=1; 開啟
- TR0=1;
- EX0=1;
- IT0=1; //下降沿觸發(fā)
-
- TH0=0;
- TL0=0;
- init(); //1602初始化
- Trig_SR04();
- while(1)
- {
- if(one_final) //一次完成后再次觸發(fā)
- {
- Trig_SR04();
- one_final=0;
- }
- judge_baojing();
- display(); //液晶顯示
- button_choose(); //按鍵調(diào)整
- }
- }
- 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() //仿真里是地脈沖觸發(fā)
- {
- 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; //按鍵調(diào)整 a1,a2,a3調(diào)整設(shè)定距離的三位從高到低 nmz控制循環(huán)
- 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;
-
-
- //按鍵調(diào)整最小距離
- 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黑下載附件…………
復(fù)制代碼
附件如下:帶仿真和keil源碼
51超聲波測距報警.zip
(113.86 KB, 下載次數(shù): 382)
2020-11-22 09:23 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|