帮我用AT89C51用c语言写数字钟程序
时间: 2023-07-16 07:16:16 浏览: 41
好的,下面是一个简单的数字钟程序,基于AT89C51,使用C语言编写。
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
// 定义数码管显示的数字
uchar code numTable[10] = {0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
// 定义变量
uchar hour = 0, minute = 0, second = 0;
uchar ledState = 0; // 用于控制冒号的闪烁
// 延时函数,约为1ms
void delay()
{
uint i,j;
for(i=100;i>0;i--)
for(j=110;j>0;j--);
}
// 显示函数,显示时分秒
void display()
{
uchar temp1,temp2;
// 显示小时
temp1 = hour / 10;
temp2 = hour % 10;
P2 = 0xfe; // 选择第一位数码管
P0 = numTable[temp1]; // 显示十位数
delay();
P2 = 0xfd; // 选择第二位数码管
P0 = numTable[temp2]; // 显示个位数
delay();
// 显示冒号,每隔1秒闪烁一次
if(ledState == 0 || ledState == 1)
{
P2 = 0xfb; // 选择第三位数码管
P0 = 0xbf; // 显示冒号
delay();
}
// 显示分钟
temp1 = minute / 10;
temp2 = minute % 10;
P2 = 0xf7; // 选择第四位数码管
P0 = numTable[temp1]; // 显示十位数
delay();
P2 = 0xef; // 选择第五位数码管
P0 = numTable[temp2]; // 显示个位数
delay();
// 显示冒号,每隔1秒闪烁一次
if(ledState == 0 || ledState == 1)
{
P2 = 0xdf; // 选择第六位数码管
P0 = 0xbf; // 显示冒号
delay();
}
// 显示秒钟
temp1 = second / 10;
temp2 = second % 10;
P2 = 0xbf; // 选择第七位数码管
P0 = numTable[temp1]; // 显示十位数
delay();
P2 = 0x7f; // 选择第八位数码管
P0 = numTable[temp2]; // 显示个位数
delay();
// 冒号闪烁
if(++ledState >= 20) ledState = 0;
}
// 定时器中断函数,每1秒触发一次
void timer() interrupt 1
{
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
// 每秒钟执行一次
if(++second >= 60)
{
second = 0;
if(++minute >= 60)
{
minute = 0;
if(++hour >= 24)
{
hour = 0;
}
}
}
}
void main()
{
// 初始化定时器
TMOD = 0x01;
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1)
{
display(); // 显示时分秒
}
}
```
这个程序使用了8个共阳数码管,按照时分秒的顺序依次显示,冒号每隔1秒闪烁一次。在程序中,我们定义了一个numTable数组,用于存储数码管显示的数字,使用TMOD寄存器初始化定时器,并在定时器中断函数中更新时分秒的值。最后在主函数中不断调用display函数,实现时钟的显示。