基于单片机的简易数字电子钟显示年月日时分秒的软件
时间: 2024-01-10 16:03:27 浏览: 35
以下是基于单片机的简易数字电子钟显示年月日时分秒的软件:
```c
#include <reg52.h>
/* 定义数码管段选IO口 */
sbit A = P2^0;
sbit B = P2^1;
sbit C = P2^2;
sbit D = P2^3;
sbit E = P2^4;
sbit F = P2^5;
sbit G = P2^6;
sbit DP = P2^7;
/* 定义数码管位选IO口 */
sbit DIG1 = P3^0;
sbit DIG2 = P3^1;
sbit DIG3 = P3^2;
sbit DIG4 = P3^3;
/* 定义全局变量 */
unsigned char second, minute, hour, day, month, year;
/* 定义函数 */
void DisplayTime();
void Display(unsigned char num, unsigned char dig);
/* 定时器0中断服务函数 */
void Timer0() interrupt 1
{
static unsigned char cnt = 0;
cnt++;
if(cnt >= 20) //20个定时器周期后更新一次时间
{
cnt = 0;
/* 读取DS1302时钟芯片中的时间和日期 */
second = DS1302_Read(0x81);
minute = DS1302_Read(0x83);
hour = DS1302_Read(0x85);
day = DS1302_Read(0x87);
month = DS1302_Read(0x89);
year = DS1302_Read(0x8d);
/* 显示时间和日期 */
DisplayTime();
}
}
/* 主函数 */
void main()
{
/* 初始化 */
DS1302_Init();
Timer0_Init();
EA = 1;
while(1);
}
/* 显示时间和日期 */
void DisplayTime()
{
/* 显示秒 */
Display(second % 10, 1);
Display(second / 10, 2);
DP = 1; //显示秒的小数点
DelayMs(5);
/* 显示分 */
Display(minute % 10, 3);
Display(minute / 10, 4);
DP = 0; //不显示分的小数点
DelayMs(5);
/* 显示时 */
Display(hour % 10, 1);
Display(hour / 10, 2);
DP = 0; //不显示时的小数点
DelayMs(5);
/* 显示年 */
Display(year % 10, 3);
Display(year / 10, 4);
DP = 0; //不显示年的小数点
DelayMs(5);
/* 显示月 */
Display(month % 10, 1);
Display(month / 10, 2);
DP = 1; //显示月的小数点
DelayMs(5);
/* 显示日 */
Display(day % 10, 3);
Display(day / 10, 4);
DP = 0; //不显示日的小数点
DelayMs(5);
}
/* 显示一个数字 */
void Display(unsigned char num, unsigned char dig)
{
/* 关闭所有数码管 */
DIG1 = DIG2 = DIG3 = DIG4 = 1;
/* 按位显示数字 */
switch(num)
{
case 0: A = B = C = D = E = F = 1; G = 0; break;
case 1: B = C = 1; A = D = E = F = G = 0; break;
case 2: A = B = G = E = D = 1; C = F = 0; break;
case 3: A = B = C = D = G = 1; E = F = 0; break;
case 4: B = C = F = G = 1; A = D = E = 0; break;
case 5: A = C = D = F = G = 1; B = E = 0; break;
case 6: A = C = D = E = F = G = 1; B = 0; break;
case 7: A = B = C = 1; D = E = F = G = 0; break;
case 8: A = B = C = D = E = F = G = 1; break;
case 9: A = B = C = D = F = G = 1; E = 0; break;
}
/* 选中需要显示的数码管 */
switch(dig)
{
case 1: DIG1 = 0; break;
case 2: DIG2 = 0; break;
case 3: DIG3 = 0; break;
case 4: DIG4 = 0; break;
}
}
/* 延时函数 */
void DelayMs(unsigned int ms)
{
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 1000; j++);
}
```
在主函数中,我们初始化DS1302时钟芯片和定时器0,并开启中断。在定时器0的中断服务函数中,我们每隔20个定时器周期读取一次DS1302时钟芯片中的时间和日期,并通过数码管显示出来。其中,显示时间和日期的函数使用了Display函数,该函数可以按位显示一个数字。另外,为了让显示效果更加美观,我们还实现了一个DelayMs函数,用于延时一段时间。
通过以上软件实现,我们可以实现一个简易数字电子钟,能够显示年月日时分秒。