`
上图是
proteus仿真图,其中反相器用74lHC14,排阻用10K的,晶振用12MHZ的,电阻R1-R8用200欧的即可。但在实际制作时数码管可以用两个四位一体共阳极的,这样连接
电路会更加方便。可以用
三极管代替反相器,这样可以节约成本,但代替后无法用Proteus仿真出来,下图为代替后的图片,三极管用常用的9012或者9015即可,经本人实际验证效果非常好。
下图为原理图:
下图为实物图
以下为源程序
- #include
- #define uint unsigned int
- #define uchar unsigned char
- uchar code table[]={ //不带小数点的数码管编码
- 0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90};
- uchar code table1[]={ //带小数点的数码管编码
- 0x40,0x79,0x24,0x30,
- 0x19,0x12,0x02,0x78,
- 0x00,0x10};
- uchar shi=12,second,minute;
- uint num,num1,num2,num3;
- ***it k1=P1^4;
- ***it k2=P1^5;
- void display();
- void keyscan();
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void init()
- {
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%6;
- EA=1;
- ET0=1;
- TR0=1;
- }
- void main()
- {
- init();
- while(1)
- {
- keyscan();
- display();
- }
- }
- void timer0() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%6;
- num++;
- if(num==20)
- {
- num=0;
- second++;
- if(second==60)
- {
- second=0;
- minute++;
- }
- if(minute>=60)
- {
- minute=0;
- shi++;
- }
- if(shi>=24)
- shi=0;
- }
- }
- void display()
- {
- P2=0xdf;
- P0=table[second];
- delay(2);
- P2=0xff;
- P2=0xef;
- P0=table[second/10];
- delay(2);
- P2=0xff;
- P2=0xf7;
- P0=table1[minute];
- delay(2);
- P2=0xff;
- P2=0xfb;
- P0=table[minute/10];
- delay(2);
- P2=0xff;
- P2=0xfd;
- P0=table1[shi];
- delay(2);
- P2=0xff;
- P2=0xfe;
- P0=table[shi/10];
- delay(2);
- P2=0xff;
- }
- void keyscan()
- {
- if(k1==0)
- {
- delay(10);
- if(k1==0)
- {
- shi++;
- while(!k1);
- }
- }
- if(k2==0)
- {
- delay(10);
- if(k2==0)
- {
- minute++;
- while(!k2);
- }
- }
- }
`