用C语言以AT89C51为芯片写一个6位共阴极数码管显示时、分、秒,能够使用按键增减时、分、秒,把调用函数写进程序里并对程序进行注释
时间: 2024-03-16 17:44:41 浏览: 68
AT89C51秒表C程序
4星 · 用户满意度95%
好的,您的问题是如何用C语言以AT89C51为芯片写一个6位共阴极数码管显示时、分、秒,并且能够使用按键增减时、分、秒,把调用函数写进程序里并对程序进行注释。下面是一个简单的实现,供您参考:
```
#include <reg51.h> // 包含AT89C51的头文件
sbit DULA=P2^6; // 定义数码管段选控制引脚
sbit WELA=P2^7; // 定义数码管位选控制引脚
unsigned char code table[]={ // 数码管显示0~9的编码表
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
unsigned char second=0; // 秒
unsigned char minute=0; // 分
unsigned char hour=0; // 时
void delay(unsigned int i) // 延时函数
{
unsigned int j;
for(j=0;j<i;j++);
}
void display(unsigned char dat,unsigned char num) // 显示函数
{
WELA=1; // 先关闭所有位选
P0=0; // 先清零
WELA=0; // 打开指定位选
switch(num) // 判断位选
{
case 1: P0=table[dat/100];break; // 百位
case 2: P0=table[dat%100/10];break; // 十位
case 3: P0=table[dat%10];break; // 个位
case 4: P0=table[hour/10];break; // 时的十位
case 5: P0=table[hour%10];break; // 时的个位
case 6: P0=table[minute/10];break; // 分的十位
case 7: P0=table[minute%10];break; // 分的个位
case 8: P0=table[second/10];break; // 秒的十位
case 9: P0=table[second%10];break; // 秒的个位
}
DULA=1; // 打开段选
delay(5); // 延时
DULA=0; // 关闭段选
}
void main()
{
TMOD=0x01; // 定时器0工作在模式1
TH0=0x3c; // 定时器初值
TL0=0xb0;
TR0=1; // 启动定时器0
ET0=1; // 开中断
EA=1; // 总中断允许
while(1) // 循环执行
{
display(second,9); // 显示秒的个位
display(second/10,8); // 显示秒的十位
display(minute%10,7); // 显示分的个位
display(minute/10,6); // 显示分的十位
display(hour%10,5); // 显示时的个位
display(hour/10,4); // 显示时的十位
}
}
void timer0() interrupt 1 // 定时器0中断服务函数
{
TH0=0x3c; // 定时器初值
TL0=0xb0;
second++;
if(second==60) // 满60秒进1分
{
second=0;
minute++;
}
if(minute==60) // 满60分进1时
{
minute=0;
hour++;
}
if(hour==24) // 满24时清零
{
hour=0;
}
}
```
以上代码实现了一个时钟功能,每秒钟更新一次数码管的显示。其中,`display()`函数根据传入的参数,控制数码管的位选和段选显示相应的数字。在`main()`函数中,不断调用`display()`函数,实时显示当前的时间。在`timer0()`中断服务函数中,每秒钟更新一次时间。
阅读全文