用C语言以AT89C51为芯片写一个6位数码管显示时、分、秒,能够使用按键增减时间,把调用函数写进程序里
时间: 2024-03-08 09:46:35 浏览: 60
基于C语言AT89C51单片机数字时钟
好的,下面是一个基于AT89C51的6位数码管显示时分秒,并且能够使用按键增减时间的示例代码。我将调用函数写进了程序中。
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00 // 0~9的数码管编码
};
uchar hour=0, minute=0, second=0;
// 数码管位选函数
void Display(uchar num) {
LSA=table[num]&0x01;
LSB=(table[num]>>1)&0x01;
LSC=(table[num]>>2)&0x01;
}
// 延时函数,约1ms
void Delay1ms(uint i) {
uint j;
while(i--) {
for(j=0; j<110; j++);
}
}
// 增加秒数的函数
void AddSecond(void) {
second++;
if(second>=60) {
second=0;
minute++;
if(minute>=60) {
minute=0;
hour++;
if(hour>=24) {
hour=0;
}
}
}
}
// 减少秒数的函数
void SubSecond(void) {
second--;
if(second<0) {
second=59;
minute--;
if(minute<0) {
minute=59;
hour--;
if(hour<0) {
hour=23;
}
}
}
}
// 主函数
void main() {
uchar i;
TMOD=0x01; // 定时器0工作在模式1
TH0=0xFC; // 定时器初值(1毫秒)
TL0=0x67;
TR0=1; // 启动定时器
ET0=1; // 允许定时器0中断
EA=1; // 开启总中断
while(1) {
Display(hour/10);
Delay1ms(5);
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毫秒显示一次时分秒。在显示函数中,我们需要根据数码管连接的位选端口进行位选,以便将数字显示在正确的数码管上。
阅读全文