这是我的超声波测距在串口上显示的程序:
#include <reg51.h>
#include <intrins.h>
#include <STDIO.H>
#define uchar unsigned char
#define uint unsigned int
unsigned int time=0;
unsigned int timer=0;
float S=0;
bit flag =0;
sbit RX=P1^1; //Echo 回响信号输出
sbit TX=P1^2; //Trig 触发信号,信号输入
/********************************************************/
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出来是CM
if(flag==1) //超出测量
{
flag=0;
printf("-----\n");
}
printf("S=%f\n",S);
}
/********************************************************/
void delayms(unsigned int ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
/********************************************************/
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}
/********************************************************/
void StartModule() //T1中断用来扫描数码管和计800MS启动模块
{
TX=1; //800MS 启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
/********************************************************/
void main(void)
{
TMOD=0x21; //设T1为方式2(用于串口的波特率发生)设T0为方1,GATE=1;
SCON=0x50; //串口
TH1=0xFD; //串口
TL1=0xFD; //串口
TH0=0;
TL0=0;
TR0=1;
ET0=1; //允许T0中断
TR1=1; //开启定时器
TI=1;
EA=1; //开启总中断
while(1)
{
StartModule();
while(!RX); //当RX为零时等待 ,为1时开启计数
TR0=1; //开启计数
while(RX); //当RX为1计数并等待,为0时关闭计数,此段时间及超声波发射到返回时间
TR0=0; //关闭计数
Conut(); //计算
// delayms(100); //100MS
if(S<100.0) //此处的点灯是拿来检验之用,不必深究
P0=0x00;
else
P0=0xff;
}
}
现在针对这个程序有两个问题
1、我把延时那句话屏蔽之后,在串口上能飞快的显示距离,至少50次/s的显示速度,但是有了那句话,在串口上显示距离就很慢,大概1s中才显示一次距离的测量值,问题就在此,我只延时了100毫秒,串口显示的速度怎么就相差这么大??
2、对于省略延时语句的那个程序,当距离一定时 串口能连续显示,如果距离骤然变化(如在传感器前放一本书 或者 把原先挡住传感器的书本拿走),串口显示就会忽然停止。 当是对于有延时语句的那个程序,则不会有这种现象,能正确测量远近的距离,不管怎么变化,只是测量周期确实长了点啊!
下面附上我的两张窗口显示的截图
|