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

零衍门户国际化:助力拓展全球视野
概述 零衍系统管理平台统一门户管理,支持门户看板灵活配置,同时提供场景化的门户模板,丰富的门户组件,可协助用户快速搭建企业专属门户。 随着零衍产品的不断成熟,国际化需求日益增多,客户期望零衍门户可…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

保姆级教程:在无网络无显卡的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…...