Proteus 仿真原理图: Keil C 源程序: #include #define uchar unsigned char #define uint unsigned int sbit RED_DONGXI = P1^0;//南北方向红灯亮 sbit YELLOW_DONGXI = P1^1;//南北方向黄灯亮 sbit RED_NANBEI = P1^3;//东西方向红灯亮 sbit GREEN_DONGXI = P1^2;//南北方向绿灯亮 sbit YELLOW_NANBEI = P1^4;//东西方向黄灯亮 sbit GREEN_NANBEI = P1^5;//东西方向绿灯亮 sbit DXweixuan1 = P1^6;//南北方向数码管位选 1 sbit DXweixuan2 = P1^7;//南北方向数码管位选 2 sbit NBweixuan1 = P3^0;//东西方向数码管位选 1 sbit NBweixuan2 = P3^1;//东西方向数码管位选 2 sbit L1=P3^5; sbit L2=P3^6; sbit L3=P3^7; uint aa, bai,shi,ge,bb; uint shi1,ge1,shi2,ge2; uint code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uint code table1[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6}; void delay(uint z); void init(uint a); void display(uint shi1,uint ge1,uint shi2,uint ge2); void xtimer0(); void init1(); void init2(); void init3(); void init4(); void init5(); void xint1(); void xint0(); void LED_ON(); void LED_OFF(); void main() { P0=0xFF; P1=0xFF; P2=0x00; P3=0xFF; EA=1; EX0=1; IT0=0; init1(); while(1) { init2();//第2 个状态 init3(); //第3 个状态 init4(); //第4 个状态 init5();//第5 个状态 } } void init1()//第一个状态:东西、南北方向均亮红灯 5S { uint temp; temp=5; TMOD=0x01; TH0=(65535-50000)/256; TL0=(65535-50000)%256; EA=1; ET0=1; TR0=1; while(1) { RED_DONGXI=0; //第一个状态东西、南北均亮红灯 5S RED_NANBEI=0; GREEN_DONGXI=1; GREEN_NANBEI=1; YELLOW_DONGXI=1; YELLOW_NANBEI=1; if(aa==20)//定时 20*50MS=1S { aa=0; temp--; } shi1=shi2=temp/10; ge1=ge2=temp%10; if(temp==0) { temp=5; break; } display(ge1,shi1,ge2,shi2); } } void init2()//第二个状态:东西亮红灯 30S~ 5S、南北亮绿灯 25~ 0S; { uint temp; temp=26; TMOD=0x01; TH0=(65535-50000)/256; TL0=(65535-50000)%256; EA=1; ET0=1; TR0=1; while(1) { RED_DO...