单片机:实现花样灯数码管的显示(附带源码)
单片机实现花样灯数码管显示
数码管(七段数码管)广泛用于数字显示,例如时钟、计数器、温度计等设备。在本项目中,我们将使用单片机实现花样灯数码管的显示效果。所谓花样灯显示是指通过控制数码管上的各个段位,以不同的显示模式展现多种效果,如跑马灯、闪烁效果、旋转效果等。
项目目标
- 控制多个数码管的显示,通过不同的显示方式形成花样灯效果。
- 使用单片机控制数码管的动态显示,保证显示效果流畅。
- 通过定时器中断控制不同的显示模式,如跑马灯、闪烁、旋转等。
- 使用按键切换不同的花样灯显示模式。
一、硬件设计
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允许远程连接 …...

零衍门户国际化:助力拓展全球视野
概述 零衍系统管理平台统一门户管理,支持门户看板灵活配置,同时提供场景化的门户模板,丰富的门户组件,可协助用户快速搭建企业专属门户。 随着零衍产品的不断成熟,国际化需求日益增多,客户期望零衍门户可…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...