51单片机超声波测距代码

2025-03-11 00:43:17
推荐回答(2个)
回答1:

#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; 
}

回答2:

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);
}
}