哪位高手有51单片机超声波模块测距LCD1602显示的电路图和C程序,跪求!!!!(超声波模块是买好的那种)

2024-12-29 08:49:47
推荐回答(3个)
回答1:

#include"reg52.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int

uchar code table[]={
'0','1','2','3','4','5','6','7','8','9'
};// 显示段码值0123456789

sbit LCD_EN=P3^4; //定义LCD使能端
sbit LCD_RS=P3^5; //定义LCD读写端
sbit dula=P2^6; //数码管段先端
sbit wela=P2^7; //数码管位先端

/***********************************************/
/**********超声波检测引脚和变量定义*******************************/
sbit Trig=P2^4;// 定义HC-SR04发送端
sbit Echo=P2^5;//定义HC-SR04接收端

uint gewei='0'; //测量距离的个位
uint shiwei='0'; // 测量距离的十位
uint baiwei='0'; //测量距离的百位
uint qianwei='0';

uint s,time,flag;
/***********************************************/
/**********延时MS函数*******************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

/***********************************************/
/**********延时uS函数*******************************/
void delay_uS(uint z)
{
while(z--);
}

/**********************************************8/
/**********写命令*******************************/
void write_com(uchar com)
{
LCD_RS=0;
LCD_EN=0;
delay(5);
P0=com;
LCD_EN=1;
delay(5);
LCD_EN=0;
}

void write_data(uchar date)
{
LCD_RS=1;
LCD_EN=0;
delay(5);
P0=date;
LCD_EN=1;
delay(5);
LCD_EN=0;
}
/**********************************************/

/***********************************************/
/**********LCD1602初始化函数*******************************/
void init()
{
dula=0;
wela=0;
LCD_EN=0;
write_com(0x38); //设置16X2显示,5X7点阵显示
write_com(0x0c); //开显示,不显光标
write_com(0x06); //显示一个字符后,地址指针加1且光标加1
write_com(0x01); //清屏
delay(5);
write_com(0x80+1); //从第一行0X10地址位开始显示
}

/***********************************************/
/**********计算距离函数*******************************/
void count(void)
{
time=TH0*256+TL0; //检测 所需时间
TH0=0;
TL0=0;
s=time*0.17*1.136*0.9674;// 计算距离,算出来的单位是CM
gewei=table[s%10];
shiwei=table[s/10%10];
baiwei=table[s/100%10];
qianwei=table[s/1000];

}
/***********************************************/
/**********T0中断函数*******************************/
void Time0() interrupt 1 //T0中断用作计数器溢出,超出测距范围
{
flag=1; //中断溢出标志
}

/***********************************************/
/**********启动模块函数*******************************/
void startmodle(void) //启动检测模块
{
uchar i;
// for(i=0;i<10;i++)
// {
Trig=1; //启动一次检测模块
delay_uS(20);
Trig=0; //停止向检测模块Trig端发送高电平
}
//}

/***********************************************/
/**********中断初始化函数*******************************/
void InterruptInit(void) //中断初始化
{
TMOD=0x01; //高T0工作方式为方式1,GATE=1
TH0=0;
TL0=0;
ET0=1; //允许T0中断
EA=1; // 开启总中断
}

/***********************************************/
/**********显示函数*******************************/
void Display(void)
{
write_com(0x80+1);
write_data(qianwei);
write_com(0x80+2);
write_data('.');
write_com(0x80+3);
write_data(baiwei);

write_com(0x80+4);
write_data(shiwei);
write_com(0x80+5);
write_data(gewei);
write_com(0x80+6);
write_data('M');

}
/***********************************************/
/**********主函数*******************************/
void main(void)
{
init(); //初始化LCD1602

while(1)
{
Display(); // 显示 距离,以M为单位
InterruptInit(); //中断初始化
startmodle(); // 启动检测模块
while(!Echo); //当接收为零时等待
TR0=1; //开启计数
while(Echo); //当接收为1计数并等待
TR0=0; //关闭计数
count(); //计算距离
Display(); // 显示 距离,以M为单位
delay(500); //延时80MS
}
}

回答2:

超声波模块一般会配套相应的应用程序的,你找卖家要相关的程序资料就是。

回答3:

我有个
怎么发给你啊

我很少百度 见我百度名字哈