#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; //中斷溢出標志
}
|