视频效果:
基于51单片机的数码管时钟设计
Proteus 仿真电路图:
C51代码:
#include<reg51.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uchar code num[10]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 0~9字码
uchar miao=0, fen=0, shi=0; //进位标志位
uint i=0; //计时
uchar miao_L, miao_H, fen_L, fen_H, shi_L, shi_H; //时、分、秒的个位(xxx_L)和十位(xxx_H)
void delay(uint x){ //延时函数
while(x--);
}
void T0_init(){ //定时器 0 初始化
TMOD = 0x10; //工作方式 1
TH0 = 0xfc; //高八位赋初值 65536-1000=64536 = fc18H
TL0 = 0x18; //底八位赋初值
EA = 1; //开总中断
ET0 = 1; //开 T0 中断
TR0 = 1; //启动 T0
}
void display(){ //显示
P2 = 0x20; //秒与分间隔线
P0 = 0xbf;
delay(500);
P2 = 0x04; //分与时间隔线
P0 = 0xbf;
delay(500);
P2 = 0x80; //数码管位选 1000 0000
P0 = num[miao_L]; //秒个位
delay(500);
P2 = 0x40; //数码管位选 0100 0000
P0 = num[miao_H]; //秒十位
delay(500);
P2 = 0x10; //数码管位选 0001 0000
P0 = num[fen_L]; //分个位
delay(500);
P2 = 0x08; //数码管位选 0000 1000
P0 = num[fen_H]; //分十位
delay(500);
P2 = 0x02; //数码管位选 0000 0010
P0 = num[shi_L]; //分个位
delay(500);
P2 = 0x01; //数码管位选 0000 0001
P0 = num[shi_H]; //分十位
delay(500);
}
void main(){
T0_init(); //定时器初始化
while(1){
display(); //显示
}
}
void int1() interrupt 1{ //中断服务函数
i++;
if(i == 100){
i = 0; //满一秒清零
miao++; //i = 100 为一,秒标志位加 1
if(miao == 60){
miao = 0; //满一分清零
fen++;
if(fen == 60){
fen = 0; //满一时清零
shi++;
if(shi == 24){
shi = 0; //24小时制
}
}
}
miao_L = miao%10; //秒个位
miao_H = miao/10; //秒十位
fen_L = fen%10; //分个位
fen_H = fen/10; //分十位
shi_L = shi%10; //分个位
shi_H = shi/10; //分十位
}
}