基于51单片机做的可调时钟,适合新手操作,有详细代码注释
1. 最左边两个数码管是显示“时”,中间两个和右边两个分别是“分”“秒”
2. 左边的按钮是调时的,右边的按钮是调分的,每按一下就会加一
3.每次启动单片机就是从00:00:00开始的
现在显示的时间是7:09:15
细节描述:
1.时钟的计时功能是用了51单片机的定时器模式2:8位自动装载模式,其定时时间为(以定时器0为例):
T=(256-T0初值)X机器周期=(256-T0初值)X振荡周期X12
2. 调时调分功能分别是用了外部中断1和外部中断0
代码块
#include "reg52.h"
typedef unsigned char uchar;
typedef unsigned int uint;
void delay(uint z); //延时
void write_address(uchar address); //选择数码管
void write_data(uint n); //选择显示的内容
void flicker(); //主要显示函数
uint date[7]={0,0,0,0,0,0,0}; //为了便于编程,忽略掉date[0],只使用date[1]~date[6]
uint n=0; //计数,计定时器中断的次数
uint second1=0,minute1=0,hour1=0; //用于flicker函数
uchar TIMECODE[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x00}; //字形码表
uchar WEICODE[7]={~0,~0x01,~0x02,~0x04,~0x08,
~0x10,~0x20}; //选中数码管表
void main()
{
TMOD=0x02; //把定时器模式设为模式2
TH0=0x56; //设置初值
TL0=0x56; //设置初值
TR0=1; //启动定时器
EA=1; //打开总中断开关
ET0=1; //打开定时器中断允许位
EX0=1; //打开外部中断0
IT0=1; //设置外部中断0的模式是下降沿触发
EX1=1; //打开外部中断1
IT1=1; //设置外部中断1的模式是下降沿触发
while(1)
{
flicker();
}
}
void delay(uint z)//z等于1,就是延时1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--)
;
}
void write_address(uchar address)//显示数码管
{
P2=address;
}
void write_data(uint n)//显示数据
{
P0=TIMECODE[n];
}
void flicker()//使数码管动态显示
{
write_address(WEICODE[1]);//最左边数码管亮
write_data(date[1]); //date[1]的值就是最左边数码管显示的值
delay(1);//延时
P0=~0xff;//消影
write_address(WEICODE[2]);//同上理
write_data(date[2]);
delay(1);
P0=~0xff;
write_address(WEICODE[3]);
write_data(date[3]);
delay(1);
P0=~0xff;
write_address(WEICODE[4]);
write_data(date[4]);
delay(1);
P0=~0xff;
write_address(WEICODE[5]);
write_data(date[5]);
delay(1);
P0=~0xff;
write_address(WEICODE[6]);
write_data(date[6]);
delay(1);
P0=~0xff;
}
void serve()interrupt 1//定时器中断响应
{
n++;
if(n==5000) //当n=5000时,表示过了1s
{
n=0;
second1++;
if(second1==60)
{
second1=0;
minute1++;
if(minute1==60)
{
minute1=0;
hour1++;
if(hour1==24)
{
hour1=0;
}
}
}
date[6]=second1%10;
date[5]=second1/10;
date[4]=minute1%10;
date[3]=minute1/10;
date[2]=hour1%10;
date[1]=hour1/10;
}
}
void tiaofen() interrupt 0//外部中断,按键调分响应
{
minute1++;
if(minute1==60)
minute1=0;
}
void tiaoshi() interrupt 2//外部中断,按键调时响应
{
hour1++;
if(hour1==24)
hour1=0;
}
新人博客,要是觉得有用给个赞呗嘻嘻