当前位置: 首页 > news >正文

51单片机学习笔记4-数码管

目录

4.0 数码管原理图

4.1 项目示例1:静态数码管

✅项目功能:

✅main.c主函数

4.2 项目示例2:动态数码管

✅项目功能:

✅main.c主函数

4.3 模块化--数码管

4.3.1 基础查询式 - 直接显示(单片机入门写法)

✅NiXie.c

✅NiXie.h

4.3.2工业级中断式 - 缓存区扫描显示(项目标准写法)

✅NiXie.c

✅NiXie.h


4.0 数码管原理图

4.1 项目示例1:静态数码管

✅项目功能:

程序上电后,仅点亮第 7 位数码管,固定显示数字6,其余 1-6、8 位数码管全部熄灭

main.c主函数

#include <REGX52.H> // 引入51单片机寄存器定义头文件,定义P0/P2等所有I/O口地址 // 共阴极数码管段码表,数组名NiXieTable(拼音:数码显示表),存放0~9对应的段码值 // 数组元素: 下标0=数字0 下标1=数字1 ... 下标9=数字9,这是51单片机标准共阴极段码表 unsigned char NiXieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; // 数码管显示函数 函数名:NiXie(数码显示),参数1:Location=要显示的数码管位置(1-8),参数2:Number=要显示的数字(0-9) void NiXie(unsigned char Location,unsigned char Number) { // 位选控制:通过P2_4、P2_3、P2_2三个引脚的高低电平组合,选择第几位数码管点亮 // 原理:3个I/O口有 000~111 共8种电平组合,刚好对应8位数码管的1~8号位,这是51单片机通用位选方式 switch(Location) { case 1:P2_4=1;P2_3=1;P2_2=1;break; // 选中 第1位 数码管 case 2:P2_4=1;P2_3=1;P2_2=0;break; // 选中 第2位 数码管 case 3:P2_4=1;P2_3=0;P2_2=1;break; // 选中 第3位 数码管 case 4:P2_4=1;P2_3=0;P2_2=0;break; // 选中 第4位 数码管 case 5:P2_4=0;P2_3=1;P2_2=1;break; // 选中 第5位 数码管 case 6:P2_4=0;P2_3=1;P2_2=0;break; // 选中 第6位 数码管 case 7:P2_4=0;P2_3=0;P2_2=1;break; // 选中 第7位 数码管 case 8:P2_4=0;P2_3=0;P2_2=0;break; // 选中 第8位 数码管 } // 段选控制:给P0口赋值对应数字的段码,让选中的数码管显示指定数字 P0=NiXieTable[Number]; } // 主函数 程序入口 void main() { NiXie(7,6); // 调用数码管显示函数 → 让【第7位】数码管 显示 数字【6】 while(1) // 死循环,程序卡在这行,保持数码管固定显示状态,永不变化 { } }

4.2 项目示例2:动态数码管

  • 数码管扫描(输出扫描)
原理:显示第1位→显示第2位→显示第3位→......,然后快速循环这个过程,最终实现所有数码管同时显示的效果

✅项目功能:

程序上电后,数码管123位循环显示数字 123

✅main.c主函数

#include <REGX52.H> // 引入51单片机寄存器定义头文件,定义P0/P2口等硬件地址 // 共阴极数码管段码表 0~9,下标对应数字,段码对应点亮该数字的电平值,标准值无错误 unsigned char NiXieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; // 毫秒级延时函数 @12MHz晶振,形参xms=延时毫秒数,标准精准延时写法 void Delay(unsigned int xms) { unsigned char i, j; while(xms) { i = 2; j = 239; do { while (--j); } while (--i); xms--; } } // 数码管显示函数:Location=数码管位置(1-8),Number=要显示的数字(0-9) void NiXie(unsigned char Location,unsigned char Number) { switch(Location) // 位选:通过P2_4/P2_3/P2_2的电平组合,选中指定位置的数码管 { case 1:P2_4=1;P2_3=1;P2_2=1;break; case 2:P2_4=1;P2_3=1;P2_2=0;break; case 3:P2_4=1;P2_3=0;P2_2=1;break; case 4:P2_4=1;P2_3=0;P2_2=0;break; case 5:P2_4=0;P2_3=1;P2_2=1;break; case 6:P2_4=0;P2_3=1;P2_2=0;break; case 7:P2_4=0;P2_3=0;P2_2=1;break; case 8:P2_4=0;P2_3=0;P2_2=0;break; } P0=NiXieTable[Number]; // 段选:给P0口赋值段码,让选中的数码管显示对应数字 Delay(1); // 数码管消影核心步骤1:延时1ms,保证显示稳定 P0= 0x00; // 数码管消影核心步骤2:段码清零,清空P0口电平,彻底消除残影 } // 主函数 程序入口 void main() { while(1) // 死循环:无限循环扫描数码管,实现动态显示 { NiXie(1,1); // 第1位数码管 显示 数字1 NiXie(2,2); // 第2位数码管 显示 数字2 NiXie(3,3); // 第3位数码管 显示 数字3 } }

