代码是基于STC89C52RC单片机芯片写的,有些地方引脚定义不同根据情况更换即口
HCSR04模块
超声波HCSR04模块的工作原理其实还是较为简单的,我们只需要通过IO口给超声波模块的Trig口一个至少10us的高电平信号,然后这个模块会自动发送8个40KHZ周期电平的脉冲并检测回波,回响信号的脉冲宽度和所测距离成正比。 我们都知道声音的传播速度是340m/s,声波碰到障碍物后再返回收到回波的时间我们知道了,那我们就可以通过公式 distance=(1.7*Time)/100 来计算距离。
void HC_SR04start()
{
HCSR04_Trig=1;
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
HCSR04_Trig=0;
}
void DistanceCount()
{
Time=TH0*256+TL0;
TH0=0;
TL0=0;
distance=(1.7*Time)/100;
TI=1;
if(distance>=450)
{
printf("erro");
}
printf("distance=%5.2fcm\n",distance);
TI=0;
}
蓝牙部分我是用的11.0592MHZ的晶振与蓝牙模块进行通讯的。12MHZ的晶振由于误差太大会无法通讯,我们可以用自己去算一下 12MHZ的9600的波特率情况下TH1=0XFD=253,这样每个6us就会溢出一次,溢出率为1/6=0.16666666666666666666666666666667,约去几位小数为0.166666MHZ=166,666HZ,再除以16得10,416.6HZ (10416-9600)/9600=0.85,得到误差为8.5%,误差太大了,根本就不能够正常通信,而11.0892MHZ的波特率误差就特别小 关于数据的传输我们只需要在HCSR04的距离计算模块把发送中断打开,把数据用printf函数发送过去后再 关闭即可。但是这样蓝牙会不断的发送数据。要是不习惯的话也可以写一个串口接发数据中断函数,手机蓝牙发送指令后用switch函数接受完成相应功能(由于懒就没写了) 工程完整源代码
#include <REGX52.H>
#include <intrins.h>
#include <stdio.h>
sbit HCSR04_Trig=P2^0;
sbit HCSR04_Echo=P2^1;
unsigned int Time;
double distance;
bit flag=0;
void Delay50ms()
{
unsigned char i, j;
i = 98;
j = 67;
do
{
while (--j);
} while (--i);
}
void HC_SR04start()
{
HCSR04_Trig=1;
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
HCSR04_Trig=0;
}
void Timer0_Init()
{
TMOD&=0XF0;
TMOD|=0X01;
TH0=0;
TL0=0;
TF0=0;
ET0=1;
EA=1;
}
void UART_Init(void)
{
PCON &= 0x7F;
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
TL1 = 0xFD;
TH1 = 0xFD;
ET1 = 0;
TR1 = 1;
}
void DistanceCount()
{
Time=TH0*256+TL0;
TH0=0;
TL0=0;
distance=(1.7*Time)/100;
TI=1;
if(distance>=450)
{
printf("erro");
}
printf("distance=%5.2fcm\n",distance);
TI=0;
}
void main()
{
Timer0_Init();
UART_Init();
while(1)
{
HC_SR04start();
while(HCSR04_Echo==0);
TR0=1;
while(HCSR04_Echo==1);
TR0=0;
DistanceCount();
Delay50ms();
}
}
void Timer0_Routine() interrupt 1
{
flag=1;
}
|