由于没有蓝桥杯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;
      }
    }
  }
}

说明:

  1. 数码管显示函数display()实现了将一个4位数字显示在数码管上的功能。函数接收两个参数,第一个参数为要显示的数字,第二个参数为要显示的数码管位置(0~3)。函数将要显示的数字按位存放在数组digit[]中,然后按位显示到数码管上。

  2. 定时器0中断处理函数Timer0()实现了时间的累加功能。每次定时器0中断时,秒加1,如果秒数达到60,则将秒数重置为0,分加1,如果分数达到60,则将分数重置为0,小时加1,如果小时数达到24,则将小时数重置为0。

  3. 获取按键值的函数getKey()实现了去抖功能。首先将P1口的高四位设为0,低四位设为1,然后判断是否有按键按下,如果有,则延时5ms去抖,再次判断是否有按键按下,如果有,则根据按键位置返回对应的值,最后恢复P1口状态。

  4. 在主函数main()中,先调用initTimer0()函数初始化定时器0。然后在循环中不断调用display()函数显示时间,并调用getKey()函数获取按键值。根据按键值进行相应的操作,如果是按键0,则秒数加1,如果是按键1,则分数加1,如果是按键2,则小时数加1,如果是按键3,则时间复位。为了防止按键一直按下不放,引入了按键标志secondFlagminuteFlaghourFlag,用于标记按键是否已经按下。如果按键已经按下,则不再进行加减操作,直到按键松开后再进行下一次操作

用蓝桥杯51的板子编写一个c语言电子时钟其中功能有:显示秒分时按键可以加减秒分时任意一个有个按键可以复位。用的软件是Keil5

原文地址: https://www.cveoy.top/t/topic/hjCC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录