超声波程序LCD1602显示
时间:10-02
整理:3721RD
点击:
#include<reg51.h>
#include<intrins.h>
sbit Echo=P1^1;
sbit Trig=P1^2;
sbit RS=P1^0;
sbit RW=P1^1;
sbit LCDEN=P2^5;
unsigned int time=0;
unsigned int timer=0;
unsigned int S=0;
bit flag=0;
unsigned char table[]={'0','1','2','3','4','5','6','7','8','9'};
unsigned char disbuff[4]={0,0,0,0};
//延时函数
void delay_1ms(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//延时函数
void delay_50us(unsigned int t)
{
unsigned char i;
for(;t>0;t--)
for(i=19;i>0;i--);
}
void write_byte(unsigned char date,bit i) //写入数据或者是指令,i就是这个参数
{
RW=0;
LCDEN=0;
RS=i;
P0=date;
delay_50us(20);
LCDEN=1;
delay_50us(20);
LCDEN=0;
}
//液晶的初始化
void init_1602()
{
delay_1ms(15);
write_byte(0x38,0);
delay_1ms(5);
write_byte(0x38,0);
delay_1ms(5);
write_byte(0x38,0);
write_byte(0x38,0);
write_byte(0x0c,0);
write_byte(0x06,0);
write_byte(0x01,0);
}
void display_1602(unsigned char y,unsigned char x,unsigned char value)
{
y=y&0x01; //确定是在那个行,这个语句使得y为0或者是1
x=x&0x0f; //确定是行的第几个,这个语句使得为0~15
if(y)
{
x=0x80+0x40+x;
}
else
x=0x80+x;
write_byte(x,0);
write_byte(value,1);
}
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100;
if((S>=400)||(flag==1))
{
flag=0;
disbuff[0]='_';
disbuff[1]='_';
disbuff[2]='_';
}
else
{
disbuff[0]=table[S/100];
disbuff[1]=table[S/10%10];
disbuff[2]=table[S%10];
}
}
void main(void)
{
init_1602();
display_1602(0,0,'D');
display_1602(0,1,'E');
display_1602(0,2,'S');
display_1602(0,3,':');
TMOD=0x11;
TH0=0;
TL0=0;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
ET0=1;
ET1=1;
TR1=1;
EA=1;
Trig=0;
Echo=0;
while(1)
{
while(!Echo);
TR0=1;
while(Echo);
TR0=0;
Conut();
display_1602(0,4,disbuff[0]);
display_1602(0,5,disbuff[1]);
display_1602(0,6,disbuff[2]);
}
}
void T0_timer() interrupt 1
{
flag=1;
}
void T1_timer() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
timer++;
if(timer>=5)
{
TR1=0;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
timer=0;
Trig=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Trig=0;
TR1=1;
}
}
#include<intrins.h>
sbit Echo=P1^1;
sbit Trig=P1^2;
sbit RS=P1^0;
sbit RW=P1^1;
sbit LCDEN=P2^5;
unsigned int time=0;
unsigned int timer=0;
unsigned int S=0;
bit flag=0;
unsigned char table[]={'0','1','2','3','4','5','6','7','8','9'};
unsigned char disbuff[4]={0,0,0,0};
//延时函数
void delay_1ms(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//延时函数
void delay_50us(unsigned int t)
{
unsigned char i;
for(;t>0;t--)
for(i=19;i>0;i--);
}
void write_byte(unsigned char date,bit i) //写入数据或者是指令,i就是这个参数
{
RW=0;
LCDEN=0;
RS=i;
P0=date;
delay_50us(20);
LCDEN=1;
delay_50us(20);
LCDEN=0;
}
//液晶的初始化
void init_1602()
{
delay_1ms(15);
write_byte(0x38,0);
delay_1ms(5);
write_byte(0x38,0);
delay_1ms(5);
write_byte(0x38,0);
write_byte(0x38,0);
write_byte(0x0c,0);
write_byte(0x06,0);
write_byte(0x01,0);
}
void display_1602(unsigned char y,unsigned char x,unsigned char value)
{
y=y&0x01; //确定是在那个行,这个语句使得y为0或者是1
x=x&0x0f; //确定是行的第几个,这个语句使得为0~15
if(y)
{
x=0x80+0x40+x;
}
else
x=0x80+x;
write_byte(x,0);
write_byte(value,1);
}
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100;
if((S>=400)||(flag==1))
{
flag=0;
disbuff[0]='_';
disbuff[1]='_';
disbuff[2]='_';
}
else
{
disbuff[0]=table[S/100];
disbuff[1]=table[S/10%10];
disbuff[2]=table[S%10];
}
}
void main(void)
{
init_1602();
display_1602(0,0,'D');
display_1602(0,1,'E');
display_1602(0,2,'S');
display_1602(0,3,':');
TMOD=0x11;
TH0=0;
TL0=0;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
ET0=1;
ET1=1;
TR1=1;
EA=1;
Trig=0;
Echo=0;
while(1)
{
while(!Echo);
TR0=1;
while(Echo);
TR0=0;
Conut();
display_1602(0,4,disbuff[0]);
display_1602(0,5,disbuff[1]);
display_1602(0,6,disbuff[2]);
}
}
void T0_timer() interrupt 1
{
flag=1;
}
void T1_timer() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
timer++;
if(timer>=5)
{
TR1=0;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
timer=0;
Trig=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Trig=0;
TR1=1;
}
}
已经实践过了,可以直接用的。