此程序通過定時器0計時,然后每計時一秒顯示在數碼管上,總共計時60秒,每過60秒led狀態反轉一次,數碼管位選信號引腳為P2口,并且是通過138譯碼器來控制的,即3位控制8位,138譯碼器輸入信號引腳為P2^2,P2^3,P2^4;斷選信號引腳為P0口,此程序采用的是共陰極數碼管,com口為低電平,給高電平亮。led小燈控制引腳為P2^7口。
- #include "reg52.h"
- typedef unsigned char u8;
- typedef unsigned int u16;
- #define SEG P0
- //#define SCANP P2
- sbit LED=P2^7;
- #define count_M1 50000
- #define TH_M1 (65536-count_M1)/256
- #define TL_M1 (65536-count_M1)%256
- int count_T0=0;
- #define count_M2 250
- #define TH_M2 (256-count_M2)
- #define TL_M2 (256-count_M2)
- u8 count_T1=0;
- u8 code TAB[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- u8 disp[2]={0x3f,0x3f};
- u8 wei [2]={0x80,0x84};
- u8 seconds=0;
- //u8 scan=0x1c;
- void delay(u16 i)
- {
- while(i--);
- }
- main()
- {
-
- IE=0x82;
- TMOD=0x01;
- TH0=TH_M1;TL0=TL_M1;
- TR0=1;
- while(1)
- {
- u8 i;
- for(i=0;i<=1;i++)
- {
- // count_T1=0;
- SEG=0x00;
- delay(10);
- // SCANP=~scan;
- SEG=disp[i];
- P2=wei[i];
- delay(100);
- }
- // TH1=TH_M2;TL1=TL_M2;
- // TR1=1;
- // LED=1;
- }
- }
- void T0_1s(void) interrupt 1
- {
- TH0=TH_M1;TL0=TL_M1;
- if(++count_T0==20)
- {
- count_T0=0;
- seconds++;
- if(seconds==60)
- {
- seconds=0;
- LED=~LED;
- delay(10000);
- }
- }
- disp[1]=TAB[seconds/10];
- disp[0]=TAB[seconds%10];
- }
復制代碼
|