樓主的程序:
- #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;
- //數碼管顯示位控制
- 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;
- /*************************************************************
- **函數名稱:delayms()
- **函數功能:ms延時函數
- **入口參數:延時時間 i;
- **出口參數:無
- *************************************************************/
-
- void delayms(unsigned char i)
- { unsigned char j ;
- while(i--)
- {for(j=0;j<125;j++)
- {; } }
- }
- /*************************************************************
- **函數名稱:Timer_srv() interrupt 1
- **函數功能:定時器中斷函數
- **入口參數:無
- **出口參數:無
- *************************************************************/
- Timer_srv() interrupt 1 using 1
- {
- TH0=0x3c;
- TL0=0xaf; /**重新設置定時器初值**/
- count++; //定時器計數加1,表示已經計數100ms
- if(count==10)
- {
- count=0;
- flag=1;
- } //計滿10次,定時器計數變量count初始化,并標識已計時1s
- }
- /*************************************************************
- **函數名稱:Display(int n)
- **函數功能:數碼管顯示函數
- **入口參數:要顯示的數字 n
- **出口參數:無
- *************************************************************/
- 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;
- }
- /*************************************************************
- **函數名稱:light()
- **函數功能:交通燈顯示
- **入口參數:無
- **出口參數:無
- *************************************************************/
- void light(void)
- {
- while(1)
- {
- P1_0=!P1_0; //P1.0 S1狀態打開 南北方向 紅燈
- P1_3=!P1_3; //P1.3 S1狀態打開 東西方向 綠燈
- Display(num);
- while(num<60&&num>5)
- {
- while(!flag) //等待1s
- flag = 0;
- num --;
- Display(num); //60秒倒計時顯示
- }
-
- P1_0=!P1_0; //關閉S1狀態,
- P1_3=!P1_3;
-
- P1_1=!P1_1; //打開S2狀態 南北方向 黃燈
- P1_4=!P1_4; //打開S2狀態 南北方向 黃燈
- 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,重置數據
-
- P1_2=!P1_2; //關閉S2狀態,打開S3狀態 南北方向 綠燈
- P1_5=!P1_5; //關閉S2狀態,打開S3狀態 東西方向 紅燈
- 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; //重置計數
- }
- }
- }
- /*************************************************************
- **函數名稱:PT2272_init()
- **函數功能:PT2272初始化函數
- **入口參數:無
- **出口參數:無
- *************************************************************/
- 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);
- }
- /***************主函數**************************/
- void main()
- {
- TMOD = 0x01;
- TH0=0x3c;
- TL0=0xaf;
- EA=1;
- TR0=1;/*開定時器0中斷*/
- P0 = 0x00; /*初始化P0*/
- PT2272_init();//PT2272初始化
- light();/*調用顯示子程序*/
- while(1);
- }
復制代碼 |