仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg52.h>
- sbit ADDR0 =P1^0;
- sbit ADDR1 =P1^1;
- sbit ADDR2 =P1^2;
- sbit ADDR3 =P1^3;
- sbit ENLED =P1^4;
- unsigned char code LedChar[] = {
- 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
- 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
- };
-
- unsigned char LedBuff[6] = {
-
- 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
- };
- unsigned char i = 0;
- unsigned int cnt = 0;
- unsigned char flagls = 0;
- void main ()
- {
-
- unsigned long sec = 999999;
- EA = 1;
- ENLED =0;
- ADDR3 =1;
- TMOD = 0x10;
- TH1 = 0xFC;
- TL1 = 0x67;
- TR1 = 1;
- ET1 = 1;
- while (1)
- {
- if (flagls == 1)
- {
- flagls = 0;
- sec--;
- LedBuff[0] = LedChar[sec%10];
-
- LedBuff[1] = LedChar[sec/10%10];
-
- LedBuff[2] = LedChar[sec/100%10];
-
- LedBuff[3] = LedChar[sec/1000%10];
-
- LedBuff[4] = LedChar[sec/10000%10];
-
- LedBuff[5] = LedChar[sec/100000%10];
- if(sec <= 9)
- {
- LedBuff[1] = 0xff;LedBuff[2] = 0xff;LedBuff[3] = 0xff;LedBuff[4] = 0xff;LedBuff[5] = 0xff;
- }
- else if(sec <= 99)
- {
- LedBuff[2] = 0xff;LedBuff[3] = 0xff;LedBuff[4] = 0xff;LedBuff[5] = 0xff;
- }
- else if(sec <= 999)
- {
- LedBuff[3] = 0xff;LedBuff[4] = 0xff;LedBuff[5] = 0xff;
- }
- else if(sec <= 9999)
- {
- LedBuff[4] = 0xff;LedBuff[5] = 0xff;
- }
- else if(sec <= 99999)
- {
- LedBuff[5] = 0xff;
- }
- }}}
- void InterruptTimer1( )interrupt 3
- {
- TH1=0xFC;
- TL1=0x67;
- cnt++;
- if (cnt >= 1000)
- {
- cnt = 0;
- flagls =1;
- }
- P0 = 0xFF;
- switch (i)
- {
- case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; i++; P0 = LedBuff[0]; break;
- case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; i++; P0 = LedBuff[1]; break;
- case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; i++; P0 = LedBuff[2]; break;
- case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; i++; P0 = LedBuff[3]; break;
- case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; i++; P0 = LedBuff[4]; break;
- case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; i = 0; P0 = LedBuff[5]; break;
- default: break;
- }
- }
-
-
复制代码
Keil5代码与Proteus8.8仿真下载:
NEW7.zip
(83.51 KB, 下载次数: 13)
|