#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit echo=P3^2;//接收端
sbit clk=P2^0;//脉冲输入
sbit lcdrs=P1^0;//液晶命令数据选择端
sbit lcdrw=P1^1;//读写选择端
sbit lcden=P1^2;//使能端
uint distance;
uchar num,flag1,flag2,timeh,timel;
uchar code table[]="distance: cm";
void delay(uint z)//延时1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)//液晶写命令
{
lcdrs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date) //液晶写数据
{
lcdrs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void display(uint distance)//液晶显示函数
{
uchar bai,shi,ge;
bai=distance%1000/100;
shi=distance%1000%100/10;
ge=distance%10;
write_com(0x89);
write_data(0x30+bai);
delay(2);
write_data(0x30+shi);
delay(2);
write_data(0x30+ge);
delay(2);
}
void csb_fs()//超声波发送
{
clk=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();//延时21us
clk=0;
}
void get_distance()
{
csb_fs();
delay(1);
while(echo==0);//等待接收信号
flag1=0;
flag2=0;
TH0=0X00;
TL0=0X00;
IT0=1;//下降沿触发
EX0=1;//开外部中断
ET0=1;//开定时器中断
TR0=1;//开始计时
while(echo==1)
{
if(flag2==1) break;
}
if(flag1==1)
{
distance=(timeh*256+timel)*0.0172;
display(distance);
}
if((flag1==0)&&(flag2==1))
{
distance=0;
display(distance);
}
}
void init()
{
lcdrw=0;
lcden=0;
distance=0;
clk=0;
EA=1;
EX0=0;
TMOD=0X01;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<14;num++)
{
write_data(table[num]);
delay(2);
}
}
void main()
{
init();
while(1)
{
get_distance();
delay(10);
}
}
void extenr0()interrupt 0
{
EX0=0;
TR0=0;
timeh=TH0;
timel=TL0;
flag1=1;
}
void timer0()interrupt 1
{
TF0=0;
TR0=0;
TH0=0;
TL0=0;
EX0=0;
flag2=1;
}
此帖出自
小平头技术问答
一周热门 更多>