|
#include"reg52.h"
#include <intrins.h>
#define uint unsigned int //偷懶
#define uchar unsigned char
sbit RS = P1^0;
sbit RW = P1^1; //
sbit EN = P2^5;
sbit trig=P2^1; //超聲波觸發(fā)引腳
sbit echo=P2^0; //超聲波接收引腳
bit flag1;
uchar count;
long int distance;
unsigned char code table[]={"0123456789"};
void delay(uint n) //延時(shí)函數(shù)
{
uint x,y;
for(x=n;x>0;x--)
for(y=110;y>0;y--);
}
void T0_init() //T0中斷初始化
{
TMOD=0x01; //定義計(jì)時(shí)器0工作方式為1
TL0=0x66; //裝入初始值
TH0=0xfc;
ET0=1; //開定時(shí)器0中斷
EA=1; //開總中斷
}
int delay_ms(unsigned char xms)
{
unsigned char x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
return 0;
}
int write_com(unsigned char com)//寫命令的函數(shù)體
{
RS = 0; //寫指令
RW = 0;
P0 = com;
delay_ms(5);
EN = 1;
delay_ms(5);
EN = 0;
return 0;
}
int write_date(unsigned char date)//寫數(shù)據(jù)的函數(shù)體
{
RS = 1; //寫數(shù)據(jù)
RW = 0;
P0 = date;
delay_ms(5);
EN = 1;
delay_ms(5);
EN = 0;
return 0;
}
int init()//初始化函數(shù)體
{
EN = 0;
write_com(0X38);//設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
write_com(0X0C);//設(shè)置開顯示,不顯示光標(biāo)
write_com(0X06);//寫一個(gè)字符時(shí),光標(biāo)自動+1
write_com(0X01);//顯示清零
return 0;
}
void dis() //顯示固定字符
{
write_com(0x80+0x40); //設(shè)定輸入位置
write_date('d'); //輸入用'',不可以用""
write_date('i');
write_date('s');
write_date('t');
write_date('a');
write_date('n');
write_date('c');
write_date('e');
write_date(':');
write_com(0x80+0x4c); //設(shè)定輸入位置
write_date('.');
write_com(0x80+0x4e); //設(shè)定輸入位置
write_date('c');
write_date('m');
}
void trigger() //超聲波模塊觸發(fā)函數(shù)
{
trig=1; //打開超聲波觸發(fā)端口
delay(1);
trig=0; //關(guān)閉超聲波觸發(fā)端口
}
void measure_init() //測量函數(shù)初始化
{
trig=0; //觸發(fā)端口低電平
echo=0; //接收端口低電平
count=0;
}
void measure() //測距函數(shù)
{
uchar a;
uint b,c;
TR0=1; //打開定時(shí)器
while(echo) //當(dāng)超聲波接收打開時(shí)計(jì)時(shí)
{
;
}
TR0=0; //關(guān)閉定時(shí)器
a=TL0; //a,b分別賦予中斷函數(shù)高八位和第八位計(jì)時(shí)后的數(shù)值
b=TH0;
c=(b<<8)+a; //高八位左移八位之后與低八位做加法運(yùn)算
c=c-0xfc66; //減去初始值高八位和低八位
distance=c+1000*count; //總的時(shí)間,單位是μs
TL0=0x66; //重新裝入初始值
TH0=0xfc;
delay_ms(30);
distance=3453*distance/20000; //計(jì)算距離,單位是cm
}
/*
距離計(jì)算原理:所求t μs,distance=t*0.34(聲速340m/s=0.34cm/μs)/2
*/
void echodisplay(uint x) //顯示距離函數(shù)
{
uchar q,b,s,g;
q=x/1000; //將測量函數(shù)測得的distance分為個(gè)位,十位,百位,千位
b=(x/100)%10;
s=(x/10)%10;
g=x%10;
write_com(0x80+0x49); //設(shè)定輸出位置
write_date(table[q]); //寫入數(shù)據(jù)
write_date(table[b]);
write_date(table[s]);
write_com(0x80+0x4d); //設(shè)定輸入位置
write_date(table[g]); //寫入數(shù)據(jù)
}
void main() //主函數(shù)
{
init(); //初始化LCD
T0_init(); //初始化T0計(jì)時(shí)器
measure_init();//初始化超聲波測量模塊
while(1) //循環(huán)
{
dis(); //顯示固定字符
trigger(); //觸發(fā)超聲波測距
while(echo==0)//當(dāng)接收端沒有打開的時(shí)候在這里循環(huán)
{
;
}
measure();//測量距離distance
echodisplay(distance);//顯示距離distance
measure_init();//再次初始化測距模塊
delay_ms(500);//測量間隔500ms
}
}
void T_0() interrupt 1 //計(jì)時(shí)器中斷函數(shù)T0
{
TF0=0; //計(jì)時(shí)器溢出中斷 標(biāo)志位
TL0=0x66; //填入初始數(shù)據(jù)
TH0=0xfc;
count++; //產(chǎn)生一次中斷就加一
if(count==18) //當(dāng)計(jì)數(shù)到達(dá)18的時(shí)候,約1s
{
TR0=0; //關(guān)閉計(jì)時(shí)器中斷0
TL0=0x66; //重新裝入初始值
TH0=0xfc;
count=0; //把count清零
}
}
|
|