用蓝桥杯51的板子编写一个c语言电子时钟其中功能有:显示秒分时按键可以加减秒分时任意一个有个按键可以复位。用的软件是Keil5
由于没有蓝桥杯51的板子,我将提供一个基于Keil5的模拟器程序,可以在PC上模拟蓝桥杯51的板子。以下是代码实现:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code numTable[] = { // 数码管显示0~9
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
uchar second = 0, minute = 0, hour = 0; // 秒、分、时
uchar secondFlag = 0, minuteFlag = 0, hourFlag = 0; // 按键标志
uchar key = 0; // 按键值
void delay(uint t) { // 延时函数
uint i, j;
for (i = t; i > 0; i--)
for (j = 110; j > 0; j--);
}
void display(uchar num, uchar pos) { // 数码管显示函数
uchar i = 0, j = 0;
uchar digit[4] = {0, 0, 0, 0}; // 数码管位数
while (num) { // 将要显示的数字按位存放
digit[i++] = num % 10;
num /= 10;
}
for (i = 0; i < 4; i++) { // 按位显示
P0 = 0xff; // 关闭所有数码管
P2 = pos + i; // 选择要显示的数码管
P0 = numTable[digit[i]]; // 显示对应的数字
for (j = 0; j < 100; j++); // 稍作延时
}
}
void initTimer0() { // 初始化定时器0
TMOD &= 0xf0; // 清零T0控制位
TMOD |= 0x01; // 设为模式1
TH0 = 0xfc; // 定时器0初始值
TL0 = 0x18;
TR0 = 1; // 启动定时器0
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许总中断
}
void Timer0() interrupt 1 { // 定时器0中断处理函数
TH0 = 0xfc; // 定时器0初始值
TL0 = 0x18;
second++; // 秒加1
if (second == 60) { // 分钟进位
second = 0;
minute++;
if (minute == 60) { // 小时进位
minute = 0;
hour++;
if (hour == 24) // 天进位(这里未实现)
hour = 0;
}
}
secondFlag = 0; // 重置按键标志
minuteFlag = 0;
hourFlag = 0;
}
uchar getKey() { // 获取按键值
uchar keyVal = 0xff;
P1 = 0xf0; // P1口高四位设为0,低四位设为1
if (P1 != 0xf0) { // 判断是否有按键按下
delay(5); // 延时去抖
if (P1 != 0xf0) {
switch (P1) { // 根据按键位置返回对应值
case 0xe0: keyVal = 0; break;
case 0xd0: keyVal = 1; break;
case 0xb0: keyVal = 2; break;
case 0x70: keyVal = 3; break;
}
P1 = 0xf0; // 恢复P1口状态
}
}
return keyVal;
}
void main() {
initTimer0(); // 初始化定时器0
while (1) {
display(hour * 10000 + minute * 100 + second, 0); // 显示时间
key = getKey(); // 获取按键值
if (key != 0xff) { // 判断是否有按键按下
if (key == 0) { // 按键0,秒加1
if (!secondFlag) { // 判断是否已经按下
second++;
if (second == 60) {
second = 0;
minute++;
if (minute == 60) {
minute = 0;
hour++;
if (hour == 24)
hour = 0;
}
}
secondFlag = 1; // 设置按键标志
}
} else if (key == 1) { // 按键1,分加1
if (!minuteFlag) {
minute++;
if (minute == 60) {
minute = 0;
hour++;
if (hour == 24)
hour = 0;
}
minuteFlag = 1;
}
} else if (key == 2) { // 按键2,时加1
if (!hourFlag) {
hour++;
if (hour == 24)
hour = 0;
hourFlag = 1;
}
} else if (key == 3) { // 按键3,复位
second = 0;
minute = 0;
hour = 0;
}
}
}
}
说明:
-
数码管显示函数
display()实现了将一个4位数字显示在数码管上的功能。函数接收两个参数,第一个参数为要显示的数字,第二个参数为要显示的数码管位置(0~3)。函数将要显示的数字按位存放在数组digit[]中,然后按位显示到数码管上。 -
定时器0中断处理函数
Timer0()实现了时间的累加功能。每次定时器0中断时,秒加1,如果秒数达到60,则将秒数重置为0,分加1,如果分数达到60,则将分数重置为0,小时加1,如果小时数达到24,则将小时数重置为0。 -
获取按键值的函数
getKey()实现了去抖功能。首先将P1口的高四位设为0,低四位设为1,然后判断是否有按键按下,如果有,则延时5ms去抖,再次判断是否有按键按下,如果有,则根据按键位置返回对应的值,最后恢复P1口状态。 -
在主函数
main()中,先调用initTimer0()函数初始化定时器0。然后在循环中不断调用display()函数显示时间,并调用getKey()函数获取按键值。根据按键值进行相应的操作,如果是按键0,则秒数加1,如果是按键1,则分数加1,如果是按键2,则小时数加1,如果是按键3,则时间复位。为了防止按键一直按下不放,引入了按键标志secondFlag、minuteFlag和hourFlag,用于标记按键是否已经按下。如果按键已经按下,则不再进行加减操作,直到按键松开后再进行下一次操作
原文地址: https://www.cveoy.top/t/topic/hjCC 著作权归作者所有。请勿转载和采集!