编写51单片机数字电子钟程序
时间: 2024-02-21 12:57:09 浏览: 73
基于51单片机的数字钟程序
以下是一个简单的51单片机数字电子钟程序,代码注释中有相应的解释。这个程序实现了基本的时间显示和设置功能,你可以根据自己的需求进行修改和扩展。
```
#include<reg52.h>
sbit key1=P2^0; //按键1
sbit key2=P2^1; //按键2
sbit key3=P2^2; //按键3
sbit key4=P2^3; //按键4
sbit dula=P2^6; //段选锁存器控制端
sbit wela=P2^7; //位选锁存器控制端
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, //0~9的数码管显示段码值
0x77, //A
0x7c, //b
0x39, //C
0x5e, //d
0x79, //E
0x71, //F
0x40, //-
0x00 //全灭
};
unsigned char code hour_add[]={
0x80,0x40,0x20,0x10 //小时的增加量
};
unsigned char code minute_add[]={
0x08,0x04,0x02,0x01 //分钟的增加量
};
unsigned char code time_init[]={ //初始时间,小时、分钟
0x12,0x34
};
unsigned char hour,minute,second; //小时、分钟、秒
void delay(unsigned int k) //简单的延时函数
{
unsigned int i,j;
for(i=0;i<k;i++)
for(j=0;j<120;j++);
}
void display(unsigned char *p) //数码管显示函数
{
unsigned char i;
wela=1; //打开位选锁存器
P0=0xfe; //第一位数码管亮
wela=0; //关闭位选锁存器
for(i=0;i<8;i++)
{
P0=table[*p]; //将要显示的数码管段码值写入P0口
dula=1; //打开段选锁存器
dula=0; //关闭段选锁存器
*p++; //指向下一个数码管的段码值
delay(1); //延时一段时间,让人眼能够看到数码管的亮灭变化
}
}
void init() //初始化函数,将小时、分钟、秒和按键的状态初始化
{
hour=time_init[0];
minute=time_init[1];
second=0;
key1=1;
key2=1;
key3=1;
key4=1;
}
void main()
{
unsigned char i=0;
init(); //初始化
while(1)
{
display(time_init); //数码管显示初始时间
while(1)
{
if(key1==0) //按键1按下,小时加1
{
delay(10); //按键消抖
if(key1==0)
{
hour+=hour_add[i];
if(hour>=24)
hour=0;
while(!key1); //松开按键1
}
}
if(key2==0) //按键2按下,分钟加1
{
delay(10); //按键消抖
if(key2==0)
{
minute+=minute_add[i];
if(minute>=60)
minute=0;
while(!key2); //松开按键2
}
}
if(key3==0) //按键3按下,调整时间结束
{
delay(10); //按键消抖
if(key3==0)
{
time_init[0]=hour; //将调整后的小时和分钟写入初始时间
time_init[1]=minute;
while(!key3); //松开按键3
break; //退出调整时间循环
}
}
if(key4==0) //按键4按下,切换小时和分钟的调整
{
delay(10); //按键消抖
if(key4==0)
{
i++; //i=0,1,2,3分别对应小时的十位、小时的个位、分钟的十位、分钟的个位
if(i==4)
i=0;
while(!key4); //松开按键4
}
}
display(time_init); //数码管显示当前时间
}
}
}
```
这只是一个简单的示例程序,如果你需要更多的功能,可以根据需求进行修改和扩展。
阅读全文