#include
#include
#include "LCD.H"
#include "delay.h"
#defineuint unsigned int
#defineuchar 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
{
time_baojing=distance*10;
for (i=0;i
{
DelayUs2x(100);
beep=!beep; //BEEP取反
}
for (i=0;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黑下载附件…………
如果觉得《单片机测距雷达c语言代码 51单片机超声波测距倒车雷达Proteus仿真+源代码》对你有帮助,请点赞、收藏,并留下你的观点哦!