不用中断的方法让51单片机数码管显示时钟的代码
时间: 2024-09-11 19:16:42 浏览: 57
51单片机数码管动态时钟电路图
5星 · 资源好评率100%
在51单片机中实现不使用中断的数码管显示时钟代码,通常采用的是轮询的方式。轮询是通过不断地检查时间是否到达更新的时间点,然后更新数码管显示的方式。以下是一个简单的实现示例:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
// 假设数码管的段码和位选都连接到P0口
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
uchar code digit[] = { /* 这里是0-9的数码管编码 */ };
uchar second = 0;
uchar minute = 0;
uchar hour = 12;
void delay(uint z)
{
uint x, y;
for(x=z; x>0; x--)
for(y=110; y>0; y--);
}
void display(uchar hour, uchar minute)
{
uchar shi, ge;
shi = hour / 10;
ge = hour % 10;
P0 = digit[shi]; // 显示十位
LSA=0; LSB=0; LSC=0; // 选择第一个数码管
delay(5); // 延时以保证显示稳定
P0 = 0x00; // 消隐
shi = minute / 10;
ge = minute % 10;
P0 = digit[shi]; // 显示十位
LSA=1; LSB=0; LSC=0; // 选择第二个数码管
delay(5); // 延时以保证显示稳定
P0 = 0x00; // 消隐
P0 = digit[ge]; // 显示个位
LSA=0; LSB=1; LSC=0; // 选择第三个数码管
delay(5); // 延时以保证显示稳定
P0 = 0x00; // 消隐
}
void main()
{
while(1)
{
display(hour, minute); // 显示时间
delay(60000); // 延时大约1分钟
second++;
if(second >= 60)
{
second = 0;
minute++;
if(minute >= 60)
{
minute = 0;
hour++;
if(hour >= 24)
{
hour = 0;
}
}
}
}
}
```
这段代码中,我们使用了一个简单的延时函数`delay`来模拟时间的流逝。每次循环时,都会检查秒数是否达到了60,若达到则分钟加1,并重新开始秒数计数。同样的,分钟达到60后,小时加1,并重新开始分钟计数。如果小时达到了24,则重置为0。每次循环都调用`display`函数来更新数码管显示当前的时间。
注意,这个代码只是一个示例,实际使用时需要根据具体的硬件连接和数码管编码进行调整。
阅读全文