#include
#define uchar unsigned char
#define uint unsigned int
#define LCD_DATA P2
sbit LCD_BL=P1^0;
sbit LCD_RS=P1^1;
sbit LCD_RW=P1^2;
sbit LCD_EN=P1^3;
sbit TRIG=P0^0;
sbit ECHO=P0^1;
bit flag=0;
uchar time,b,s,g;
uint l;
uchar code num_tab[]="0123456789";
void delay1602(uint z);
void delay10ms(uint x);
void write_com(uchar com);
void write_dat(uchar dat);
void init_t0();
void init_lcd1602();
void Get_L();
void display();
void main()
{
LCD_BL=0;
TRIG=0;
init_t0();
init_lcd1602();
delay10ms(50);
while(1)
{
Get_L();
display();
delay10ms(6);
}
}
void delay1602(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay10ms(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=1149;j>0;j--);
}
void write_com(uchar com)
{
LCD_RW=0;
LCD_RS=0;
LCD_DATA=com;
LCD_EN=1;
delay1602(5);
LCD_EN=0;
}
void write_dat(uchar dat)
{
LCD_RW=0;
LCD_RS=1;
LCD_DATA=dat;
LCD_EN=1;
delay1602(5);
LCD_EN=0;
}
void init_lcd1602()
{
write_com(0x38);
write_com(0x38);
write_com(0x38); //设置8位格式,2行5x7点阵
write_com(0x0c); //开显示,关光标,不闪烁
write_com(0x06); //文字不动,光标自动右移
write_com(0x01); //清屏并光标复位
}
void init_t0()
{
TMOD=0x01;
TH0=0x00;
TL0=0x00;
}
void display()
{
if(l!=0)
{
b=l/100;
s=l%100/10;
g=l%10;
write_com(0x00|0x80);
write_dat(num_tab[b]);
write_dat(num_tab[s]);
write_dat(num_tab[g]);
write_dat('c');
write_dat('m');
}
}
void Get_L()
{
TRIG=1;
delay10ms(1);
TRIG=0;
while(ECHO!=1);
TR0=1;
while((ECHO!=0)&(TH0<0x4f));
TR0=0;
l=TH0;
l<<=8;
l+=TL0;
if((l<174) | (l>20300))
{
l=0;
flag=1;
}
else
l=(l*1.085)/58;
TH0=0x00;
TL0=0x00;
}
1602液晶显示 的超声波模块程序
接口程序里边都有、、
#include
//#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P2^3;
sbit lcden=P2^2;
sbit trig=P2^0; //超声波发送
//sbit echo=P3^2; //超声波接受
//P0____________DB0-DB7
uchar dis[]="Disp_HC-SR04";
uchar num[]="0123456789";
uint distance;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=121;y>0;y--);
}
void HC_init()
{
TMOD=0x09;
TR0=1;
TH0=0;TL0=0;
}
uint HC_jisuan()
{
uint dist,timer;
timer=TH0;
timer<<=8;
timer=timer|TL0;
dist=timer/53; //晶振11.0592MHz 距离cm=微秒us/58
return dist; //1个机器周期是12个时钟周期 timer*12/(58*11.0592)=timer/53
}
void HC_run()
{
uint tempH=0x00,tempL=0x00;
TH0=0;TL0=0;
trig=0;
trig=1;
delay(1);
trig=0;
while((TH0-tempH!=0||TL0-tempL!=0)||(TH0==0&&TL0==0))
{
tempH=TH0;
tempL=TL0;
}
delay(1);
}
void lcd_write_com(uchar com) //LCD写指令
{
lcdrs=0;
P0=com;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
void lcd_write_data(uchar date) //LCD写数据
{
lcdrs=1;
P0=date;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
void lcd_init() //LCD初始化
{
lcden=0;
lcd_write_com(0x38);
lcd_write_com(0x0c);
lcd_write_com(0x06);
lcd_write_com(0x01);
}
void lcd_display(uchar temp)
{
uint i;
lcd_write_com(0x82);
for(i=0;i<12;i++)
{
lcd_write_data(dis[i]);
}
lcd_write_com(0x80+0x41);
lcd_write_data('D');
lcd_write_data('i');
lcd_write_data('s');
lcd_write_data('t');
lcd_write_data('a');
lcd_write_data('n');
lcd_write_data('c');
lcd_write_data('e');
lcd_write_data(':');
lcd_write_data(num[temp/100]);
lcd_write_data(num[temp/10%10]);
lcd_write_data(num[temp%10]);
lcd_write_data('c');
lcd_write_data('m');
}
void main()
{
lcd_init();
HC_init();
while(1)
{
HC_run();
distance=HC_jisuan();
lcd_display(distance);
delay(200);
}
}