问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

AT89C51控制两位动态数码管实现倒计时的要点

创作时间:
作者:
@小白创作中心

AT89C51控制两位动态数码管实现倒计时的要点

引用
CSDN
1.
https://blog.csdn.net/yang2605731797/article/details/146303129

在使用AT89C51单片机控制两位动态数码管实现倒计时的过程中,可能会遇到显示残影和乱码的问题。本文将详细介绍如何通过优化显示控制逻辑来解决这些问题,并提供完整的代码示例。

硬件连接与原理图

本项目使用AT89C51单片机控制两位共阳极数码管实现倒计时显示。硬件连接如下:

  • 段选信号通过P0口输出
  • 十位数码管位选通过P2.0控制
  • 个位数码管位选通过P2.1控制

以下是Proteus仿真原理图:

软件实现

头文件与定义

#include <reg51.h>   // 包含AT89C51头文件

// 硬件连接定义
#define SEG_PORT P0    // 段选信号接P0口
sbit WEI1 = P2^0;      // 十位数码管位选
sbit WEI2 = P2^1;      // 个位数码管位选

// 共阳极数码管段码表(0-9)
unsigned char code SegTable[] = {
  0xC0, 0xF9, 0xA4, 0xB0, 0x99,  // 0-4
  0x92, 0x82, 0xF8, 0x80, 0x90   // 5-9
};

主要变量定义

unsigned char count = 20;     // 倒计时值
unsigned int timer_cnt = 0;   // 毫秒计数器
bit update_flag = 0;          // 1秒更新标志

定时器初始化

void Timer0_Init() {
  TMOD = 0x01;      // 定时器0工作方式1
  TH0 = 0xFC;       // 1ms定时初值(12MHz晶振)
  TL0 = 0x18;
  ET0 = 1;          // 允许定时器0中断
  EA = 1;           // 开总中断
  TR0 = 1;          // 启动定时器0
}

显示函数

void Display(unsigned char num) {
  static unsigned char pos = 0;
  
  // 先关闭所有位选(消隐)
  WEI1 = 0;
  WEI2 = 0;
  if(pos == 0) {          // 显示十位
    SEG_PORT = SegTable[num / 10];
    WEI1 = 1;             // 开启十位
    pos = 1;
  } else {                // 显示个位
    SEG_PORT = SegTable[num % 10];
    WEI2 = 1;             // 开启个位
    pos = 0;
  }
}

主函数

void main() {
  Timer0_Init();
  
  while(1) {
    if(update_flag) {     // 每秒更新
      update_flag = 0;
      if(count > 0) count--;
      else count = 20;    // 循环倒计时
    }
  }
}

定时器中断服务函数

void Timer0_ISR() interrupt 1 {
  TH0 = 0xFC;   // 重装初值(1ms)
  TL0 = 0x18;
  
  Display(count);       // 1ms刷新一次显示
  
  // 1秒计时逻辑
  if(++timer_cnt >= 1000) {
    timer_cnt = 0;
    update_flag = 1;
  }
}  

动态数码管显示原理

动态数码管显示是利用人眼视觉暂留效应(约24Hz以上),快速交替显示十位和个位。本设计中,定时器设为1ms,因此数码管的刷新频率为1000Hz,可以清晰显示数字。如果显示闪烁,可以考虑提高刷新率至>100Hz。

消影处理

出现数字残影的原因通常是未进行消影处理。正确的处理方法包括:

  • 增加位选关闭操作(WEI1 = 0; WEI2 = 0;
  • 先关闭位选→更新段码→再开启新位选
  • 消除切换时的残影现象

通过上述优化,可以有效避免显示残影和乱码问题,实现稳定清晰的数码管显示效果。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号