基于c51单片机,写出使数码管显示计时的计时电子钟程序
时间: 2023-12-11 10:04:51 浏览: 81
好的,根据你的要求,我可以为你提供一个基于C51单片机的数码管计时电子钟程序,代码如下:
```
#include <reg51.h> // 导入C51单片机头文件
sbit LATCH = P2^2; // 将P2.2口定义为锁存控制口
sbit SCLK = P2^1; // 将P2.1口定义为时钟控制口
sbit DATA = P2^0; // 将P2.0口定义为数据口
unsigned char code LED_DuanMa[17] = { // 定义数码管段码数据
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00
};
void delay(unsigned int i) // 延时函数
{
unsigned int j;
while(i--)
{
for(j = 0; j < 120; j++);
}
}
void Write(unsigned char dat) // 向数码管写入数据
{
unsigned char i;
for(i = 0; i < 8; i++)
{
SCLK = 0; // 时钟线置低
DATA = dat & 0x80; // 取出数据的最高位
dat <<= 1; // 数据左移1位
SCLK = 1; // 时钟线置高
}
}
void Display(unsigned char hour, unsigned char minute, unsigned char second) // 数码管显示时间
{
unsigned char i;
unsigned char dat[8] = {0, 0, 0, 0, 0, 0, 0, 0}; // 定义8个数码管的数据
dat[0] = LED_DuanMa[hour / 10]; // 计算小时的十位数
dat[1] = LED_DuanMa[hour % 10]; // 计算小时的个位数
dat[2] = LED_DuanMa[minute / 10]; // 计算分钟的十位数
dat[3] = LED_DuanMa[minute % 10]; // 计算分钟的个位数
dat[4] = LED_DuanMa[second / 10]; // 计算秒钟的十位数
dat[5] = LED_DuanMa[second % 10]; // 计算秒钟的个位数
for(i = 0; i < 8; i++) // 依次写入8个数码管的数据
{
Write(dat[i]);
}
LATCH = 1; // 锁存线置高
LATCH = 0; // 锁存线置低
}
void main()
{
unsigned char hour = 0, minute = 0, second = 0; // 初始化时间为0
while(1)
{
Display(hour, minute, second); // 显示当前时间
delay(1000); // 延时1秒
second++; // 秒数加1
if(second == 60) // 秒数到60时
{
second = 0; // 秒数清零
minute++; // 分钟数加1
}
if(minute == 60) // 分钟数到60时
{
minute = 0; // 分钟数清零
hour++; // 小时数加1
}
if(hour == 24) // 小时数到24时
{
hour = 0; // 小时数清零
minute = 0; // 分钟数清零
second = 0; // 秒数清零
}
}
}
```
这个程序的原理与之前的24小时计时器程序类似,只是增加了数码管的显示功能。在每次计时后,程序将当前时间的小时、分钟和秒钟数,分别转换为对应的数码管段码数据,并通过数码管显示出来。具体实现过程中,我们需要使用锁存控制口、时钟控制口和数据口,将数据写入到数码管中,从而实现显示效果。你可以将这个程序下载到C51单片机上运行,即可实现基于数码管的计时电子钟。
阅读全文