4.3 模块化--数码管

4.3.1 基础查询式 - 直接显示(单片机入门写法)

NiXie.c

#include <REGX52.H> // 51单片机寄存器定义头文件,必须包含 #include "Delay.h" // 包含延时函数头文件,本代码依赖延时实现消影和显示 // 共阴极数码管段码表 // 数组下标 0~9 对应显示数字 0~9,值为对应段码 // 0x3F=0011 1111(显示0)、0x06=0000 0110(显示1) ... 0x6F=0110 1111(显示9) unsigned char NiXieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; /** * @brief 数码管直接显示函数 (NiXie=Nixie,数码管拼写笔误,不影响运行) * @param Location 要显示的数码管位置,范围:1~8(对应第1位到第8位数码管) * @param Number 要显示的数字,范围:0~9(对应段码表的数组下标) * @retval 无 * @note 基础款直接显示,调用一次仅点亮指定位置的指定数字,需循环调用实现多位显示 */ void NiXie(unsigned char Location, unsigned char Number) { // 位选控制:通过P2_4、P2_3、P2_2三个引脚的高低电平组合,选中第1~8位数码管 // 三位引脚电平组合共8种状态,刚好对应8位数码管,是51单片机8位数码管标准位选方式 switch(Location) { case 1: P2_4=1; P2_3=1; P2_2=1; break; // 选中第1位数码管 case 2: P2_4=1; P2_3=1; P2_2=0; break; // 选中第2位数码管 case 3: P2_4=1; P2_3=0; P2_2=1; break; // 选中第3位数码管 case 4: P2_4=1; P2_3=0; P2_2=0; break; // 选中第4位数码管 case 5: P2_4=0; P2_3=1; P2_2=1; break; // 选中第5位数码管 case 6: P2_4=0; P2_3=1; P2_2=0; break; // 选中第6位数码管 case 7: P2_4=0; P2_3=0; P2_2=1; break; // 选中第7位数码管 case 8: P2_4=0; P2_3=0; P2_2=0; break; // 选中第8位数码管 } P0 = NiXieTable[Number]; // 段选控制:P0口输出对应数字的段码,点亮当前选中的数码管 Delay(1); // 延时1ms,维持当前数码管点亮状态,保证肉眼能看清 P0 = 0x00; // 段码清0,关闭当前数码管,【核心作用:消影】,避免残影 }

✅NiXie.h

#ifndef _NIXIE_H_ #define _NIXIE_H_ void NiXie(unsigned char Location,unsigned char Number); #endif

4.3.2工业级中断式 - 缓存区扫描显示(项目标准写法)

✅NiXie.c

#include <REGX52.H> // 51单片机寄存器定义头文件,必须包含 #include "Delay.h" // 包含延时头文件(本文件未用到,预留兼容) // 数码管显示缓存区,数组下标 1~8 对应第1~8位数码管,下标0弃用 // 初始值:0(显示0),10(熄灭),数组值 = 段码表的索引;核心作用:存储要显示的内容,不直接控制硬件 unsigned char Nixie_Buf[9]={0,10,10,10,10,10,10,10,10}; // 共阴极数码管段码表,功能增强版 // 下标0~9 → 显示数字0~9;下标10 → 0x00(熄灭数码管);下标11 → 0x40(显示减号-) unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40}; /** * @brief 设置数码管显示缓存区 * @param Location 要设置的数码管位置,范围:1~8 * @param Number 要显示的内容,范围:0~11(对应段码表的数组下标) * @retval 无 * @note 仅修改缓存区数值,不直接点亮数码管,【无任何硬件操作、无阻塞】,核心优势函数 */ void Nixie_SetBuf(unsigned char Location,Number) { Nixie_Buf[Location]=Number; // 将需要显示的内容写入缓存区对应位置 } /** * @brief 数码管底层扫描显示函数 * @param Location 要显示的数码管位置,范围:1~8 * @param Number 要显示的内容,范围:0~11(对应段码表的数组下标) * @retval 无 * @note 纯硬件驱动函数,仅点亮指定位置的指定内容,执行速度极快,带硬件消影 */ void Nixie_Scan(unsigned char Location,Number) { P0=0x00; // 段码清0,【硬件消影】,先关闭所有段码再选位置,消影效果优于延时消影 switch(Location) // 位选控制:选中指定位置的数码管,与第一段位选逻辑完全一致 { case 1:P2_4=1;P2_3=1;P2_2=1;break; case 2:P2_4=1;P2_3=1;P2_2=0;break; case 3:P2_4=1;P2_3=0;P2_2=1;break; case 4:P2_4=1;P2_3=0;P2_2=0;break; case 5:P2_4=0;P2_3=1;P2_2=1;break; case 6:P2_4=0;P2_3=1;P2_2=0;break; case 7:P2_4=0;P2_3=0;P2_2=1;break; case 8:P2_4=0;P2_3=0;P2_2=0;break; } P0=NixieTable[Number]; // 段选控制:输出对应段码,点亮选中的数码管 } /** * @brief 数码管驱动核心函数,【必须在定时器中断中调用】,推荐2ms调用一次 * @param 无 * @retval 无 * @note 实现8位数码管的循环扫描,利用人眼视觉暂留实现全屏稳定显示,工业级标准写法 */ void Nixie_Loop(void) { static unsigned char i=1; // static静态变量,值永久保留,循环计数1~8 Nixie_Scan(i,Nixie_Buf[i]); // 扫描第i位数码管,显示缓存区中对应位置的内容 i++; // 计数自增,准备扫描下一位 if(i>=9){i=1;} // 计数到9则重置为1,实现1~8位循环扫描 }

