单片机:实现花样灯数码管的显示(附带源码)
单片机实现花样灯数码管显示
数码管(七段数码管)广泛用于数字显示,例如时钟、计数器、温度计等设备。在本项目中,我们将使用单片机实现花样灯数码管的显示效果。所谓花样灯显示是指通过控制数码管上的各个段位,以不同的显示模式展现多种效果,如跑马灯、闪烁效果、旋转效果等。
项目目标
- 控制多个数码管的显示,通过不同的显示方式形成花样灯效果。
- 使用单片机控制数码管的动态显示,保证显示效果流畅。
- 通过定时器中断控制不同的显示模式,如跑马灯、闪烁、旋转等。
- 使用按键切换不同的花样灯显示模式。
一、硬件设计
1.1 单片机选择
本项目使用8051单片机。8051单片机具有丰富的I/O端口,足以控制多个数码管。使用定时器中断可以实现动态显示,并通过按键控制花样灯模式的切换。
1.2 外部硬件
- 数码管:每个数码管包含7个段(a-g)和一个公共端。通过点亮不同的段组合,可以显示数字或字母。
- 按键:用来切换不同的显示模式,如跑马灯、旋转、闪烁等。
- 电源和电阻:提供供电并保护硬件。
1.3 硬件连接
- 数码管控制:使用8051的I/O端口(如P1端口)连接到数码管的段引脚(a-g),通过共阴或共阳连接控制数码管的显示。
- 按键输入:使用P3端口连接按键,检测按键输入以切换显示模式。
二、系统设计
2.1 功能模块
- 数码管显示模块:通过扫描数码管的每一位,动态更新数码管的显示内容。
- 花样灯显示模式:包括多个显示模式,如跑马灯、闪烁、旋转等。可以通过定时器中断和按键控制切换。
- 按键扫描模块:用于检测按键输入,切换不同的显示效果。
2.2 数据结构
- 段码映射表:用于将数字和字母映射到对应的数码管段位的编码。例如,数字
0对应0x3F(即1111110,点亮除g段外的所有段)。 - 显示模式缓存:存储当前显示的数字或字符,用于控制显示内容的切换和更新。
- 花样灯模式:包括跑马灯、闪烁、旋转等效果,每种效果通过不同的显示模式函数实现。
2.3 工作原理
- 数码管扫描显示:使用动态扫描方式,通过定时器中断逐位更新数码管的显示内容。每次点亮一个数码管并显示内容,轮流切换,产生动态显示效果。
- 花样灯效果:通过改变段位显示模式,生成不同的效果。例如,跑马灯通过按顺序点亮数码管的不同段,旋转效果通过逐步显示字符的不同位置实现。
- 按键输入:通过按键切换显示模式,实现不同的花样灯效果。
三、程序设计
3.1 定时器中断
定时器用于控制数码管的动态扫描和更新显示内容。定时器中断触发时更新数码管的显示内容,保证显示效果的流畅性。
3.2 主程序框架
- 初始化定时器:通过定时器中断控制显示更新频率。
- 按键扫描:检测按键输入,切换不同的显示效果。
- 花样灯显示:通过不同的显示模式函数实现跑马灯、闪烁、旋转等效果。
3.3 代码实现
#include <reg51.h> // 包含8051的寄存器定义// 数码管段码映射(7段数码管,段顺序为:a,b,c,d,e,f,g)
unsigned char segment_code[] = {0x3F, // 00x06, // 10x5B, // 20x4F, // 30x66, // 40x6D, // 50x7D, // 60x07, // 70x7F, // 80x6F, // 9
};// 数码管显示的位
#define SEG1 P0_0
#define SEG2 P0_1
#define SEG3 P0_2
#define SEG4 P0_3// 定义按键端口
#define BUTTON_MODE P3_0 // 切换花样灯模式的按键// 显示模式选择
#define MODE_RUNNING_LIGHT 1 // 跑马灯模式
#define MODE_BLINK 2 // 闪烁模式
#define MODE_ROTATING 3 // 旋转模式unsigned char display_mode = MODE_RUNNING_LIGHT; // 当前显示模式
unsigned char current_digit = 0; // 当前显示的数字
unsigned char segment_index = 0; // 当前显示的数码管位置// 定时器初始化函数
void timer0_init() {TMOD = 0x01; // 设置定时器0为模式1(16位定时器)IE = 0x82; // 启用定时器中断TR0 = 1; // 启动定时器0
}// 延时函数
void delay_ms(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++) {for (j = 0; j < 120; j++) {// 空循环,产生延时}}
}// 按键扫描函数
unsigned char key_scan() {if (BUTTON_MODE == 0) { // 如果按下模式切换键delay_ms(20); // 去抖动return 1; // 切换模式}return 0;
}// 数码管显示函数
void display_digit(unsigned char digit) {// 根据segment_code映射表显示当前的数字unsigned char seg_code = segment_code[digit];switch (segment_index) {case 0:SEG1 = seg_code;break;case 1:SEG2 = seg_code;break;case 2:SEG3 = seg_code;break;case 3:SEG4 = seg_code;break;}
}// 跑马灯效果
void running_light() {display_digit(current_digit); // 显示当前数字current_digit++;if (current_digit >= 10) {current_digit = 0; // 重置数字}
}// 闪烁效果
void blink() {static unsigned char blink_state = 0;if (blink_state == 0) {display_digit(current_digit); // 显示数字} else {// 不显示任何内容display_digit(0);}blink_state = !blink_state; // 切换闪烁状态
}// 旋转效果
void rotating() {static unsigned char rotate_pos = 0;display_digit(rotate_pos); // 显示当前位置的数字rotate_pos++;if (rotate_pos >= 10) {rotate_pos = 0; // 重置旋转位置}
}// 定时器中断函数
void timer0_isr() interrupt 1 {switch (display_mode) {case MODE_RUNNING_LIGHT:running_light(); // 执行跑马灯效果break;case MODE_BLINK:blink(); // 执行闪烁效果break;case MODE_ROTATING:rotating(); // 执行旋转效果break;}TH0 = 0xFF; // 重载定时器初值TL0 = 0xFF; // 重载定时器初值
}void main() {timer0_init(); // 初始化定时器while (1) {unsigned char key = key_scan();// 如果按下模式切换键,切换显示模式if (key == 1) {if (display_mode == MODE_RUNNING_LIGHT) {display_mode = MODE_BLINK; // 切换到闪烁模式} else if (display_mode == MODE_BLINK) {display_mode = MODE_ROTATING; // 切换到旋转模式} else {display_mode = MODE_RUNNING_LIGHT; // 切换回跑马灯模式}}}
}
四、程序说明
- 数码管显示:
segment_code数组存储了数字0-9对应的数码管段编码,通过display_digit()函数控制哪个数码管显示哪个数字。 - 定时器中断:使用定时器中断实现数码管的动态扫描和效果更新,确保显示效果流畅。
- 花样灯效果:包括跑马灯、闪烁和旋转效果,分别在
running_light()、blink()和rotating()函数中实现。 - 按键输入:
key_scan()函数扫描按键,按下按键时切换显示模式。
五、总结
通过本项目,您可以使用8051单片机控制数码管实现不同的花样灯显示效果,包括跑马灯、闪烁和旋转等。该系统不仅展示了数码管显示控制的基本方法,还利用定时器中断实现了动态显示效果,同时支持按键切换显示模式,增强了用户交互体验
相关文章:
单片机:实现花样灯数码管的显示(附带源码)
单片机实现花样灯数码管显示 数码管(七段数码管)广泛用于数字显示,例如时钟、计数器、温度计等设备。在本项目中,我们将使用单片机实现花样灯数码管的显示效果。所谓花样灯显示是指通过控制数码管上的各个段位,以不同…...
什么是芯片电阻
有人把Chip Resistor翻译成“芯片电阻”,我觉得翻译成“贴片电阻”或“片状电阻”更合适。有些厂商也称之为”电阻片”,英文写作Resistor Chip。比如:Thick film resistor chips(厚膜电阻片)、Thin film resistor chip…...
【C++】sophus : geometry.hpp 位姿(SE2 和 SE3)和(2D 直线\3D 平面)转换函数 (五)
这段代码定义了一系列在位姿(SE2 和 SE3)和几何实体(2D 直线和 3D 平面)之间进行转换的函数。它利用了 Sophus 库中已有的旋转表示(SO2 和 SO3)。 以下是函数的详细解释: 1. SO2 与直线…...
moment()获取时间
moment 是一个 JavaScript 日期处理类库。 使用: //安装 moment npm install moment -- save引用 //在main.js中全局引入 import moment from "moment"设定moment区域为中国 //import 方式 import moment/locale/zh-cn moment.locale(zh-cn); 挂载全…...
Azure虚拟机非托管磁盘大小调整
想要扩容一个Azure VM 的磁盘空间,门户里面竟然无法扩展,点点鼠标就完事的时代在离去,微软越来不想微软。 在门户里面即便使用Azure Cli命令行也不行。 PS /home/gpchina> az disk list [] 返回为空,根本没有返回磁盘。 不过使…...
流匹配模型[Flow Matching]
流匹配模型:概念、优缺点与扩散模型的对比 在生成建模领域,流匹配模型(Flow Matching)是一种通过学习流场将初始分布(通常是高斯噪声)变换为目标分布的新型框架。本文将对流匹配模型的概念、与扩散模型的联…...
Unix 和 Windows 的有趣比较
Unix 和 Windows NT 比较 来源于这两本书,把两本书对照来读,发现很多有意思的地方: 《Unix 传奇》 https://book.douban.com/subject/35292726/ 《观止 微软创建NT和未来的夺命狂奔 》 Showstopper!: The Breakneck Race to Create Windows…...
算法(三)——贪心算法
文章目录 定义基本原理基本思路优缺点优点缺点 经典案例及解析找零问题问题描述贪心思路算法解析java代码示例 活动选择问题问题描述贪心思路算法解析java代码示例 车辆路径问题问题描述贪心思路算法分析java代码示例 定义 贪心算法是指在求解问题时,总是做出在当前…...
LeetCode 704.二分查找
LeetCode 704.二分查找 思路🧐: 在本篇以及之后几篇的博客中,博主将会用二分法进行解答,以此巩固二分题型。二分法一般用于具有二段性的数据中使用。比如该题为有序数组,需要我们查找一个目标值target,分析…...
Linux介绍与安装CentOS 7操作系统
什么是操作系统 操作系统,英⽂名称 Operating System,简称 OS,是计算机系统中必不 可少的基础系统软件,它是 应⽤程序运⾏以及⽤户操作必备的基础环境 ⽀撑,是计算机系统的核⼼。 操作系统的作⽤是管理和控制计算机系…...
使用 rbenv 切换 Ruby 版本
1. 查看当前 Ruby 版本 首先,查看当前系统中安装的 Ruby 版本: ruby -v如果你已经安装了 rbenv,可以列出通过 rbenv 安装的 Ruby 版本: rbenv versions2. 安装 Ruby 版本 如果你想安装新的 Ruby 版本,使用以下命令…...
C语言(结构体练习)
设计一个结构体,存放一个学员信息并显示,存放两个学员信息,算他们的平均分。 #include <stdio.h> #include <string.h>// 定义结构体 typedef struct {char name[50];float score; } Student;// 函数声明 void display(Student student); f…...
你了解网络层的 ICMP 吗?
你了解网络层的 ICMP 吗? 一. 什么是 ICMP二. ICMP 的工作原理三. ICMP 的结构四. ICMP 的常见应用五. ICMP 的局限性与安全性六. 总结 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神…...
清理C盘小记
突然C盘就爆满了,想当初还是给他预留了120G的空间,感觉到现在也不够用了,担心出现死机的情况就赶紧进行了清理。有一说一,清理回收站是真的有用。 参考:C盘清理指南,清理出30G起,超详细总结&am…...
Excel中如何消除“长短款”
函数微调可以可以实施,简单且易于操作的气球🎈涨缩更妙。 (笔记模板由python脚本于2024年12月17日 06:19:13创建,本篇笔记适合用Excel操作数据的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Fre…...
超越 RAG 基础:AI 应用的高级策略
作者:来自 Elastic Elastic Platform Team 我们最近与 Cohere 举办的虚拟活动深入探讨了检索增强生成 (retrieval augmented generation - RAG) 的世界,重点讨论了在概念验证阶段之后构建 RAG 应用程序的关键注意事项。我们的演讲者是 Elastic 的首席解…...
[shader]【图形渲染】【unity】【游戏开发】 Shader数学基础2-认识点和矢量
在计算机图形学和Shader编程中,点和矢量是两种常见且基础的数学对象。它们在空间中的作用和性质是理解图形渲染的关键。本篇文章将深入探讨点(Point)和矢量(Vector)的定义、特性以及它们之间的关系。 1. 点(Point)的定义 在数学和计算机图形学中,**点(Point)**用于…...
微软开源Python Markdown转换工具
分享一个microsoft开源的Python工具——markitdown,轻松将各类文件转换为Markdown格式。 markitdown支持的文件格式 PDF(.pdf)PowerPoint(.pptx)Word(.docx)Excel(.xlsx)图片(支持EXIF元数据和OCR识别)音频(支持EXIF元数据和语音转录)HTML(包括对Wikipedia...
安装与配置MongoDB 6.0以支持远程连接
安装与配置MongoDB 6.0以支持远程连接 目录 安装curl工具下载并导入MongoDB 6.0 PGP密钥向APT导入MongoDB 6.0版软件包的资源链接安装MongoDB依赖libssl1.1安装MongoDB启动并检查MongoDB服务状态进入MongoDB Shell交互式执行环境设置MongoDB开机自启配置MongoDB允许远程连接 …...
零衍门户国际化:助力拓展全球视野
概述 零衍系统管理平台统一门户管理,支持门户看板灵活配置,同时提供场景化的门户模板,丰富的门户组件,可协助用户快速搭建企业专属门户。 随着零衍产品的不断成熟,国际化需求日益增多,客户期望零衍门户可…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
