单片机交通灯设计问题:为什么显示不对,计时器计时也不对,求高人指教
sbit S1=P1^2;
sbit S2=P1^3;
sbit SHI=P1^0; //数码管个位显示位
sbit GE=P1^1; //数码管十位显示位
unsigned char t=0;
unsigned char time;
unsigned char mutex=0;
unsigned char keyval;
unsigned char tab[10]={0x81,0xf9,0x92,0xb0,0xe8,0xa4,0x84,0xf1,0x80,0xa0};
void delay(void) //延时程序
{
unsigned int i;
for(i=0;i<300;i++)
;
}
void display1(void) //倒数35秒
{
GE=0;
SHI=1;
P3=tab[(35-time)%10];
delay();
GE=1;
SHI=0;
P3=tab[(35-time)/10];
delay();
}
void display2(void) //倒数5秒
{
GE=0;
SHI=1;
P3=tab[(40-time)%10];
delay();
}
void display3(void) //倒数15秒
{
GE=0;
SHI=1;
P3=tab[(55-time)%10];
delay();
GE=1;
SHI=0;
P3=tab[(55-time)/10];
delay();
}
void display4(void) //倒数5秒
{
GE=0;
SHI=1;
P3=tab[(60-time)%10];
delay();
}
void aT0()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void delay20ms(void) //延时20毫秒
{
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++)
;
}
void key_scan(void) //键盘扫描
{
if((P1&0xf0)!=0xf0)
{
delay20ms();
if(S1==0)
keyval=1;
if(S2==0)
keyval=2;
}
}
void WW(void) //东西方向通行
{
if(time>0&&time<35)
{
P0=0x7b;
P2=0x7b;
display1();
}
else
if(time>35&&time<40)
{
P0=0xdb;
P2=0xdb;
display2();
}
else
if(time>40&&time<55)
{
P0=0xeb;
P2=0xeb;
display3();
}
else
if(time>55&&time<60)
{
P0=0xdb;
P2=0xdb;
display4();
}
}
void SN(void) //南北方向通行
{
if(time>0&&time<35)
{
P0=0xb7;
P2=0xb7;
display1();
}
else
if(time>35&&time<40)
{
P0=0xbd;
P2=0xbd;
display2();
}
else
if(time>40&&time<55)
{
P0=0xbe;
P2=0xbe;
display3();
}
else
if(time>55&&time<60)
{
P0=0xbd;
P2=0xbd;
display4();
}
}
void main()
{
aT0();
while(1)
{
if(mutex==0) //mutex=0时东西通行
{
WW();
}
if(mutex==1) //mutex=1时南北通行
{
SN();
}
}
}
void Time0(void)interrupt 1 using 1 //中断函数
{
t++;
time=time%61;
if (t==20)
{
time++;
t=0;
if(time==60)
{
mutex=!mutex;
}
}
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
} 展开
#include <reg51.h> // 供参考
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
uchar h;
uint r=0;
uint s;
uchar code dis[]={
0Xc0,/*0*/
0Xf9,/*1*/
0Xa4,/*2*/
0Xb0,/*3*/
0X99,/*4*/
0X92,/*5*/
0X82,/*6*/
0Xf8,/*7*/
0X80,/*8*/
0X90,/*9*/
0Xff,/*NULL*/
};
void delay(uint c)
{
uint i,j;
for(i=0;i<c;i++)
for(j=0;j<100;j++);
}
//interrupt 1
void t0(void) interrupt 0 using 1
{
delay(2);
if(INT0==0)
{
r++;
if(r==2)
{
r=0;
}
r%=2;
if(r==0)
{
P0=0xeb;
P1=0x00;
P2=0xff;
}while(1)
{
if(INT0==0|INT1==0|T0==0)
{
delay(2);
if(INT0==0|INT1==0|T0==0)
break;
}
};
}
}
//interrupt 2
void t1(void) interrupt 2 using 1
{
delay(2);
if(INT1==0)
{
r++;
if(r==2)
{
r=0;
}
r%=2;
if(r==0)
{
P0=0xdd;
P1=0x00;
P2=0xff;
}while(1)
{
if(INT1==0|INT0==0|T0==0)
{
delay(2);
if(INT1==0|INT0==0|T0==0)
break;
}
};
}
}
//interrupt 3
void t2(void) interrupt 1 using 1
{
TH0=0xff;
TL0=0xff;
delay(2);
if(T0==0)
{
P0=0xdb;
P1=0x00;
P2=0xff;
}while(1)
{
if(INT0==0|INT1==0)
{
delay(2);
if(INT0==0|INT1==0)
break;
}
};
}
void main(void)
{
TMOD=0x06;
TH0=0xff;
TL0=0xff;
TR0=1;
EA=1;
EX0=1;
EX1=1;
ET0=1;
while(1)
{
P0=0xeb;
for(h=28;h>0;h--)
{
for(s=248;s>0;s--)
{
P1=0x00;
P2=0xff;
P1=0x01;
P2=dis[h/10];
delay(1);
P1=0x00;
P2=0xff;
P1=0x02;
P2=dis[h%10];
delay(1);
P1=0x00;
P2=0xff;
P1=0x04;
P2=dis[(h+2)/10];
delay(1);
P1=0x00;
P2=0xff;
P1=0x08;
P2=dis[(h+2)%10];
delay(1);
}
}
delay(248);
P0=0xf3;
for(h=3;h>0;h--)
{
delay(392);
P0=0xf3;
delay(1);
P1=0x00;
P2=0xff;
P1=0xaa;
P2=dis[(h-1)%10];
delay(600);
P0=0xfb;
}
delay(248);
P0=0xdd;
for(h=38;h>0;h--)
{
for(s=248;s>0;s--)
{
P1=0x00;
P2=0xff;
P1=0x01;
P2=dis[(h+2)/10];
delay(1);
P1=0x00;
P2=0xff;
P1=0x02;
P2=dis[(h+2)%10];
delay(1);
P1=0x00;
P2=0xff;
P1=0x04;
P2=dis[h/10];
delay(1);
P1=0x00;
P2=0xff;
P1=0x08;
P2=dis[h%10];
delay(1);
}
}
delay(248);
P0=0xde;
for(h=3;h>0;h--)
{
delay(392);
P0=0xde;
delay(1);
P1=0x00;
P2=0xff;
P1=0xaa;
P2=dis[(h-1)%10];
delay(600);
P0=0xdf;
}
delay(248);
}
}