✅NiXie.h

#ifndef __NIXIE_H__ #define __NIXIE_H__ void Nixie_SetBuf(unsigned char Location,Number); void Nixie_Scan(unsigned char Location,Number); void Nixie_Loop(void); #endif
示例见13.6项目示例2
http://www.jsqmd.com/news/290074/

相关文章:

  • 51单片机学习笔记5-模块化编程
  • 2026企业微信服务商新观察:腾讯四轮投资的微盛如何用AI助力私域增长
  • 51单片机学习笔记1-基础知识碎碎念
  • 2026企业私域增长关键:如何用企业微信SCRM微盛·企微管家提升客户转化率
  • 2026年 广告招牌厂家推荐排行榜:3D打印发光字/铝合金型材/实心字/轨道发光字,创新工艺与展厅视觉解决方案深度解析
  • 51单片机学习笔记2-LED
  • 2026-01-23
  • 详细介绍:Elasticsearch:过多的副本数量会如何降低性能,以及该如何解决它
  • 详细介绍:鸿蒙Next图片开发指南:从解码、处理到接收的完整实践
  • 2026年彩钢瓦设备厂家推荐榜单:琉璃瓦/墙面板/角驰瓦/不锈钢波浪板/数控高速/双层一机多用/冷弯耐用工业级高精度全自动及CZ型钢U型钢设备精选
  • TB311FU原厂刷机包免费下载_CN_ZUI_17
  • 2026年 桌椅租赁服务商推荐排行榜:活动/会议/展会/户外/宴会/演出/定制/婚礼/庆典/年会/办公桌椅租赁,专业高效与场景适配度深度解析
  • 针对语音识别场景,企业算力平台建设的5个关键要点
  • 知行合一的价值革命:《AI元人文:悟空而行》的范式突破与智能时代治理重构(扩展版)
  • AI芯片设计中的硬件加速反馈循环方案
  • 一天一个Python库:idna - 处理国际化域名的神器
  • 2026年 光亮剂厂家推荐排行榜:促裕抛光/电镀光亮剂,镍铜锡金银全系列高效抛光解决方案深度解析
  • TB350FU原厂刷机包免费下载_CN_ZUI_17
  • 基于大数据的农产品价格预测数据分析与可视化系统
  • 深度测评8个AI论文平台,专科生毕业论文轻松搞定!
  • 二叉树层序遍历(BFS)完全指南:从基础到实战
  • 基于大数据的出行路线规划与推荐系统 数据分析可视化大屏系统
  • 基于大数据的大学生就业信息推荐系统的 爬虫数据可视化大屏分析系统
  • 基于大数据的旅游景点推荐系统的设计与实现
  • 基于大数据的高校毕业生招聘信息推荐系统 爬虫 数据分析可视化大屏系统mpohdj33
  • flask python旅游景点印象服务系统
  • Python基于大数据的图书推荐系统的协同过滤算法的爬虫 数据可视化分析系统9w4u33nr
  • 基于大数据大数据分析的化妆品销售系统 美妆商城系统 爬虫可视化分析系统
  • 二叉树--求最小深度(迭代和递归)
  • 流批一体架构实践:如何用Flink统一数据处理流程