单片机:实现花样灯数码管的显示(附带源码)
单片机实现花样灯数码管显示
数码管(七段数码管)广泛用于数字显示,例如时钟、计数器、温度计等设备。在本项目中,我们将使用单片机实现花样灯数码管的显示效果。所谓花样灯显示是指通过控制数码管上的各个段位,以不同的显示模式展现多种效果,如跑马灯、闪烁效果、旋转效果等。
项目目标
- 控制多个数码管的显示,通过不同的显示方式形成花样灯效果。
- 使用单片机控制数码管的动态显示,保证显示效果流畅。
- 通过定时器中断控制不同的显示模式,如跑马灯、闪烁、旋转等。
- 使用按键切换不同的花样灯显示模式。
一、硬件设计
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允许远程连接 …...
零衍门户国际化:助力拓展全球视野
概述 零衍系统管理平台统一门户管理,支持门户看板灵活配置,同时提供场景化的门户模板,丰富的门户组件,可协助用户快速搭建企业专属门户。 随着零衍产品的不断成熟,国际化需求日益增多,客户期望零衍门户可…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
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 …...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
