#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table0[]="yeah!";
unsigned int time;
unsigned int S,s_false;
uchar num,count;
uint shi,fen,miao;
bit flag ;
sbit Trig =P3^6;//定义引脚
sbit Echo=P3^7;
sbit lcdrs=P3^4;//命令数据
sbit lcdrw=P3^3;//读写
sbit lcde=P3^5;//能
sbit led=P1^0;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*void delay_20us()
{
uchar a ;
for(a=0;a<100;a++);
}
*/
//***************************************************************
void write_com(unsigned char com)
{
lcdrs=0;
P0=com;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void write_data(unsigned char zifu)
{
lcdrs=1;
P0=zifu;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
/********************************************************/
void T0_time() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=0; //中断溢出标志,失败
TH0=0;
TL0=0;
TR0=0; //关闭计数
}
/********************************************************/
void write_sfm(uchar add,uchar date) //输出时分秒
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);
write_com(0x80+0x42);
write_data(0x3a);
write_com(0x80+0x45);
write_data(0x3a);
write_com(0x80+0x49);
for(num=0;num<5;num++)
{
write_data(table0[num]);
delay(50);
}
write_com(0x80);
}
void T1_timer() interrupt 3 //中断
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(0,shi);
}
write_sfm(3,fen);
}
write_sfm(6,miao);
}
}
//
void write_temp(uint t_emp)
{
uchar qian,bai,shi1,ge1;
qian=t_emp/1000;
bai=(t_emp%1000)/100;
shi1=(t_emp%100)/10;
ge1=t_emp%10;
write_com(0x80);
write_data(0x30+qian);
delay(1);
write_data(0x30+bai);
delay(1);
write_data(0x30+shi1);
delay(1);
write_data(0x2e);
delay(1);
write_data(0x30+ge1);
delay(1);
write_data('c');
delay(1);
write_data('m');
delay(1);
delay(100);
}
void StartModule() //启动模块
{
Trig=1; //启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Trig=0;
}
/********************************************************/
void jisuan(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/10; //算出来是CM
if(((S<20)||(S>=6000))||flag==0) //超出测量范围显示“-”失败
{
// flag=1;
s_false=1000;
write_com(0x80);
write_data('e');
delay(5);
write_data('r');
delay(5);
write_data('r');
delay(5);
write_data('o');
delay(5);
write_data('r');
delay(5);
// write_temp(s_false);
}
else
{
write_temp(S);
}
}
/********************************************************/
/********************************************************/
void init()
{
lcde=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
lcdrw=0;
}
//***************************************************************
void main()
{
// unsigned char TempCyc;
delay(500); //启动等待,等LCM讲入工作状态
lcdrw=0;
init(); //LCM初始化
while(1)
{
TMOD=0x11; //设T0,T1为方式1,;
TH0=0;
TL0=0;
ET0=1; //允许T0中断
ET1=1;
TR1=1;
EA=1; //开启总中断
Trig=0;
Echo=0;
while(1)
{
StartModule();
flag=1;
// while(!Echo); //当echo为零时等待
while((!Echo)&&flag); //当echo为零时等待,中断flag跳出等待
TR0=1; //开启计数
while(Echo&&flag); //当echo为1计数并等待
TR0=0; //关闭计数
jisuan(); //计算
delay(100); //80MS
}
}
}