硬件设计
(末尾附文件)
功能需求
1) 基本任务
(1) 当车距(HC-SR04 超声波测距的位置)离障碍物小于 1 米,报警器响起, 发出一定
频率的“滴滴” 声音, 报警指示灯闪烁。
(2) LCD1602 液晶屏显示超声波模块安装位置与障碍物之间的距离。
2) 扩展任务:
(1) 随着车距与障碍物的距离的缩小,报警器声音越来越尖锐急促(声音频率越来越高)。
(2) 随着车距与障碍物的距离的缩小, 报警指示灯闪烁频率增加。
(3) 按键调整报警门限距离, 当车距离障碍物小于该值(默认值为 1 米),声音报警。
(4) LCD1602 第一行显示超声波模块安装位置与障碍物之间的距离;第二行实时显示按
键所调整的报警门限距离。
仿真图1:
仿真图2:
程序设计
#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; //beepsbit 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/2one_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); //显示distanceLCD_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;e=0;}}else{juli[3]=' ';xs++;if(xs>3){xs=0;
.
文件仅供参考:
链接:/s/1aLpBes_6oo0J3nl2QSvQBg
提取码:z8ya
.