HC-SR04超声波测距模块 数据不停变动
用STC12C4052AD单片机,测距十次,每次的数据用串口发送到电脑上,发现有时连续三次一样,后七次有F开头的,有0开头的,但是模块为位置没变,怎样解决源程序:/***...
用STC12C4052AD单片机,测距十次,每次的数据用串口发送到电脑上,发现有时连续三次一样,后七次有F开头的,有0开头的,但是模块为位置没变,怎样解决
源程序:
/***********************************************************************************************************/
//HC-SR04 超声波测距模块 DEMO 程序
//晶振:11。0592
//接线:模块TRIG接 P1.2 ECH0 接P1.1
//串口波特率9600
/***********************************************************************************************************/
#include <STC12C2052AD.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RX = P1^1;
sbit TX = P1^2;
unsigned int time=0;
unsigned int timer=0;
unsigned int S=0;
bit flag =0;
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*340)/2; //算出来是CM
}
/*********************************************************************************************
void DELAY_US (unsigned int a){
unsigned int i;
while( a-- != 0){
for(i = 0; i < 9; i++); //延时15US
}
}
void StartModule(){
TX=1; //启动模块
DELAY_US(1); //延时15us
TX=0; //启动完毕
}
void UART_T (){ //定义串口发送数据变量
SBUF = S; //将接收的数据发送回去
while(TI == 0); //检查发送中断标志位
TI = 0; //令发送中断标志位为0(软件清零)
}
void main(void)
{
EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
ES = 1; //允许UART串口的中断
TMOD = 0x21; //定时器工作方式
SCON = 0x50; //串口工作方式
TH1 = 0xFD; //定时器初值
TL1 = 0xFD; //定时器初值
TR1 = 1; //定时器启动
TH0=0;
TL0=0;
TR0=1;
ET0=1;
while(1)
{
StartModule();
while(!RX); //当RX为零时等待
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
Conut(); //计算
UART_T(); //发送数据
_nop_(); //空
}
} 展开
源程序:
/***********************************************************************************************************/
//HC-SR04 超声波测距模块 DEMO 程序
//晶振:11。0592
//接线:模块TRIG接 P1.2 ECH0 接P1.1
//串口波特率9600
/***********************************************************************************************************/
#include <STC12C2052AD.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RX = P1^1;
sbit TX = P1^2;
unsigned int time=0;
unsigned int timer=0;
unsigned int S=0;
bit flag =0;
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*340)/2; //算出来是CM
}
/*********************************************************************************************
void DELAY_US (unsigned int a){
unsigned int i;
while( a-- != 0){
for(i = 0; i < 9; i++); //延时15US
}
}
void StartModule(){
TX=1; //启动模块
DELAY_US(1); //延时15us
TX=0; //启动完毕
}
void UART_T (){ //定义串口发送数据变量
SBUF = S; //将接收的数据发送回去
while(TI == 0); //检查发送中断标志位
TI = 0; //令发送中断标志位为0(软件清零)
}
void main(void)
{
EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
ES = 1; //允许UART串口的中断
TMOD = 0x21; //定时器工作方式
SCON = 0x50; //串口工作方式
TH1 = 0xFD; //定时器初值
TL1 = 0xFD; //定时器初值
TR1 = 1; //定时器启动
TH0=0;
TL0=0;
TR0=1;
ET0=1;
while(1)
{
StartModule();
while(!RX); //当RX为零时等待
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
Conut(); //计算
UART_T(); //发送数据
_nop_(); //空
}
} 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询