效果:
清单:
AT89S52 * 1
74HC573 * 2
最小系统 * 1
4位数码管 * 1
杜邦线若干
说明:
P0的8个口接数码管,P1的0~2共3个口接位选、段选和秒指示灯
源码:
/**
* 单片机4位数码管时钟钟表C语言源码
*/
#include <reg52.h>
unsigned int f = 0,delayCount = 0,delayLed = 0,sleepDelay = 3;
unsigned char code numTable[]={
0x3f,
0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,
0x7c,0x39,0x5e,0x79,0x71
};
unsigned char hour,minute,second,hourH,hourL,minH,minL;
sbit digit = P1^0; // 位选,锁存器
sbit segment = P1^1; // 段选,锁存器
sbit led = P1^2; // 秒指示灯
// P0接数码管的8根线
void init();
void delay(unsigned char n);
void showTime(unsigned char hour,minute);
void main(){
init();
while(1){
if(delayLed <= 500){
led = 0;
}else if(delayLed > 500 && delayLed <= 1000){
led = 1;
}else{
delayLed = 0;
}
if(second > 59){
second = 0;
minute++;
}
if(minute > 59){
minute = 0;
hour++;
}
if(hour > 23){
hour = 0;
minute = 0;
second = 0;
}
//showTime(hour,minute);
showTime(minute,second);
//showTime(12,34);
}
}
void init()
{
TMOD= 0x01;
TH0 = (65536 - 1000 ) / 256;
TL0 = (65536 - 1000 ) % 256;
EA = 1; // 总中断
ET0 = 1; // 定时器0的中断开启
TR0 = 1; // 启动 timer0
delayCount = 0;
delayLed = 0;
hour = 0;
minute = 0;
second = 0;
led = 1;
}
void showTime(unsigned char hour,minute)
{
unsigned char hourH,hourL,minH,minL;
hourH = hour / 10; // 时十位
hourL = hour % 10; // 时个位
minH = minute / 10; // 分十位
minL = minute % 10; // 分个位
digit = 1;
P0 = 0x01; // 1 2 4 8
digit = 0;
segment = 1;
P0 = ~numTable[hourH];
segment = 0;
delay(sleepDelay);
digit = 1;
P0 = 0x02; // 1 2 4 8
digit = 0;
segment = 1;
P0 = ~numTable[hourL];
segment = 0;
delay(sleepDelay);
digit = 1;
P0 = 0x04; // 1 2 4 8
digit = 0;
segment = 1;
P0 = ~numTable[minH];
segment = 0;
delay(sleepDelay);
digit = 1;
P0 = 0x08; // 1 2 4 8
digit = 0;
segment = 1;
P0 = ~numTable[minL];
segment = 0;
delay(sleepDelay);
}
void delay(unsigned char n)
{
delayCount = 0;
while(1){
if(delayCount >= n){
delayCount = 0;
break;
}
}
}
void te0() interrupt 1 // 1毫秒,1000次 == 1秒 == 1000毫秒
{
TH0 = (65535 - 1000) / 256;
TL0 = (65535 - 1000) % 256;
f++; // 使 second 每秒累加
if(f >= 1000) {
second++;
f = 0;
}
delayLed++; // 秒指示灯间隔标记
delayCount++; // 动态扫描时刷新间隔标记
}
// End
– 完 –
