- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int //***********參數初始化********************
- uchar count=0,count2=0; //定時器0,定時器1的計數初值
- uchar green_ns=60,green_ew=30,red_ns=34,red_ew=64,yellow_ns=4,yellow_ew=4;//南北綠燈亮60 東西綠燈30 南北紅燈34 東西紅燈64 南北黃燈4 東西黃燈4
- uchar snorth=60,ewest=64; //上電后南北綠燈亮60秒,東西紅燈亮64秒
- uchar ding_ns=0,ding_ew=0; //南北狀態(tài)轉換標志位,東西狀態(tài)轉換標志位
- uchar flag=0,flag2=0; //設置鍵按下次數的標志位,長按鍵的標志位
- //***********引腳定義**********************
- sbit wela=P2^0; //鎖存器位選
- sbit dula=P2^1; //鎖存器位選
- sbit NS_R=P2^2; //南北發(fā)光二極管
- sbit NS_Y=P2^3;
- sbit NS_G=P2^4;
- sbit EW_R=P2^5; //東西發(fā)光二極管
- sbit EW_Y=P2^6;
- sbit EW_G=P2^7;
- sbit set=P3^2; //按鍵 設置鍵 加1鍵 減1鍵
- sbit up=P3^4;
- sbit down=P3^5;
- //*********函數聲明部分******************
- void delay(uint z);
- void Inital();
- void display(uchar s);
- void display_ew(uchar w)
- void display_ns(uchar r);
- void turnkey();
- void show();
- //*********共陽數碼管段碼***************
- unsigned char code SEG7[10]= { 0xC0,/*0*/ 0xF9,/*1*/ 0xA4,/*2*/ 0xB0,/*3*/0x99,/*4*/0x92,/*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90,/*9*/};
- //*******軟件延時函數 延時1毫秒*********
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- //********初始化函數*******************
- void Inital()
- {
- wela=0; //鎖存器初始化
- dula=0;
- TMOD = 0x11;
- //計數器0,1工作在方式1,數值大小16位,定時時間=12*(65536-x)/f x為初值,f為時鐘頻率
- TH0 = 0xD8; //定時器0高8位
- TL0 = 0xF0; //定時器0低8位
- EA = 1; //開總中斷
- ET0 = 1; //定時器0中斷允許
- TR0=1; //定時器0開始計時
- TH1=0xD8; //定時器1高8位
- TL1=0xF0; //定時器1低8位
- ET1 = 1; //定時器1中斷允許
- EX0=1; //外部中斷0允許
- IT0=0; //外部中斷0電平觸發(fā)
- NS_R=1; //南北發(fā)光二極管初始化
- NS_G=0;
- NS_Y=1;
- EW_R=0; //東西發(fā)光二極管初始化
- EW_G=1;
- EW_Y=1;
- }
- //**********數碼管顯示函數*************
- void display(uchar s)
- {
- P1=SEG7[s];
- }
- //*******數碼管顯示東西方向數字********
- void display_ew(uchar w)
- {
- uchar x,y,i=0;
- x=w%10; //個位
- y=w/10; //十位
- dula=1;
- display(x);
- dula=0;
- P1=0x00;
- wela=1;
- P1=0x04;
- wela=0;
- delay(5);
- dula=1;
- display(y);
- dula=0;
- P1=0x00;
- wela=1;
- P1=0x08;
- wela=0;
- delay(5);
- }
- //*******數碼管顯示南北方向數字********
- void display_ns(uchar r)
- {
- uchar x,y,i=0;
- x=r%10; //個位
- y=r/10; //十位
- dula=1;
- display(x);
- dula=0;
- P1=0x00;
- wela=1;
- P1=0x01;
- wela=0;
- delay(5);
- dula=1;
- display(y);
- dula=0;
- P1=0x00;
- wela=1;
- P1=0x02;
- wela=0;
- delay(5);
- }
- // **********鍵盤掃描函數************
- void turnkey()
- {
- flag2=0; //掃描之前加10減10標志位清零
- if(!up)
- {
- delay(10); //按鍵消抖 時10ms
- if(!up)
- {
- TR1=1; //定時器1開始1s定時,用于鍵盤掃描的定時數值加10
- while(!up)
- {
- switch(flag)
- {
- case 0:break;
-
- case 1:
- display_ns(green_ns);
- NS_G=0;
- break;
-
- case 2:
- display_ns(yellow_ns);
- NS_Y=0;break;
- case 3:
- display_ew(green_ew);
- EW_G=0;
- break;
-
- case 4:
- display_ew(yellow_ew);
- EW_Y=0;
- break;
- }
- }
- while(!up); //等待按鍵結束
- delay(10); //按鍵消抖 延時10ms
- while(!up);
- TR1=0; //定時器1結束
- if(count2>=100)
- {
- flag2=1;
- count2=0;
- switch(flag2%3)
- {
- case 0:break;
- case 1:
- switch(flag)
- {
- case 0:break;
- case 1:
- green_ns+=9;
- if(green_ns>99)
- green_ns=0;
- break;
- case 2:break;
- case 3:
- green_ew+=9;
- if(green_ew>99)
- green_ew=0;
- break;
- case 4:break;
- }
- break;
- case 2:
- switch(flag)
- {
- case 0:break;
- case 1:
- green_ns-=9;
- if(green_ns<=0)
- {
- green_ns=99;
- }
- break;
- case 2:break;
- case 3:
- green_ew-=9;
- if(green_ew<=0)
- {
- green_ew=99;
- }
- break;
- case 4:break;
- }
- break;
- }
- }
- switch(flag) //短按鍵加一
- {
- case 0:break;
- case 1:
- //南北綠燈加一
- green_ns++;
- if(green_ns==100)
- green_ns=0;
- red_ew=green_ns+yellow_ns;
- break;
- case 2:
- //南北黃燈加一
- yellow_ns++;
- if(yellow_ns==10)
- yellow_ns=0;
- red_ew=green_ns+yellow_ns;
- break;
- case 3:
- //東西綠燈加一
- green_ew++;
- if(green_ew==100)
- green_ew=0;
- red_ns=green_ew+yellow_ew;
- break;
- case 4:
- //東西黃燈處理加一
- yellow_ew++;
- if(yellow_ew==10)
- yellow_ew=0;
- red_ns=green_ew+yellow_ew;
- break;
- }
- }
- }
- if(!down)
- {
- delay(10); //按鍵消抖 延時10ms
- if(!down)
- {
- TR1=1; //定時器1開始計時
- while(!down)
- {
- switch(flag)
- {
- case 0:break;
- case 1:
- display_ns(green_ns);
- NS_G=0;
- break;
- case 2:
- display_ns(yellow_ns);
- NS_Y=0;
- break;
- case 3:
- display_ew(green_ew);
- EW_G=0;
- break;
- case 4:
- display_ew(yellow_ew);
- EW_Y=0;
- break;
- }
- }
- while(!down); //等待按鍵結束
- delay(10); //按鍵消抖 延時10ms
- while(!down);
- TR1=0; //定時器1結束計時
- if(count2>=100)
- {
- flag2=2;
- count2=0;
- switch(flag2%3)
- {
- case 0:break;
- case 1:
- switch(flag)
- {
- case 0:break;
- case 1:
- green_ns+=9;
- if(green_ns>99)
- green_ns=0;
- break;
- case 2:
- break;
- case 3:
- green_ew+=9;
- if(green_ew>99)
- green_ew=0;
- break;
- case 4:
- break;
- }
- break;
- case 2:
- switch(flag)
- {
- case 0:break;
- case 1:
- green_ns-=9;
- if(green_ns<=0)
- {
- green_ns=99;
- }
- break;
- case 2:break;
- case 3:
- green_ew-=9;
- if(green_ew<=0)
- {
- green_ew=99;
- }
- break;
- case 4:break;
- }
- break;
- }
- }
- switch(flag) //短按鍵減一
- {
- case 0:break;
- case 1: //南北綠燈減一
- green_ns--;
- if(green_ns==255)
- {
- green_ns=99;
- }
- red_ew=green_ns+yellow_ns;
- break;
- case 2: //南北黃燈減一
- yellow_ns--;
- if(yellow_ns==255)
- yellow_ns=9;
- red_ew=green_ns+yellow_ns;
- break;
- case 3:
- green_ew--;
- if(green_ew==255)
- green_ew=99;
- red_ns=green_ew+yellow_ew;
- break;
- case 4: //東西黃燈減一
- yellow_ew--;
- if(yellow_ew==255)
- {
- yellow_ew=9;
- }
- red_ns=green_ew+yellow_ew;
- break;
- }
- }
- }
- } //*************閃爍顯示函數*****************
- void show()
- {
- switch(count/17) //1秒 亮3次滅3次
- {
- case 0:
- switch(flag)
- {
- case 0:break;
- case 1:
- display_ns(green_ns);
- break;
- case 2:
- display_ns(yellow_ns);
- break;
- case 3:
- display_ew(green_ew);
- break;
- case 4:
- display_ew(yellow_ew);
- break;
- }
- break;
- case 1:break;
- case 2:
- switch(flag)
- {
- case 0:break;
- case 1:
- display_ns(green_ns);
- break;
- case 2:
- display_ns(yellow_ns);
- break;
- case 3:
- display_ew(green_ew);
- break;
- case 4:
- display_ew(yellow_ew);
- break;
- }
- break;
- case 3:break;
- case 4:
- switch(flag)
- {
- case 0:break;
- case 1:
- display_ns(green_ns);
- break;
- case 2:
- display_ns(yellow_ns);
- break;
- case 3:
- display_ew(green_ew);
- break;
- case 4:
- display_ew(yellow_ew);
- break;
- }
- break;
- }
- }
- //***************主函數*********************
- void main()
- {
- Inital(); //初始化函數
- while(1)
- {
- if(flag==0)
- {
- display_ns(snorth);
- display_ew(ewest);
- }
- else
- if(flag!=0)
- {
- turnkey(); // 鍵盤掃描函數
-
- show();
- //閃爍顯示函數
- }
- }
- }
- //*************定時器0中斷函數**************
- void time0() interrupt 1
- {
- TH0=0xD8; //定時時間為10ms
- TL0=0xF0;
- count++;
- if(count==100)
- //定時時間為1s
- {
- count=0;
- if(flag==0)
- {
- snorth--;
- //南北數字減1
- ewest--;
- //東西數字減1
- if(snorth==0)
- {
- ding_ns++;
- //南北下一狀態(tài)處理
- switch(ding_ns%3)
- {
- case 0: snorth=green_ns;
- NS_R=1;
- NS_G=0;
- NS_Y=1;
- break;
- case 1: snorth=yellow_ns;
- NS_R=1;
- NS_G=1;
- NS_Y=0;
- break;
- case 2: snorth=red_ns;
- NS_R=0;
- NS_G=1;
- NS_Y=1;
- break;
- }
- }
- if(ewest==0)
- {
- ding_ew++;
- //東西下一狀態(tài)處理
- switch(ding_ew%3)
- {
- case 0:ewest=red_ew;
- EW_R=0
- EW_G=1;
- EW_Y=1;
- break;
- case 1:ewest=green_ew;
- EW_R=1;
- EW_G=0;
- EW_Y=1;
- break;
- case 2: ewest=yellow_ew;
- EW_R=1;
- EW_G=1;
- EW_Y=0;
- break;
- }
- }
- }
- }
- } //*********外部中斷處理函數(設置鍵)************
- void int0() interrupt 0
- {
- EA=0; //關中斷
- if(!set)
- {
- delay(10); //設置鍵消抖 10ms
- if(!set)
- {
- NS_R=1;
- NS_G=1;
- NS_Y=1;
- EW_R=1;
- EW_G=1;
- EW_Y=1;
- flag++;
- }
- while(!set);
- delay(10);
- while(!set);
- switch(flag)
- {
- case 0:break;
- case 1:
- NS_R=1;
- //南北發(fā)光二極管
- NS_G=0;
- NS_Y=1;
- EW_R=1;
- //東西發(fā)光二極管
- EW_G=1;
- EW_Y=1;
- display_ns(green_ns);
- break;
- case 2:
- NS_R=1;
- //南北發(fā)光二極管
- NS_G=1;
- NS_Y=0;
- EW_R=1;
- //東西發(fā)光二極管
- EW_G=1;
- EW_Y=1;
- display_ns(yellow_ns);
- break;
- case 3:
- NS_R=1;
- //南北發(fā)光二極管
- NS_G=1;
- NS_Y=1;
- EW_R=1;
- //東西發(fā)光二極管
- EW_G=0;
- EW_Y=1;
- display_ew(green_ew);
- break;
- case 4:
- NS_R=1;
- //南北發(fā)光二極管
- NS_G=1;
- NS_Y=1;
- EW_R=1;
- //東西發(fā)光二極管
- EW_G=1;
- EW_Y=0;
- display_ew(yellow_ew);
- break;
- }
- if(flag==5)
- {
- flag=0;
- //改值后的初始化紅綠燈狀態(tài)和數碼管數字
- snorth=green_ns;
- ewest=red_ew;
- NS_R=1;
- NS_G=0;
- NS_Y=1;
- EW_R=0;
- EW_G=1;
- EW_Y=1;
- ding_ns=0;
- ding_ew=0;
- }
- }
- EA=1;
- //開中斷
- }
- //***********定時器1中斷函數****************
- void time1() interrupt 3
- {
- TH1=0xD8;
- TL1=0xF0;
- count2++;
- } 紅
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit AA=P2^2; // 南北紅
- sbit BB=P2^3; // 南北黃
- sbit CC=P2^4; // 南北綠
- sbit DD=P2^5; // 東西紅
- sbit EE=P2^6; // 東西黃
- sbit FF=P2^7; // 東西綠
- void delay(uint z);
- void main()
- {
- while(1)
- {
- AA=0;
- BB=0;
- CC=0;
- DD=0;
- EE=0;
- FF=0;
- delay(500);
- AA=1;
- BB=1;
- CC=1;
- DD=1;
- EE=1;
- FF=1;
- delay(500);
- }
- }
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- } 數碼管顯示檢測程序
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar count=0;
- ucharcount2=0,green_ns=60,
- green_ew=30,red_ns=34,red_ew=64,
- yellow_ns=4,yellow_ew=4;//南北綠燈亮60 東西綠燈30 南北紅燈34 東西紅燈64 南北黃燈4 東西黃燈4
- uchar ding_ns=0,ding_ew=0,flag=0,snorth=60,ewest=64; //計數到0后的處理,開始南北綠燈亮的時間,東西紅燈亮的時間
- void delay(uint z);
- void display(uchar s);
- sbit LED_EW_0=P2^0; //數碼管 位選段
- sbit LED_EW_1=P2^1;
- sbit LED_NS_0=P2^2;
- sbit LED_NS_1=P2^3;
- unsigned char code SEG7[10]=
- { 0xC0,/*0*/ // 共陽數碼管 0xF9,/*1*/ 0xA4,/*2*/ 0xB0,/*3*/ 0x99,/*4*/ 0x92,/*5*/ 0x82,/*6*/ 0xF8,/*7*/ 0x80,/*8*/0x90,/*9*/ };
- void delay(uint z) //1ms
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void display(uchar s) //數碼管顯示程序
- {
- P1=SEG7[s];
- }
- void main()
- {
- while(1)
- {
- LED_EW_0=1;
- LED_EW_1=1;
- LED_NS_0=1;
- LED_NS_1=1;
- P1=0x00;
- }
- }
- }
復制代碼 |