用C语言写一段控制AT89C51单片机的程序,要求如下:8 个数码管上分两组动态显示年月日与时分秒,显示延时用定时器实现
时间: 2024-02-19 17:57:16 浏览: 118
好的,下面是一个简单的用C语言编写的程序,可以控制AT89C51单片机上的8个数码管显示年月日与时分秒。在这个程序中,我们使用了一个定时器来实现显示延时。
```
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar year, month, day, hour, minute, second;
void display() //数码管动态显示函数
{
uchar i;
uint temp;
for(i=0;i<8;i++)
{
P0 = 0xFF;
switch(i)
{
case 0: temp = year/100;break;
case 1: temp = year%100/10;break;
case 2: temp = year%10;break;
case 3: temp = month/10;break;
case 4: temp = month%10;break;
case 5: temp = day/10;break;
case 6: temp = day%10;break;
case 7: temp = hour/10*100+hour%10;break;
case 8: temp = minute/10*100+minute%10;break;
case 9: temp = second/10*100+second%10;break;
}
P2 = tab[temp/100];
P0 = ~(1<<i);
delay(2);
P2 = tab[temp%100/10];
P0 = ~(1<<i);
delay(2);
P2 = tab[temp%10];
P0 = ~(1<<i);
delay(2);
}
}
void delay(uint x) //延时函数
{
uint i, j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void main()
{
TMOD = 0x01; //定时器0工作在模式1
TH0 = 0xFC; //定时器0初始值
TL0 = 0x66;
TR0 = 1; //启动定时器0
ET0 = 1; //开定时器0中断
EA = 1; //开总中断
while(1);
}
void timer0() interrupt 1 //定时器0中断函数
{
static uchar cnt;
TH0 = 0xFC; //重新装载定时器0初值
TL0 = 0x66;
cnt++;
if(cnt == 20) //20次中断为1秒
{
cnt = 0;
second++;
if(second == 60)
{
second = 0;
minute++;
if(minute == 60)
{
minute = 0;
hour++;
if(hour == 24)
{
hour = 0;
day++;
if(day == 32 && (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12))
{
day = 1;
month++;
if(month == 13)
{
month = 1;
year++;
}
}
else if(day == 31 && (month == 4 || month == 6 || month == 9 || month == 11))
{
day = 1;
month++;
}
else if(day == 29 && month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))
{
day = 1;
month++;
}
else if(day == 28 && month == 2 && ((year % 4 != 0) || (year % 100 == 0 && year % 400 != 0)))
{
day = 1;
month++;
}
}
}
}
}
display();
}
```
在这个程序中,我们使用了定时器0来实现每1秒钟中断一次,同时在中断函数中更新年月日与时分秒的值,并且调用数码管动态显示函数来动态显示这些值。数码管动态显示函数中,我们将年份的百位数码管显示在第0位,十位显示在第1位,个位显示在第2位,月份的十位显示在第3位,个位显示在第4位,日期的十位显示在第5位,个位显示在第6位,小时的十位显示在第7位,个位显示在第8位,分钟的十位显示在第9位,个位显示在第10位,秒的十位显示在第11位,个位显示在第12位。
阅读全文