这个程序是我上午写的一直调到现在都没出结果,目的是绿灯时小车通过两个传感器后测它的速度(小车经过第一个传感器后会进入外部中断0打开定时器0,到 第二个传感器时关闭定时器,再计算时间后计算速度),通过数码管显示出来。红灯时不测速度。
可程序到单片机里数码管一直是0,小车通过两个传感器没有反应。
急切希望有前辈指点一下,实在是想不出怎么回事了!实在不甘心写了这么多却没有预期功能。
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit red_led=P3^1;
sbit green_led=P3^0;
uint seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uint dist=5;
uint speed=0;
uint d1,d2,d3,d4=0;
uchar flag1=0;
uchar flag2=0;
uchar w=1;
uchar n=0;
uchar th0,tl0;
uchar a=0x7f;
float total_t;
void delay(uint x);
void main() /*主程序*/
{P1=0x00;
TMOD=0x11;
TH1=(65536-3000)/256;
TL1=(65536-3000)%256;
TH0=0x00;
TL0=0x00;
EA=1;
ET0=1;
ET1=1;
TR1=1;
IT0=1;
IT1=1;
EX0=1;
while(1)
{EX1=1;
red_led=1;
green_led=0; /*绿灯亮*/
if(flag2)
{flag2=0;
P1=0x00;
delay(100);
P1=0x40;
delay(100);
P1=0x00;
}
delay(4000);
flag1=1;
EX1=0;
green_led=1;
red_led=0; /*红灯亮*/
delay(4000);
}
}
void delay(uint x)
{uint i,j;
for(i=x;i>0;i--)
for(j=112;j>0;j--){;}}
void x_INT0(void) interrupt 0
{EX0=0;
if(flag1) /*这一段可不管,是另外一个功能*/
{delay(5);
P1=0x80;
flag1=0;
flag2=1;
}
else
{TR0=1;
}
EX0=1;
}
void x_INT1(void) interrupt 2
{EX1=0;
TR0=0;
th0=TH0;
tl0=TL0;
total_t=(n*65536+th0*256+tl0)/1000000;
speed=(int)(dist/total_t*10);
d1=speed%10;
d2=(speed/10)%10;
d3=(speed/100)%10;
d4=(speed/1000)%10;
TH0=0x00;
TL0=0x00;
EX1=1;
}
void t_INT0(void) interrupt 1 /*小车测速定时器中断*/
{ET0=0;
n=n+1;
TH0=0x00;
TL0=0x00;
ET0=1;
}
void t_INT1(void) interrupt 3 /*小车速度显示*/
{
switch(w)
{case 1:
{P2=a;
P0=~seg[d1];
delay(5);
break;
}
case 2:
{P2=a;
P0=~seg[d2];
delay(5);
break;
}
case 3:
{P2=a;
P0=~seg[d3];
delay(5);
break;
}
case 4:
{P2=a;
P0=~seg[d4];
delay(5);
break;
}
default:break;
}
a=_cror_(a,1);
if(a==0xf7)
{a=0x7f;}
if(w==4)
{w=1;}
else
{w=w+1;}
TH1=(65536-3000)/256;
TL1=(65536-3000)%256;
} |