[51单片机]HC-SR04超声波模块与1602液晶显示
一,模块介绍
trig-使能引脚<输出超过10us高电平启动模块>
echo-接收引脚<模块启动后在此脚发出8个40khz脉冲并产生高电平,高电平开始到结束的时间就是探测时间>
vcc-电源
gnd-接地
二,使用
trig 与 echo 接单片机IO口;
vcc 与 gnd 接单片机VCC,GND;
代码:
#include<reg52.h>
#include<intrins.h>
void delay(unsigned char z)//延时 z 个毫秒
{
unsigned char x,y;
for(x=0;x<z;x++)
{
for(y=0;y<110;y--)
{
;
}
}
}
/***********************LCD1602**************************/
sbit EN = P2^7;
sbit RS = P2^6; //数据/命令选择 1/0
sbit RW = P2^5; //读/写选择 1/0
void lcd_bus() //检测忙
{
unsigned char i;
P0 = 0XFF;
RS = 0;
RW = 1;
for(i=0;i<200;i++)
{
EN = 0;
EN = 1;
if(!(P0&0X80))
{
break;
}
}
EN = 0;
}
void lcd_date(unsigned char date) //写数据
{
lcd_bus();
RS = 1;
RW = 0;
P0 = date;
delay(5);
EN = 1;
delay(5);
EN = 0;
}
void lcd_com(unsigned char com) //写命令
{
lcd_bus();
RS = 0;
RW = 0;
P0 = com;
delay(5);
EN = 1;
delay(5);
EN = 0;
}
/***********************超声波**************************/
unsigned int distance[]={0,0,0,0};
sbit trig = P1^0;
sbit echo = P1^1;
void trigger();
void calculate();
void loop()
{
trigger();
while(!echo);
TR0 = 1;
while(echo);
TR0 = 0;
//TH0 = 0; 错误!!!!
//TL0 = 0; 后面要用到!
calculate();
delay(5);
}
void trigger() //触发模块启动
{
trig = 0;
trig = 1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
trig = 0;
}
void calculate() //计算距离
{
unsigned int x,y;
x = TH0 * 256 +TL0;
x *= 12/11.0592;
y = x * 0.017;//此时 Y 就是距离
TH0 = 0;
TL0 = 0;
distance[3] = y / 1 % 10; //个
distance[2] = y / 10 % 10; // 十
distance[1] = y / 100 % 10; // 百
distance[0] = y / 1000 % 10; // 千
}
void lcd_display() //显示距离
{
unsigned char i;
lcd_com(0x80+0x40);
for(i=0;i<4;i++)
{
lcd_date(0x30+distance[i]);
delay(5);
}
}
/***********************初始化**************************/
void init()
{
EA = 1;
ET0 = 1;
TMOD = 0X01;
TH0 = 0;
TL0 = 0;
lcd_com(0x38);
lcd_com(0x0c);
lcd_com(0x06);
lcd_com(0x01);
}
/***********************主函数**************************/
void main()
{ /* */
unsigned char yi[] = {"The Distace is :"};
unsigned char er[] = {"cm"};
unsigned int k = 0;
init();
lcd_com(0x80);
for(k=0;k<16;k++)
{
lcd_date(yi[k]);
delay(5);
}
lcd_com(0x80+0x44);
for(k=0;k<2;k++)
{
lcd_date(er[k]);
delay(5);
}
//lcd_com(0x80+0x40);
while(1)
{
loop();
lcd_display();
}
}