基于STC89C51单片机的便携式测距仪系统

1.工作原理

QQ:961209458
V X:F9986858
采用STC51单片机微处理器进行计算。
采用四位数码管显示距离(单位毫米)及温度。
采用HC-SR04超声波模块、DS18B20温度传感器。
可以通过按键切换显示温度及距离,需要按一下测量一次距离。

超声波测距模块是用来测量距离的一种产品,通过发送和就接收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离。

HC-SR04这个模块是2线制的(不包含电源线),Echo与Trig,Trig负责接收10us以上的触发信号,Echo则是输出距离信号;下面是时序图:
基于STC89C51单片机的便携式测距仪系统_第1张图片

(1)采用 IO 触发测距,给至少 10us 的高电平信号;
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过 IO 输出一高电平
(4)超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;

接口定义:

Vcc、 Trig(控制端)、 Echo(接收端)、 Gnd

硬件电路图

基于STC89C51单片机的便携式测距仪系统_第2张图片

基于STC89C51单片机的便携式测距仪系统_第3张图片

部分核心代码

#include "reg52.h"
#include "delay.h"


//数码管码表
u8 code smgduan[11]={
     0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//显示0~9的值

//数码管位选引脚定义
sbit D1 = P2^0;
sbit D2 = P2^1;
sbit D3 = P2^2;
sbit D4 = P2^3;

sbit Key2 = P2^6;//测量距离

sbit Echo = P1^4;        //HC-SR04 接收端口
sbit Trig = P1^3;        //HC-SR04 发射端口

u16 time=0,S=0;
float V=346.0;//声音在空气中的速度346m/s

void Choose_W(u8 w);//数码管位选
void SMG_Display();//数码管显示
void Key();//按键
void Conut();//测量计算函数
void StartModule();//启动模块函数(触发一次,提供大于10us的高电平)


void main()
{
     
	TMOD=0x01; //设T0为方式1,GATE=1
    TH0=0;
    TL0=0;         
    ET0=1; //允许T0中断
	TR0=0;
    EA=1;  //开启总中断
	Trig = 0;//初始化
	
	while(1)
	{
     
		Key();//按键检测
		SMG_Display();//数码管显示
	}
}

void Key()
{
     
	if(Key2==0)//测量距离
	{
     
		delay_ms(10);//按键消抖
		if(Key2==0)
		{
     
			StartModule();  //开始发射超声波
			while(!Echo);   //当RX为零时等待
			TR0=1;          //开启计数
			while(Echo);    //当RX为1计数并等待
			TR0=0;          //关闭计数
			Conut();        //计算
			delay_ms(100);
		}
		while(Key2==0);//松手检测
	}
}

void StartModule()//启动模块函数(触发一次,提供大于10us的高电平)
{
     
    Trig=1;//启动一次模块
    Delayus(15);
    Trig=0;
}

void Conut()//测量计算函数
{
     
	time=TH0*256+TL0;//计算时间
	TH0=0;TL0=0;
	V=346;//计算速度值,单位是m/s
	S=(u16)(time*V/2000);//算出来是mm
}

void SMG_Display()//数码管显示
{
     
	u8 dalay_time;

		dalay_time=5;
		//距离显示
		Choose_W(1);    P0 = smgduan[S/1000];      delay_ms(dalay_time);P0=0X00;
		Choose_W(2);    P0 = smgduan[S%1000/100];  delay_ms(dalay_time);P0=0X00;
		Choose_W(3);    P0 = smgduan[S%100/10];    delay_ms(dalay_time);P0=0X00;
		Choose_W(4);    P0 = smgduan[S%10];        delay_ms(dalay_time);P0=0X00;
}


void Choose_W(u8 w)
{
     
	switch(w)	 //位选,选择点亮的数码管
	{
     
		case(1):
			D1=1;D2=0;D3=0;D4=0; break;//显示第1位
		case(2):
			D1=0;D2=1;D3=0;D4=0; break;//显示第2位
		case(3):
			D1=0;D2=0;D3=1;D4=0; break;//显示第3位
		case(4):
			D1=0;D2=0;D3=0;D4=1; break;//显示第4位
	}
}

Protues仿真

基于STC89C51单片机的便携式测距仪系统_第4张图片

你可能感兴趣的:(单片机,模块学习,单片机,stm32)