此程序通过定时器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];
- }
复制代码
|