|
才学单片机,这个程序到底是啥问题,请高手请教,非常感谢
[复制链接]
#include
#define uchar unsigned char
int flag;
unsigned int count;
sbit l1 = P1^0;
sbit l2 = P1^1;
sbit l3 = P1^2;
sbit s1 = P1^3; //第一个红外开关
sbit s2 = P1^4; //第二个红外开关
sbit s3 = P1^5; //第三个红外开关
//延时
void delay_nms (int n)
{
int i = n;
int j = 1000;
for(i=0; i
for(j=0; j<1000; j++) {;}
}
//检测红外开关的状态
int test_relay(bit b)
{
if(b == 0)
{
delay_nms(1); //软件积分,当开关上有动作时延时一段时间后如果动作还保持则判为有效
if(b == 0)
return 1;
}
else
return 0;
}
void timer0() interrupt 1 using 0 //计数中断开始
{
TH0=(65536-46080)/256; //载入计数值3
TL0=(65536-46080)%256;
count++;
if(count==3000)
{
flag=1;
count=0;
}
}
main()
{
int person_num=0; //记录当前的操作员数
TMOD=0x01; //设定为计数器0,工作方式为1
TH0=(65536-46080)/256;
TL0=(65536-46080)%256; //初装计数值3
ET0=1;
EA=1;
TR0=0; //中断开始
P3=0;
while(1)
{
if (test_relay(s1)==0)
{ for(;;)
{
TR0=1; //计时开始
if((test_relay(s2)==1)||(test_relay(s3)==1)||(flag==1))
{
TR0=0;//停止计时
if(flag==1) //如果时间超过就重新开始
{
flag=0;
break;
}
person_num++;
break;
}
}
}
else if (test_relay(s3)==1)
{
for(; ;)
{
TR0=1; //计时开始
if((test_relay(s1)==1)||(test_relay(s2)==1)||flag==1)) {
TR0=0;
if(flag==1)//如果时间超过就重新开始
{
flag=0;
break;
}
person_num--;
break;
;
}
}
}
else;
l1=~person_num&0x1;
l2=~person_num&0x2;
l3=~person_num&0x4;
P3 = person_num;
}
}
这个程序运行时,当启动TR0=1时,为啥不开始计时呀,谢谢
|
|