樓主的程序:
- #include <reg52.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- char count=0,num=15,i,j; /**count為定時器技術變量,num為時刻變量,i為*/
- char number[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//
- bit flag=0;//1s的標識變量
- //交通燈控制位
- sbit P1_0=P1^0;
- sbit P1_1=P1^1;
- sbit P1_2=P1^2;
- sbit P1_3=P1^3;
- sbit P1_4=P1^4;
- sbit P1_5=P1^5;
- sbit P1_6=P1^6;
- //數(shù)碼管顯示位控制
- sbit P2_0 = P2^0;
- sbit P2_1 = P2^1;
- //PT2272接收端
- sbit PT2272_DDR_D0 = P3^0;
- sbit PT2272_DDR_D1 = P3^1;
- sbit PT2272_DDR_D2 = P3^2;
- sbit PT2272_DDR_D3 = P3^3;
- /*************************************************************
- **函數(shù)名稱:delayms()
- **函數(shù)功能:ms延時函數(shù)
- **入口參數(shù):延時時間 i;
- **出口參數(shù):無
- *************************************************************/
-
- void delayms(unsigned char i)
- { unsigned char j ;
- while(i--)
- {for(j=0;j<125;j++)
- {; } }
- }
- /*************************************************************
- **函數(shù)名稱:Timer_srv() interrupt 1
- **函數(shù)功能:定時器中斷函數(shù)
- **入口參數(shù):無
- **出口參數(shù):無
- *************************************************************/
- Timer_srv() interrupt 1 using 1
- {
- TH0=0x3c;
- TL0=0xaf; /**重新設置定時器初值**/
- count++; //定時器計數(shù)加1,表示已經計數(shù)100ms
- if(count==10)
- {
- count=0;
- flag=1;
- } //計滿10次,定時器計數(shù)變量count初始化,并標識已計時1s
- }
- /*************************************************************
- **函數(shù)名稱:Display(int n)
- **函數(shù)功能:數(shù)碼管顯示函數(shù)
- **入口參數(shù):要顯示的數(shù)字 n
- **出口參數(shù):無
- *************************************************************/
- void Display(int n)
- {
- P2_0 = 1;
- P0 = number[n%10];
- delayms(1);
- P2 = 0x00;
- P2_1 = 1;
- P0 = number[n/10];
- delayms(1);
- P2 = 0x00;
- }
- /*************************************************************
- **函數(shù)名稱:light()
- **函數(shù)功能:交通燈顯示
- **入口參數(shù):無
- **出口參數(shù):無
- *************************************************************/
- void light(void)
- {
- while(1)
- {
- P1_0=!P1_0; //P1.0 S1狀態(tài)打開 南北方向 紅燈
- P1_3=!P1_3; //P1.3 S1狀態(tài)打開 東西方向 綠燈
- Display(num);
- while(num<60&&num>5)
- {
- while(!flag) //等待1s
- flag = 0;
- num --;
- Display(num); //60秒倒計時顯示
- }
-
- P1_0=!P1_0; //關閉S1狀態(tài),
- P1_3=!P1_3;
-
- P1_1=!P1_1; //打開S2狀態(tài) 南北方向 黃燈
- P1_4=!P1_4; //打開S2狀態(tài) 南北方向 黃燈
- while(num>=0&&num<=5)
- {
- while(!flag) //等待1s
- flag = 0;
- num --;
- Display(num); //5秒倒計時顯示
- }
- P1_1=!P1_1; /*黃燈閃爍*/
- P1_4=!P1_4;
- if(0==num)
- {
- while(!flag) //等待1s
- flag = 0;
- num --;
- Display(num);
- } //判斷時刻為0,重置數(shù)據(jù)
-
- P1_2=!P1_2; //關閉S2狀態(tài),打開S3狀態(tài) 南北方向 綠燈
- P1_5=!P1_5; //關閉S2狀態(tài),打開S3狀態(tài) 東西方向 紅燈
- while(num<=30&&num>5)
- {
- while(!flag) //等待1s
- flag = 0;
- num --;
- Display(num); //30秒倒計時顯示
- }
- P1_2=!P1_2; //關閉S3
- P1_5=!P1_5;
-
- P1_1=!P1_1; //打開S2
- P1_4=!P1_4;
- while(num>=0&&num<=5)
- {
- while(!flag) //等待1s
- flag = 0;
- num --;
- Display(num); //5秒倒計時顯示
- }
- P1_0=!P1_0; /*閃爍*/
- if(0==num)
- {
- while(!flag) //等待1s
- flag = 0;
- num = 60; //重置計數(shù)
- }
- }
- }
- /*************************************************************
- **函數(shù)名稱:PT2272_init()
- **函數(shù)功能:PT2272初始化函數(shù)
- **入口參數(shù):無
- **出口參數(shù):無
- *************************************************************/
- void PT2272_init(void)
- {
- PT2272_DDR_D0&= ~(PT2272_DDR_D0);
- PT2272_DDR_D1 &= ~(PT2272_DDR_D1);
- PT2272_DDR_D2 &= ~(PT2272_DDR_D2);
- PT2272_DDR_D3 &= ~(PT2272_DDR_D3);
- }
- /***************主函數(shù)**************************/
- void main()
- {
- TMOD = 0x01;
- TH0=0x3c;
- TL0=0xaf;
- EA=1;
- TR0=1;/*開定時器0中斷*/
- P0 = 0x00; /*初始化P0*/
- PT2272_init();//PT2272初始化
- light();/*調用顯示子程序*/
- while(1);
- }
復制代碼 |