在keil中利用有6位14引脚数码管,设计一款基于89c51单片机的数字钟,要求能显示24小时制时间,并可随时进行时间校对调整,具体要求如下: 1. 正常显示:单片机中装入程序后,接通电源即数码管显示屏显示000000,开始计时,右边二位数码管显示为秒,每1秒加1,加到60秒进1,右边二位数码管显示回零,继续从0开始计时,中间二位数码管显示为分钟,分加到60时进1,中间二位数码管显示回零,继续从0开始计时,左边二位数码管为小时,加到24回零,继续按规则计时
时间: 2023-09-30 14:02:37 浏览: 55
这是一个比较典型的数字时钟设计,以下是大致的程序流程:
1. 定义各数码管的引脚号码,并初始化为输出方式。
2. 定义计时器,每1秒触发中断,中断服务程序中将秒数加1,判断是否进位;分钟、小时同理。
3. 程序初始化时将所有数码管清零,开始计时。
4. 在主循环中不断检测是否有按键按下,若有按下则根据按键进行时间校对调整,校对完毕后重新开始计时并清零数码管。
5. 在主循环中不断更新数码管的显示内容,将当前的时间转换为对应的数码管显示内容。
以下是示例代码,仅供参考:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit s1 = P0^0; // 按键1,校对小时
sbit s2 = P0^1; // 按键2,校对分钟
sbit s3 = P0^2; // 按键3,校对秒钟
sbit dula = P2^6; // 数码管段选
sbit wela = P2^7; // 数码管位选
uchar code table[] = {
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
};
uchar hour = 0; // 小时
uchar minute = 0; // 分钟
uchar second = 0; // 秒钟
void delay(uint xms) // 延时函数
{
uint i, j;
for (i = xms; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
void display(uchar num, uchar pos) // 数码管显示函数
{
wela = 1; // 先拉高位选
P0 = pos; // 再设置段选
wela = 0; // 拉低位选
P0 = table[num]; // 设置段选对应的数码
dula = 1; // 先拉高段选
dula = 0; // 拉低段选
}
void init() // 初始化函数
{
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0xf8; // 定时器初值,每10ms中断一次
TL0 = 0xcc;
TR0 = 1; // 开启定时器
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
}
void timer0() interrupt 1 // 定时器0中断服务程序
{
TH0 = 0xf8;
TL0 = 0xcc;
second++; // 秒钟加1
if (second >= 60) {
second = 0;
minute++; // 分钟进位
if (minute >= 60) {
minute = 0;
hour++; // 小时进位
if (hour >= 24) {
hour = 0;
}
}
}
}
void main()
{
init(); // 初始化
display(0, 0x01); // 数码管清零
display(0, 0x03);
display(0, 0x05);
while (1) {
if (!s1) { // 按键1按下,校对小时
delay(10); // 延时去抖动
if (!s1) {
hour++;
if (hour >= 24) {
hour = 0;
}
}
}
if (!s2) { // 按键2按下,校对分钟
delay(10);
if (!s2) {
minute++;
if (minute >= 60) {
minute = 0;
}
}
}
if (!s3) { // 按键3按下,校对秒钟
delay(10);
if (!s3) {
second++;
if (second >= 60) {
second = 0;
}
}
}
display(hour/10, 0x00); // 显示小时
display(hour%10, 0x01);
display(minute/10, 0x02); // 显示分钟
display(minute%10, 0x03);
display(second/10, 0x04); // 显示秒钟
display(second%10, 0x05);
}
}
```