STC12C5A60S2单片机驱动超声波

快速导航
STC12已封装好的函数库
请添加图片描述
超声波传播速度误差:
超声波的传播速度受空气的密度所影响, 空气的密度越高则超声波的传播速度就越快, 而空
气的密度又与温度有着密切的关系。
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
超声波处理函数ultrasonic.c

#include "ultrasonic.h"


static void Delay15us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	_nop_();
	i = 38;
	while (--i);
}

/*超声波触发*/
void TrigUltrasonic()
{
	TrigPin = 0;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	TrigPin = 1; //超声波模块Trig	控制端
	Delay15us();
	TrigPin = 0; //超声波模块Trig	控制端
}

/*====================================
函数名	:GetDistance
参数	:无
返回值	:获取距离单位毫米
描述	:超声波测距
通过发射信号到收到回响信号的时间测试距离
单片机晶振11.0592Mhz
注意测距周期为60ms以上
====================================*/
unsigned int GetDistance()
{
	unsigned int Distance = 0;	//超声波距离
	unsigned int  Time=0;		//用于存放定时器时间值
	TrigUltrasonic();	//超声波触发
	while(!EchoPin);  	//判断回响信号是否为低电平
	TR1 = 1;			//启动定时器1
	while(EchoPin);		//等待收到回响信号
	TR1 = 0;			//关闭定时器1
	Time=TH1*256+TL1;	//读取时间
	TH1=0;
	TL1=0;				//清空定时器
	Distance = (float)(Time*1.085)*0.17;//算出来是MM
	return(Distance);//返回距离
}

ultrasonic.h

#ifndef _ULTRASONIC_H
#define _ULTRASONTC_H

#include "config.h"

sbit EchoPin = P2^0;//超声波模块Echo	接收端
sbit TrigPin = P2^1;//超声波模块Trig	控制端

void TrigUltrasonic();
unsigned int GetDistance();

#endif

主函数,我写了一个读取超声波数据在OLED上显示,也可以通过串口打印出来

#include "config.h"
#include "OLED.h"
#include "STC12_Uart.h"
#include "ultrasonic.h"

bit Timer1Overflow;	//计数器1溢出标志位


//显示超声波测距中文字符
void Display_Chinese_Str()
{
	OLED_P16x16Ch(0, 0, 0);
	OLED_P16x16Ch(17, 0, 1);
	OLED_P16x16Ch(34, 0, 2);
	OLED_P16x16Ch(51, 0, 3);
	OLED_P16x16Ch(68, 0, 4);
}

/*定时器1初始化*/
void Timer1Init(void)		
{
	TMOD |= 0x10;	//定时器1工作模式1,16位定时模式。T1用测ECH0脉冲长度
	TH1 = 0;		   
    TL1 = 0;
	ET0 = 1;		//允许定时器0中断
	ET1 = 1;        //允许T1中断
	EA	= 1;		//总中断允许
}

//在OLED显示当前超声波距离,并通过串口发送出去
void Show_Distance(unsigned int Val)
{
	unsigned char disbuff[4]={0,0,0,0};//用于分别存放距离的值米,厘米,毫米
	if((Val  >= 5000) || Timer1Overflow == 1)//超出测量范围
	{
		Timer1Overflow = 0; //清除定时器溢出标志位
		OLED_Show_String(90, 0, "Out of range!!!");//显示这串字符串
		
		//串口发送数据
		prints("Out of range!!!");
	}
	else
	{
		OLED_Show_String(34, 4, "                ");//显示这串字符串
		/*显示距离单位毫米*/
		disbuff[0] = Val / 1000 + '0';			//距离数值千位
		disbuff[1] = Val % 1000 / 100 + '0';	//距离数值百位
		disbuff[2] = Val % 100 / 10 + '0';		//距离数值十位
		disbuff[3] = Val % 10 + '0';			//距离数值十位
		OLED_Show_Char(90, 0, disbuff[0]);
		OLED_Show_Char(90, 10, disbuff[1]);
		OLED_Show_Char(90, 20, disbuff[2]);
		OLED_Show_Char(90, 30, disbuff[3]);
		OLED_Show_Char(90, 40, 'm');
		OLED_Show_Char(90, 50, 'm');
		
		//串口发送数据
		prints(disbuff);
		prints("mm");
	}
}

void main()
{	
	OLED_Init(); 	//OLED初始化
	OLED_CLS();		//清屏
	UartInit();		//串口初始化,波特率9600
	Timer1Init();	//定时器初始化
	
	while(1)
	{
		Display_Chinese_Str();
		Show_Distance(GetDistance());
	}
}

//定时器1中断
void Timer1_Routine(void) interrupt 3
{
	Timer1Overflow = 1;	//计数器1溢出标志位
}
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值