51单片机超声波测距代码 20
51单片机超声波测距代码stc89c52单片机,求一个测距程序,只要可以实时测出距离就可以了,不需要显示,echo口和trig口分别为P2^0和P2^1,如果距离大于一个...
51单片机超声波测距代码stc89c52单片机,求一个测距程序,只要可以实时测出距离就可以了,不需要显示,echo口和trig口分别为P2^0和P2^1,如果距离大于一个数,我可以调用某个函数,最重要的是实时检测距离,谢谢,如果感觉我描述不清楚请直接问我
展开
展开全部
#include <reg51.h>
#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;
}
追问
本人小白,问一下,是不是只要把接口改了,代码就可以直接使用了?因为我还想在距离大于某个数值时加一个run(自己定义的)函数
或者说,只需要测距就可以了,不需要用1602屏显示,测出后判断是否大于某个值,然后添加自己的函数
上海科坤工业科技发展有限公司
2018-12-26 广告
2018-12-26 广告
当超声波束在液体中传播时,液体的流动将使传播时间产生微小变化,并且其传播时间的变化正比于液体的流速,其关系符合下列表达式。θ为声束与液体流动方向的夹角。M 为声束在液体的直线传播次数。D 为管道内径。Tup 为声束在正方向上的传播时间。Td...
点击进入详情页
本回答由上海科坤工业科技发展有限公司提供
展开全部
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);
}
}
接口程序里边都有、、
#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);
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询