大二新人一枚,刚接触51,最近发现一个很严重的问题,每次我用内部计时器来做倒计时的时候,实际经历的时长总是远远长于理论时长。比如我设定了30秒倒计时,最后可能倒了60多秒还没有倒完,求教各位大神这是为什么啊?顺便放上一个交通的灯程序,别的部分都可以实现,只有倒计时这块出了我描述的问题。
#include
unsigned char code aa[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f};//对应数字的数码管编码
***it add=P2^2; //按键1加交通灯时间
***it sub=P2^3; //按键2减交通灯时间
***it addy=P2^4; //按键3加黄灯时间
***it suby=P2^5; //按键4减黄灯时间
***it confirm=P2^6; //按键5确认
***it can=P2^7; //按键6取消(重置),暂缺省
unsigned char numst=0,numyst=0,//初始设置保存变量
num,numy,time, //交通灯其作用时使用的变量
flag=1,flagc=1,count=0;//定义标志变量
void delay(int x) //延时函数
{
int j;
for(;x>0;x--)
for(j=124;j>0;j--);
}
void display(int num,int numy) //数码管动态显示函数
{
int shi,ge,shiy,gey;
shi=num/10;
ge=num%10;
shiy=numy/10;
gey=numy%10;
P1=aa[shi]; //红绿灯显示时间
P0=0x00;
delay(1);
P0=0x04;
delay(1);
P1=aa[ge];
P0=0x01;
delay(1);
P0=0x05;
delay(1);
P1=aa[shiy]; //黄灯显示时间
P0=0x02;
delay(1);
P0=0x06;
delay(1);
P1=aa[gey];
P0=0x03;
delay(1);
P0=0x07;
delay(1);
}
//use P3 and P2^0 and P2^1 to control the lights
//P3^0 P3^2 control red1 P2^1 P3^5 control red2
//P3^1 P3^4 control green1 P3^7 P2^0 control green2
//P3^3 control yellow1 P3^6 control yellow2
void initial() //初始化函数
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
}
void timeadjustment() //时间设置函数
{
while(1)
{
if(add==0)
{
delay(5);
if(add==0)
{
delay(5);
numst++;
}
while(!add)
display(numst,numyst);
}
if(sub==0)
{
delay(5);
if(sub==0)
{
delay(5);
numst--;
}
while(!sub)
display(numst,numyst);
}
if(addy==0)
{
delay(5);
if(addy==0)
{
delay(5);
numyst++;
}
while(!addy)
display(numst,numyst);
}
if(suby==0)
{
delay(5);
if(suby==0)
{
delay(5);
numyst--;
}
while(!suby)
display(numst,numyst);
}
if(confirm==0)
{
delay(5);
if(confirm==0)
{
delay(5);
}
while(!confirm);
break;
}
display(numst,numyst);
}
}
/*void cancel() //重置函数(暂缺省)
{
if(can==0)
{
delay(5);
if(can==0)
{
delay(5);
}
while(!can);
timeadjustment();
}
}*/
void light() //交通灯控制函数
{
if(flag==1)
{
if(flagc==1)
{
P3=0x7a;
P2=0xfe;
display(num,0);
}
else
{
P3=0xcd;
P2=0xfd;
display(num,0);
}
}
else
{
P3=0xb7;
P2=0xff;
display(0,numy);
}
}
void main()
{
void timesdjustment();
initial();
timeadjustment();
num=numst;
numy=numyst;
TR0=1;
while(1)
{
light();
}
}
void daojishi() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
if(flag==1)
{
num--;
if(num==0)
{
num=numst;
flagc=~flagc;
flag=0;
}
}
else
{
numy--;
if(numy==0)
{
numy=numyst;
flag=1;
}
}
}
}
|