单片机测距雷达c语言代码,51单片机超声波测距倒车雷达Proteus仿真+源代码

#include

#include

#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

{

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黑下载附件…………