2026/5/21 17:23:59
网站建设
项目流程
影视网站策划书,网站升级改造建设方案,什么叫做响应式网站,深圳网站设计制作元目录
4.0 数码管原理图
4.1 项目示例1#xff1a;静态数码管
✅项目功能#xff1a;
✅main.c主函数
4.2 项目示例2#xff1a;动态数码管
✅项目功能#xff1a;
✅main.c主函数
4.3 模块化--数码管
4.3.1 基础查询式 - 直接显示#xff08;单片机入门写法…目录4.0 数码管原理图4.1 项目示例1静态数码管✅项目功能✅main.c主函数4.2 项目示例2动态数码管✅项目功能✅main.c主函数4.3 模块化--数码管4.3.1 基础查询式 - 直接显示单片机入门写法✅NiXie.c✅NiXie.h4.3.2工业级中断式 - 缓存区扫描显示项目标准写法✅NiXie.c✅NiXie.h4.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(数码显示)参数1Location要显示的数码管位置(1-8)参数2Number要显示的数字(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_41;P2_31;P2_21;break; // 选中 第1位 数码管 case 2:P2_41;P2_31;P2_20;break; // 选中 第2位 数码管 case 3:P2_41;P2_30;P2_21;break; // 选中 第3位 数码管 case 4:P2_41;P2_30;P2_20;break; // 选中 第4位 数码管 case 5:P2_40;P2_31;P2_21;break; // 选中 第5位 数码管 case 6:P2_40;P2_31;P2_20;break; // 选中 第6位 数码管 case 7:P2_40;P2_30;P2_21;break; // 选中 第7位 数码管 case 8:P2_40;P2_30;P2_20;break; // 选中 第8位 数码管 } // 段选控制给P0口赋值对应数字的段码让选中的数码管显示指定数字 P0NiXieTable[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_41;P2_31;P2_21;break; case 2:P2_41;P2_31;P2_20;break; case 3:P2_41;P2_30;P2_21;break; case 4:P2_41;P2_30;P2_20;break; case 5:P2_40;P2_31;P2_21;break; case 6:P2_40;P2_31;P2_20;break; case 7:P2_40;P2_30;P2_21;break; case 8:P2_40;P2_30;P2_20;break; } P0NiXieTable[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值为对应段码 // 0x3F0011 1111(显示0)、0x060000 0110(显示1) ... 0x6F0110 1111(显示9) unsigned char NiXieTable[] {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; /** * brief 数码管直接显示函数 (NiXieNixie数码管拼写笔误不影响运行) * 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_41; P2_31; P2_21; break; // 选中第1位数码管 case 2: P2_41; P2_31; P2_20; break; // 选中第2位数码管 case 3: P2_41; P2_30; P2_21; break; // 选中第3位数码管 case 4: P2_41; P2_30; P2_20; break; // 选中第4位数码管 case 5: P2_40; P2_31; P2_21; break; // 选中第5位数码管 case 6: P2_40; P2_31; P2_20; break; // 选中第6位数码管 case 7: P2_40; P2_30; P2_21; break; // 选中第7位数码管 case 8: P2_40; P2_30; P2_20; 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); #endif4.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) { P00x00; // 段码清0【硬件消影】先关闭所有段码再选位置消影效果优于延时消影 switch(Location) // 位选控制选中指定位置的数码管与第一段位选逻辑完全一致 { case 1:P2_41;P2_31;P2_21;break; case 2:P2_41;P2_31;P2_20;break; case 3:P2_41;P2_30;P2_21;break; case 4:P2_41;P2_30;P2_20;break; case 5:P2_40;P2_31;P2_21;break; case 6:P2_40;P2_31;P2_20;break; case 7:P2_40;P2_30;P2_21;break; case 8:P2_40;P2_30;P2_20;break; } P0NixieTable[Number]; // 段选控制输出对应段码点亮选中的数码管 } /** * brief 数码管驱动核心函数【必须在定时器中断中调用】推荐2ms调用一次 * param 无 * retval 无 * note 实现8位数码管的循环扫描利用人眼视觉暂留实现全屏稳定显示工业级标准写法 */ void Nixie_Loop(void) { static unsigned char i1; // static静态变量值永久保留循环计数1~8 Nixie_Scan(i,Nixie_Buf[i]); // 扫描第i位数码管显示缓存区中对应位置的内容 i; // 计数自增准备扫描下一位 if(i9){i1;} // 计数到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