003-51单片机超声波距离测试仿真

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”获取完整工程文件

或者点击链接下载

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值