#include"reg51.h"
#define uchar unsigned char
#define uint unsigned int
//这三个引脚参考资料
sbit E=P2^7; //1602使能引脚
sbit RW=P2^6; //1602读写引脚
sbit RS=P2^5; //1602数据/命令选择引脚
sbit trig=P1^0;
sbit echo=P3^2;
bit flag=0;
uchar Buffer[28] = "D= "; //所要发送的数据
uchar Buffer1[28] = "Ultrasonic test";
uchar Buffer2[28]="fall outside!";
uchar *m,*n;
void delay1(uint x)
{
int i,j;
for(i=0; i<=500; i++)
for(j=0; j<=x; j++)
;
}
// 1602写命令函数
void enable(uchar del)
{
P0 = del;
RS = 0;
RW = 0;
E = 0;
delay1(1);
E = 1;
delay1(1);
}
// 1602写数据函数
void write(uchar del)
{
P0 = del;
RS = 1;
RW = 0;
E = 0;
delay1(1);
E = 1;
delay1(1);
}
//1602初始化,请参考1602的资料
void L1602_init(void)
{
enable(0x01); //清屏
enable(0x38); //功能设定
enable(0x0c); //显示开、关设定
enable(0x06); //输入模式设定
}
// 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下L1602_char(1,5,'b')
void L1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang == 1) a = 0x80; //第一行地址80H
if(hang == 2) a = 0xc0; //第二行地址C0H
a = a + lie - 1;
enable(a);
write(sign);
}
// 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下L1602_string(1,5,"ab cd ef;")
void L1602_string(uchar hang,uchar lie,uchar *q)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
while(1)
{
if(*q == '\0') break;
write(*q);
q++;
}
}
void HS_init() //模块初始化
{
TMOD=0x09; //方式1,GATE=1
TH0=0;
TL0=0;
EA=1;
ET0=1;
}
void HS_run()
{ //发射超声波
trig=0;
trig=1;
delay1(1);
trig=0;
}
void chuli() //数据处理函数
{
float temp=0;
uint b,c;
c=TH0*256+TL0;
TH0=0;
TL0=0;
temp=(c*0.017); //单位是cm
b=temp*10;
if(b>4000||flag==1) //超范围
{
flag=0;
m=Buffer2;
}
else{
m=Buffer;
if(b/1000==0) //高位为0时不显示
Buffer[5]=' ';
else
Buffer[5]=b/1000+0x30;
if(b%1000/100==0&&b/1000==0)
Buffer[6]=' ';
else
Buffer[6]=b%1000/100+0x30;
Buffer[7]=b%100/10+0x30;
Buffer[8]=0x2E; //小数点“.”
Buffer[9]=b%10+0x30;
Buffer[11]=0x63; //字母“c”
Buffer[12]=0x6d; //字母“m”
}
}
void main()
{
m=Buffer;
n=Buffer1;
L1602_init();
HS_init();
L1602_string(1,1,n);
while(1)
{
HS_run();
while(!echo);
TR0=1;
while(echo);
TR0=0;
chuli();
L1602_string(2,1,m);
delay1(250);
}
}
void t0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}
|