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_(); //空
}
}
展开
 我来答
大禹电子
高粉答主

2013-08-07 · 超声波是我一生的事业
大禹电子
采纳数:6297 获赞数:18368

向TA提问 私信TA
展开全部
仿真是最好的解决办法。
追问
怎么仿真,proteus里面没有超声波模块
追答
自己搭电路,接单片机的仿真机。在电脑里面仿真,看看是程序哪里有问题了。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式