#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define x1 0x80
#define x2 0x88
#define y 0x80
#define comm 0
#define dat 1
sbit fs=P2^7;
sbit cs = P2^0;
sbit std = P2^1;
sbit sclk = P2^2;
sbit psb = P2^3; //H=并口; L=串口;
sbit rst = P2^4; //Reset Signal 低电平有效
bit flag;
uint jsh,jsl;
float distance,t;
void wr_lcd (uchar dat_comm,uchar content);
void delay (uint us);
uchar data display [4] = {0x00,0x00,0x00,0x00};
uchar code tab1[]={
"倒车距离 "
" "
};
/*------------------初始化-----------------*/
void init_lcd (void)
{
rst=1;
psb=0;
wr_lcd (comm,0x30); /*30---基本指令动作*/
wr_lcd (comm,0x01); /*清屏,地址指针指向00H*/
delay (100);
wr_lcd (comm,0x06); /*光标的移动方向*/
wr_lcd (comm,0x0c); /*开显示,关游标*/
}
//----------上半屏显示汉字或字符------------
void chn_disp1 (uchar code *chn)
{
uchar i,j;
wr_lcd (comm,0x30);
wr_lcd (comm,0x80);
j=0;
for (i=0;i <16;i++)
wr_lcd (dat,chn[j*16+i]);
wr_lcd (comm,0x90);
j=1;
for (i=0;i <16;i++)
wr_lcd (dat,chn[j*16+i]);
}
/*--------------清DDRAM------------------*/
void clrram (void)
{
wr_lcd (comm,0x30);
wr_lcd (comm,0x01);
delay (180);
}
/*---------------------------------------*/
void wr_lcd (uchar dat_comm,uchar content)
{
uchar a,i,j;
delay (100);
a=content;
cs=1;
sclk=0;
std=1;
for(i=0;i <5;i++)
{
sclk=1;
sclk=0;
}
std=0;
sclk=1;
sclk=0;
if(dat_comm)
std=1; //data
else
std=0; //command
sclk=1;
sclk=0;
std=0;
sclk=1;
sclk=0;
for(j=0;j <2;j++)
{
for(i=0;i <4;i++)
{
a=a < <1;
std=CY;
sclk=1;
sclk=0;
}
std=0;
for(i=0;i <4;i++)
{
sclk=1;
sclk=0;
}
}
}
void computer(void)
{
t=(float)(jsh*256+jsl);
distance=t*0.172 ;
}
void timer0(void) interrupt 1
{
TR1=0;
if(flag=0) //20ms dao
{
fs=0; //此时超声波传感器处于发射状态
TH0=0xFF; //200us 定时
TL0=0x38;
TR1=1; //开始计时
flag=1;
}
else if (flag=1) //200USdao
{
fs=1; //此时超声波传感器处于接收状态
TH0=0xB1; //20ms 定时
TL0=0xE0;
delay(150); //延时大约1.5ms后开外中断0(避免余震的影响) 估计延时写在这有问题,请帮忙看看,谢谢
EX0=1; //开外部中断0
flag=0;
}
}
void jieshou(void) interrupt 0 using 1
{
TR1=0; //收到回波,停止计数
jsh=TH1;
jsl=TL1;
computer();
EX0=0;
}
Displayjl() //
{
display [3]=(uint)(distance)/1000+0x30 ;
display [1]=(uint)(distance)%1000 ;
display [2]=display [1]/100+0x30 ;
display [0]=display [1]%100;
display [1]=display [0]/10+0x30;
display [0]=display [0]%10+0x30;
if(display [3]==0x30) //高位为0,不显示
display [3]=0x20 ;
wr_lcd(comm,0x84);
wr_lcd(dat,display1[3]); //百位数显示
wr_lcd(dat,display1[2]); //十位数显示
wr_lcd(comm,0x85);
wr_lcd(dat,display1[1]); //个位数显示
wr_lcd(dat,0x2E);
wr_lcd(comm,0x86);
wr_lcd(dat,display1[0]); //小数位数显示
wr_lcd(dat,0x20);
wr_lcd(comm,0x87);
wr_lcd(dat,0x63);
wr_lcd(dat,0x6D);
}
/*------------------主程序--------------------*/
void main ()
{
TMOD=0x11; //两个定时器都工作在方式1
EA=1;
TR0=1;
ET0=1;
IT0=0; //设置外部中断0为低电平触发方式
IE0=1;
fs=1; //初始状态是接收状态
TH0=0xB1;
TL0=0xE0;
flag=0;
TH1=0;
TL1=0;
init_lcd ();
while (1)
{
clrram();
chn_disp1 (tab1);
delay1(80);
DS18B20_Read_Temperature();
DS18B20_Disp_Temperature();
Displayjl();
delay1 (5000);
}
}