在keil中利用有6位数码管,设计一款基于89c51单片机的数字钟,要求能显示24小时制时间,具体要求如下:单片机中装入程序后,接通电源即数码管显示屏显示000000,开始计时,右边二位数码管显示为秒,每1秒加1,加到60秒进1,右边二位数码管显示回零,继续从0开始计时,中间二位数码管显示为分钟,分加到60时进1,中间二位数码管显示回零,继续从0开始计时,左边二位数码管为小时,加到24回零,继续按规则计时
时间: 2023-07-03 22:07:39 浏览: 125
以下是基于89c51单片机的数字钟设计程序:
```
#include <reg51.h>
//定义6位数码管端口连接单片机的引脚
sbit Dig1 = P2^2;
sbit Dig2 = P2^3;
sbit Dig3 = P2^4;
sbit Seg = P0;
//定义变量
unsigned char sec = 0; //秒
unsigned char min = 0; //分
unsigned char hour = 0; //时
//延时函数,用于控制数码管扫描速度
void delay(unsigned int t)
{
unsigned int i, j;
for (i = 0; i < t; i++)
{
for (j = 0; j < 100; j++);
}
}
//显示函数,用于将数字转换为对应的数码管段码并在数码管上显示
void display(unsigned char num, unsigned char dig)
{
unsigned char code Nums[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90};
//Nums数组中存放0~9的段码
//将数码管接口设置为输出
Dig1 = 1; Dig2 = 1; Dig3 = 1;
Seg = Nums[num / 10]; //显示十位数码
Dig1 = (dig == 1) ? 0 : 1; //选择要显示的数码管
delay(1); //延时
Seg = Nums[num % 10]; //显示个位数码
Dig2 = (dig == 2) ? 0 : 1;
delay(1);
}
//中断函数,每秒触发一次
void timer0_isr(void) interrupt 1
{
sec++; //秒数加1
if (sec == 60) //如果秒数达到60
{
sec = 0; //秒数清零
min++; //分数加1
if (min == 60) //如果分数达到60
{
min = 0; //分数清零
hour++; //小时数加1
if (hour == 24) //如果小时数达到24
{
hour = 0; //小时数清零
}
}
}
}
//主函数
void main()
{
//初始化定时器0
TMOD |= 0x01; //设置定时器0为模式1
TH0 = 0xFC; //设置定时器0初值
TL0 = 0x67;
ET0 = 1; //允许定时器0中断
EA = 1; //允许总中断
TR0 = 1; //启动定时器0
while (1)
{
display(sec, 3); //显示秒
display(min, 2); //显示分
display(hour, 1); //显示时
}
}
```
程序中使用了定时器0中断,每秒触发一次,将秒数加1,并根据时、分、秒的变化调用`display()`函数在数码管上显示。`display()`函数中,将数字转换为对应的数码管段码,并在数码管上显示,其中`Dig1`、`Dig2`、`Dig3`分别控制左、中、右三个数码管的显示,`Seg`用于输出数码管段码。
至此,数字钟的设计就完成了。在keil中编译程序,下载到89c51单片机上,连接6位数码管后,即可实现24小时制数字钟的功能。
阅读全文