51单片机超声波距离测试仿真资料
功能说明:
51单片机控制、LCD1602显示、超声波传感器测试。
通过超声波传感器获取距离信息,然后控制LCD1602液晶屏显示传感器采集到的距离
资料包括:proteus仿真源文件+keil源码+设计报告。
Proteus仿真原理图:
参考代码
#include "stdio.h"
#include "reg52.h"
#include "ds18b20.h"
#include "delay.h"
#include "i2c.h"
#define uchar unsigned char
#define uint unsigned int
/* LCD屏幕端口定义 */
#define D P0
sbit E=P2^6;
sbit RW=P2^5;
sbit RS=P2^7;
sbit BTN1 = P2^0; //按键端口
sbit BTN2 = P2^1;
sbit BTN3 = P2^2;
sbit BTN4 = P2^3;
sbit Tr=P3^1;//触发信号
sbit Ec=P3^0;//回响信号
void Delay10us(void);//10us延时函数
void Delay1ms(void);//1ms延时函数
unsigned int Read_value(void);//读值函数
void InitTimer0(void);//定时器0初始化
void show(uint Out);//显示函数
void LcdWriteCom(uchar com); /* LCD1602写入8位命令子函数 */
void LcdWriteData(uchar dat) ; /* LCD1602写入8位数据子函数 */
void LcdInit(); /* LCD1602初始化子程序 */
void setAddr(unsigned char line ,unsigned char addr);
void setBuling(unsigned char YorN);
void Show_string1(uchar a[]); /* 第一行从头开始显示 字符 "" 双信号内直接加显示内容即可 */
void Show_string2(uchar a[]); /* 第二行 "" 双信号内直接加显示内容即可 */
void show_string(uchar add,uchar a[]); /* 指定位置显示字符串 注意 算好位置 0~27 40~67 地址值,"显示字符串" */
void show_number(uchar add,uint a); /* show_number(0x加 要显示的地址,变量或数字 */
void show_float(uchar add,float a); /* 显示浮点数 */
unsigned char readBtn(); /*获取按键值*/
void timer_init(); /*定时器*/
void main()
{
unsigned char i=0;
unsigned int distance = 0;
unsigned char btnVal = 0;
char string[17] = {0};
LcdInit(); /* LCD1602初始化函数 */
InitTimer0();//定时器0初始化
while(1) //程序主逻辑
{
InitTimer0(); //初始化定时器
distance = Read_value(); //获取距离值
sprintf(string,"dist:%ucm ",distance+1); //字符串格式化
Show_string1(string); //显示字符串
delay_ms(100); //延时
}
}
/********************读值距离函数***********************/
unsigned int Read_value()
{
float temp;
uint result;
Tr=1;//触发引脚发出11us的触发信号(至少10us)
Delay10us();
Tr=0;
while(!Ec);//度过回响信号的低电平
TR0=1;//开启定时器0
while(Ec);//度过回响信号高电平
TR0=0;//关闭定时器0
temp=TH0*256+TL0;//最终us时间
temp/=1000.0;//最终ms时间
temp*=17.0;//距离(cm) (17=光速34cm/ms 除2)
result=temp;//四舍五入
if(temp-result>=0.5)
{
result+=1;
}
return result;
}
/************************定时器0初始化*****************************/
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x00;
TL0 = 0x00;
TR0 = 0;//先关闭定时器0
}
/***********************10us延时函数*****************************/
void Delay10us()
{
uchar i;
i=2;
while(--i);
}
/***********************1ms延时函数*****************************/
void Delay1ms() //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
/* 向1602写命令函数
* 参数:com 命令
* 返回值 : 无
*/
void LcdWriteCom(uchar com)
{
E=0;
RW=0;
RS=0;
D=com;
delay_us(5);
E=1;
delay_us(5);
E=0;
}
/* 向1602写数据命令
* 参数: dat 数据
* 返回值: 无
*/
void LcdWriteData(uchar dat)
{
E=0;
RW=0;
RS=1;
D=dat;
delay_us(5);
E=1;
delay_us(5);
E=0;
}
/* LCD1602初始化函数
*/
void LcdInit()
{
LcdWriteCom(0x38);
LcdWriteCom(0x0c);//0x0C光标不闪
// LcdWriteCom(0x0d);//0x0D光标闪烁
LcdWriteCom(0x06);
LcdWriteCom(0x01);
LcdWriteCom(0x80);
}
/*设置光标位置 第一行0x00-0xF 第二行0x40-0x4f */
void setAddr(unsigned char line ,unsigned char addr)
{
if(line == 1)
LcdWriteCom(0x80+addr);
if(line == 2)
LcdWriteCom(0x80+0x40+addr);
}
/*设置光标闪烁*/
void setBuling(unsigned char YorN)
{
if(YorN)
LcdWriteCom(0x0d);//0x0D光标闪烁
else
{LcdWriteCom(0x0c);//0x0C光标不闪
}
}
/* 指定位置显示字符串
* 参数 add 地址 第一行 0~27
* 第二行 40~67
* a[] 字符串 "abc"
*/
void show_string(uchar add,uchar a[])
{
uchar i;
LcdWriteCom(0x80+add);
for(i=0;a[i]!='\0';i++)
{
LcdWriteData(a[i]);
}
}
/* 第一行显示字符串
*/
void Show_string1(uchar a[])
{
uchar i;
LcdWriteCom(0x80);
for(i=0;a[i]!='\0';i++)
{
LcdWriteData(a[i]);
}
}
/* 第二行显示字符串
*/
void Show_string2(uchar a[])
{
uchar i;
LcdWriteCom(0x80+0X40);
for(i=0;a[i]!='\0';i++)
{
LcdWriteData(a[i]);
}
}
/* 任意位置显示数字
*/
void show_number(uchar add,uint a)
{
char s[10];
sprintf(s,"%d",a);
show_string(add,(uchar *)s); /* 格式转换 */
}
/* 任意位置显示浮点数
*/
void show_float(uchar add,float a)
{
char s[10];
sprintf(s,"% .1f",a);/* 格式转换 */
show_string(add,(uchar *)s);
}
设计报告
关注下方公众号,在公众号回复“003”获取完整工程文件
或者点击链接下载