本帖最后由 uli123 于 2012-11-7 18:13 编辑
程序的目标是:超声波发出信号遇到障碍物后在数码管上显示障碍与接收端的距离,所用的超声波模块是HC-SR04,P0端口用来传输数码管数据,P2.6,P2.7控制段位,我经过分段检测后,发现问题就在主函数部分,其他delay,over,nixie,smg等自定义函数都没有问题,主函数部分实在是没办法了,出现的现象是:没遇到障碍时,数码管数字不断闪烁并变化;如果遇到障碍,就会显示一个完全不符的“距离”(此时不闪烁),并且在障碍持续存在的情况下,改变与障碍物的距离,数码管上数字不变(此时不闪烁),还望大神帮忙
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit trig=P1^0;//超声波信号输入端,TRIG
sbit echo=P1^1;//超声波信号反馈端,ECHO
sbit duan=P2^6;//控制数码管的段
sbit wei=P2^7;//控制位
uint h=1,ge,shi,bai,i,flag=0;
uint dat1,dat2,datchange,m,n;
float w;
uint q;
uchar code atm[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90
}; //共阳数码管数字显示
void delay(uint a) //a毫秒(ms)延时函数(大约)
{
uint i,j;
for(i=a;i>0;i--)
for(j=110;j>0;j--)
;
}
void over()//over,把定时器中的数据进行处理得到一个以厘米为单位的距离q
{
dat1=m;
dat2=n;
datchange=dat1<<8;//将dat1变成真正的高8位
datchange=datchange|dat2;//将高低8位相加
w=0.018748*datchange;//求出距离
q=(uint)w;//转化为整数
}
void smg(uint ge,uint shi,uint bai)//数码管显示,over
{
duan=1;
P0=atm[bai];
duan=0;
P0=0xff;
wei=1;
P0=0x80;
wei=0;
delay(2);
duan=1;
P0=atm[shi];
duan=0;
P0=0xff;
wei=1;
P0=0x40;
wei=0;
delay(2);
duan=1;
P0=atm[ge];
duan=0;
P0=0xff;
wei=1;
P0=0x20;
wei=0;
delay(2);
}
void nixie(uint w)//over,将三位数的q进行分解
{
if(w>99)
{
ge=w%10;
shi=w%100/10;
bai=w/100;
}
if(9<w&&w<100)
{
ge=w%10;
shi=w/10;
bai=0;
}
if(w<10)
{
ge=w;
shi=0;
bai=0;
}
smg(ge,shi,bai);
}
void main()
{
P1=0x00;
TMOD=0x11;//对定时器初始化
TH0=0;
TL0=0;
EA=1;
ET0=1;
while(1)//在这个while里不断检测是否有障碍物
{
trig=1;//对发射段给一个高电平
delay(1);//延时10ms,改变他现象会改变???
trig=0;
if(echo==1)
TR0=1,h=1;
//h=1用来退出当前的检测,进行下一次检测
while(h)
{
if(echo==0)
{
TR0=0;
m=TH0; //dat1传递高8位的数
n=TL0;//dat2传递低8位的数
TH0=0;
TL0=0;
h=0;
}
}
over();//处理定时器中的数据
nixie(q);//分解w,并数码管显示
}
}
void T0_time() interrupt 1
{
TH0=0;
TL0=0;
}
一周热门 更多>