/*************************************************************
功能说明:交通灯,红灯30秒,绿灯20秒,黄灯10秒
接线说明:P1控制位选,P2控制段选,P3^2~P3^7控制LED // P2^0控制十位,P2^1控制个位
作 者:合工大 LS
*************************************************************/
#include unsigned char i,j,t1,t2,count,n; //sbit x1=P2^0; //sbit x2=P2^1; sbit R2=P3^2; sbit Y2=P3^3; sbit G2=P3^4; sbit R1=P3^5; sbit Y1=P3^6; sbit G1=P3^7; unsigned char code table[]={~0xc0,~0xf9,~0xa4,~0xb0,~0x99,~0x92,~0x82,~0xf8,~0x80,~0x90}; //------------------------延时---------------------------------// void delay(unsigned int delaytime) { while(delaytime--); } //------------------------数码管显示---------------------------// void display(void) { { // x2=0;x1=1;delay(5);P3=table[i/10];P1=table[j/10];delay(500); //显示十位 // x1=0;x2=1;delay(5);P3=table[i%10];P1=table[j%10];delay(500); 个位 //显示 P1=~0x01;delay(5);P2=table[i/10];delay(500); P1=~0x02;delay(5);P2=table[i%10];delay(500); P1=~0x10;delay(5);P2=table[j/10];delay(500); P1=~0x20;delay(5);P2=table[j%10];delay(500); } } void fuzhi() { i=t1; j=t2; } //-------------------------初始化--------------------------------// void t0nit() { TMOD=0x01; //00000001,16位定时模式 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; TR0=1; ET0=1; } //------------------------定时1秒--------------------------------// void t0()interrupt 1 { count++; if(count==20) { t1--; t2--; count=0; } TH0=(65536-50000)/256; TL0=(65536-50000)%256; } //-----------------------1红亮2绿变黄--------------------------// void zhuanyi() { if(t2==0&&t1!=0) { t2=10; G2=!0; Y2=!1; R1=!1; } } //-----------------------2黄变红1红变绿----------------------// void zhuaner() { if(t1==0&&t2==0) { t2=30;t1=20; Y2=!0; R2=!1; R1=!0; G1=!1; } } //------------------------2红亮1绿变黄----------------------// void zhuansan() { if(t1==0&&t2!=0) { t1=10; R2=!1; G1=!0; Y1=!1; } } //-------------------------1黄变红2红变绿--------------------// void zhuansi() { if(t1==0&&t2==0) { t2=20;t1=30; Y1=!0; R1=!1; R2=!0; G2=!1; } } main() { while(1) { t0nit(); R1=!1; Y1=!0; G1=!0; R2=!0; Y2=!0; //1红亮 G2=!1; //2绿亮 n=0; t1=30;t2=20; while(1) { fuzhi(); display(); if(t2==0&&t1!=0)zhuanyi(); // 1红亮2绿变黄 if(t1==0&&t2==0) {zhuaner();n++; } //2黄变红1红变绿,n++产生标志位,用于区分两次t1和t2同时为零 if(t1==0&&t2!=0)zhuansan(); // 2红亮1绿变黄 if(n==1) { if(t1==0&&t2==0) { zhuansi(); n++; //1黄变红2红变绿 } } if(n==2) break; } } } 因篇幅问题不能全部显示,请点此查看更多更全内容