本帖最后由 余超 于 2018-12-16 13:52 编辑
一、任务要求:
用超声波测距模块测量物体距离,并通过蓝牙模块将距离信息发送给手机。
二、工作环境:
开发环境:keil C51 使用芯片:STC89C52 外设:超声波测距模块、蓝牙模块。
三、实现步骤:
编写一个超声波测距函数,通过定时器0来实现脉冲宽度的测量,在main函数循环体
中每隔一秒钟读取一次测距结果,并通过蓝牙将距离信息发送到手机上。
源码:
[C] syntaxhighlighter_viewsource syntaxhighlighter_copycode
#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
sbit TrigPin = P1^1;//发送引脚
sbit EchoPin = P1^2;//接收引脚
typedef unsigned int uint;
typedef unsigned char uchar;
uint num=0;
void delay(unsigned int ms)
{
unsigned int x;
for(;ms>0;ms--)
for(x=114;x>0;x--)
;
}
void delayMicroseconds()//延迟12微秒
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void UART_INIT()
{
SM0 = 0;
SM1 = 1;//串口工作方式1
REN = 0;//允许串口接收
EA = 1;//开总中断
ET0=1;//开启定时器0中断
TMOD = 0x29;//定时器1_8位自动重装模式,定时器0_16位定时器,开启门控
TH1 = 0xfd;
TL1 = 0xfd;//9600波特率
TR1 = 1;//启动定时器1
TR0=1;//启动定时器0
}
float sr04_read(void)
{
float distance;
num=0;
TH0=0x4c;//定时器复位
TL0=0x02;
TrigPin=0;//拉低发送端
_nop_();//延迟3微秒
_nop_();
_nop_();
TrigPin=1;//拉高发送端
delayMicroseconds();//延迟十二微秒
TrigPin=0;//拉低发送端
while(!EchoPin);//等待接收端电平变高
while(EchoPin);//等待接收端电平变低
distance=num*50+((TH0-0X4c)*256+(TL0-0x02))*1.085/1000;//正脉冲时间(毫秒)
distance = distance*340/2000;//距离(M)
distance = distance*100;//距离(CM)
return distance;
}
void main()
{
float distance;
UART_INIT();//串口初始化
while(1)
{
distance = sr04_read();//读出距离
TI=1;
printf("distance:%.2f CM\n",distance);//串口发送距离
TI=0;
delay(1000);//延迟1秒
}
}
void timer0() interrupt 1//定时器0中断服务程序
{
TH0=0x4c;
TL0=0x02;
num++;
if(num==20)
{
num=0;
}
}
}
工程文件.zip
(33.01 KB, 下载次数: 0)
四、实现效果及问题:
初期通过51单片机通过了测试,不过当我用stm32开发板做的时候,发现超声波模块发送端引脚似乎出现了问题,
不知道是不是被烧坏了,连最初成功的51开发板也测试失败了。然而其他引脚都OK,讲道理在百分之99以上时间里,
发送端的电平都应该是低电平,然而我通过杜邦线将超声波发送端与单片机定义的发送端(连接有外设LED灯,低电平点亮)
连在一起后,之前成功的时候本来是比较亮的,结果灯变得特别暗(两端压差太小?),不言而喻,功能实现不了,
不知道是什么原因,姑且认为模块坏了吧。。。
成功的结果:
失败的结果:(右边的灯特别暗,因此被识别为常高电平,而不能驱动接收端产生正脉冲?)功能无法实现
|