用C语言以AT89C51为芯片写一个6位数码管显示时、分、秒,能够使用按键增减时间,把调用函数写进程序里并对程序进行注释
时间: 2024-03-08 07:46:37 浏览: 17
好的,下面是一个基于AT89C51的6位数码管显示时分秒,并且能够使用按键增减时间的示例代码。我将调用函数写进了程序中,并添加了注释,方便理解。
```c
#include <reg51.h> // 引入AT89C51的头文件
#define uchar unsigned char // 定义uchar为unsigned char类型
#define uint unsigned int // 定义uint为unsigned int类型
sbit LSA=P2^2; // 数码管的位选端口
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code table[]={ // 存放0~9的数码管编码
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00
};
uchar hour=0, minute=0, second=0; // 初始化时分秒为0
// 数码管位选函数
void Display(uchar num) {
LSA=table[num]&0x01; // 数码管的第0位
LSB=(table[num]>>1)&0x01; // 数码管的第1位
LSC=(table[num]>>2)&0x01; // 数码管的第2位
}
// 延时函数,约1ms
void Delay1ms(uint i) {
uint j;
while(i--) {
for(j=0; j<110; j++); // 空循环实现延时
}
}
// 增加秒数的函数
void AddSecond(void) {
second++; // 秒加1
if(second>=60) { // 如果秒数大于等于60,就归零并增加分数
second=0;
minute++;
if(minute>=60) { // 如果分数大于等于60,就归零并增加小时数
minute=0;
hour++;
if(hour>=24) { // 如果小时数大于等于24,就归零
hour=0;
}
}
}
}
// 减少秒数的函数
void SubSecond(void) {
second--; // 秒数减1
if(second<0) { // 如果秒数小于0,就归59并减少分数
second=59;
minute--;
if(minute<0) { // 如果分数小于0,就归59并减少小时数
minute=59;
hour--;
if(hour<0) { // 如果小时数小于0,就归23
hour=23;
}
}
}
}
// 主函数
void main() {
uchar i;
TMOD=0x01; // 定时器0工作在模式1
TH0=0xFC; // 定时器初值(1毫秒)
TL0=0x67;
TR0=1; // 启动定时器0
ET0=1; // 允许定时器0中断
EA=1; // 开启总中断
while(1) {
Display(hour/10); // 显示小时的十位数
Delay1ms(5); // 延时5ms
Display(hour%10); // 显示小时的个位数
Delay1ms(5);
Display(10); // 显示“:”
Delay1ms(5);
Display(minute/10); // 显示分钟的十位数
Delay1ms(5);
Display(minute%10); // 显示分钟的个位数
Delay1ms(5);
Display(10); // 显示“:”
Delay1ms(5);
Display(second/10); // 显示秒钟的十位数
Delay1ms(5);
Display(second%10); // 显示秒钟的个位数
Delay1ms(5);
if(P3==0x01) { // 按下按键1,增加1秒
AddSecond();
Delay1ms(20); // 延时20ms去抖动
} else if(P3==0x02) { // 按下按键2,减少1秒
SubSecond();
Delay1ms(20); // 延时20ms去抖动
}
}
}
// 定时器0中断服务函数,每1ms进入一次
void T0_time() interrupt 1 {
TH0=0xFC; // 定时器初值
TL0=0x67;
AddSecond(); // 增加1秒
}
```
在这个例子中,我们使用定时器0来定时,每1毫秒进入一次定时器中断,然后在中断服务函数中将秒数加1。同时,我们使用P3.0和P3.1作为按键,按下P3.0可以增加1秒,按下P3.1可以减少1秒。我们每隔5毫秒显示一次时分秒。在显示函数中,我们需要根据数码管连接的位选端口进行位选,以便将数字显示在正确的数码管上。