#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit E=P2^2; //1602使能引脚
sbit RW=P2^1; //1602读写引脚
sbit RS=P2^0; //1602数据/命令选择引脚
sbit trig=P2^7; //触发超声波
sbit echo=P3^2; //超声波响应输入
bit en_flag=1;
uchar t1=0,t2=0;
unsigned char i;
unsigned int t=0;
unsigned long S;
unsigned char code ASCII[19]={'0','1','2','3','4','5','6','7','8','9','.','-','M','J','U',' ','L','I',':'};
static unsigned char DisNum=0; //显示用指针
unsigned long S=0;
unsigned char disbuff[11]={0};
/************函数声明************/
void T_soundwave(); //发送超声波
void R_soundwave(); //接收超声波
void Count(unsigned int t); // 获取距离
void lcd_mang(); //判忙
void write_lcd1602(uchar cmd,uchar i) ; //1602写
void Outside_Init(void); //外部中断初始化
void Time1_init(); //定时器1初始化
void ini_lcd1602(); //1602初始化
void Delay_1ms(unsigned char i);
/********************************/
void delay(uchar a)
{
uchar i;
while(a--)
{
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
//判忙
void lcd_mang()
{
RS=0;
RW=1;
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
while(P0&0x80);
E=0;
}
//1602的写
void write_lcd1602(uchar cmd,uchar i) //当i为0时向1602写指令,为1时写数据
{
lcd_mang();
RS=i;
RW=0;
E=0;
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
P0=cmd;
E=0;
}
//1602的初始化
void ini_lcd1602()
{
write_lcd1602(0x38,0);
delay(1);
write_lcd1602(0x0c,0);
delay(1);
write_lcd1602(0x06,0);
delay(1);
write_lcd1602(0x01,0);
delay(1);
}
void T_soundwave()
{
uchar i;
trig=0;
trig=1;
for(i=0;i<10;i++);
trig=0;
}
void R_soundwave()
{
while(echo!=1);
TR1=1; //打开定时器1
EX0=1; // 打开外部中断
}
void Count(unsigned int t)
{
S=(t*1.7)/100;//距离单位cm
disbuff[0]=13;
disbuff[1]=14;
disbuff[2]=15;
disbuff[3]=16;
disbuff[4]=17;
disbuff[5]=18;
disbuff[6]=S%1000/100;
disbuff[7]=10;
disbuff[8]=S%1000%100/10;
disbuff[9]=S%1000%100%10;
disbuff[10]=12;
}
void Outside_Init(void)
{
EX0 = 0; //关外部中断0
IT0 = 1; //负边沿触发
EA = 1; //开总中断
}
void Time1_init()
{
TMOD=0x11; //GATE=1,计时器选用方式1
TH1=0x00;
TL1=0x00;
ET1=1;
}
void Delay_1ms(unsigned char i) //1ms延时
{
unsigned char x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
void Main()
{
Time1_init();
Outside_Init();
ini_lcd1602();
while(1)
{
T_soundwave();
R_soundwave();
while(en_flag!=1);
Count(t);
en_flag=0;
write_lcd1602( 0x80, 0) ;
for(i=0;i<=10;i++)
write_lcd1602(ASCII[disbuff[i]],1);
Delay_1ms(60);
}
}
void Int0(void) interrupt 0
{
TR1=0;
t1=TH1;
t2=TL1;
TH1=0;
TL1=0;
t=(t1<<8)+t2;
en_flag=1;
}