汇编语言与接口技术--跑马灯
一、 实验要求
- 在单片机开发板的LED灯D1~D8上实现跑马灯。LED与单片机引脚连线电路如下图:
- 单片机芯片选择AT89C51,晶振频率设为12MHz,操作参考单片机开发板使用说明。
- 跑马灯点亮的时间间隔约为1秒。
- 分别用定时器的模式1和模式2实现。(用P83的延时子程序实现)
二、 实验设计
1.整体思路
(1)初始化阶段(MAIN 程序段)
设置堆栈指针 SP 为 #60H,为程序运行时的堆栈操作预留空间,确保函数调用和局部变量存储等操作有足够的内存空间。
将寄存器 B 赋值为 #14H,用于后续控制跑马灯移动的速度和周期,作为中断次数计数器或其他与时间相关的控制参数。
配置定时器 / 计数器 0 的工作模式为模式 1(MOV TMOD,#01H)。
将初始的 LED 状态值 #0FEH(假设低电平点亮 LED,此值对应点亮除最低位外的其他 LED 灯)赋值给累加器 A,并将 A 的值输出到 P2 端口,从而设置 LED 灯的初始点亮状态。
使能定时器 0 中断(SETB ET0)、总中断(SETB EA),并启动定时器 0 开始计时(SETB TR0),为后续的定时器中断触发跑马灯状态更新做准备。
最后进入一个无限循环 SJMP HERE,等待定时器中断的发生。
(2)中断服务阶段(MAIN2 程序段)
每次进入中断服务程序时,首先判断寄存器 B 的值是否为 0。如果 B 不为 0,则将 B 减 1 并跳转到 RETURN 处,暂时不进行 LED 灯状态的更新操作;如果 B 为 0,则说明满足了一定的时间条件或计数条件,开始进行跑马灯状态更新操作。
对累加器 A 中的值进行循环左移操作(RL A),使得 LED 灯的点亮状态向左移动一位,实现跑马灯向左移动的效果。然后将更新后的 A 值输出到 P2 端口,更新 LED 灯的显示状态。
将寄存器 B 重新赋值为 #14H,重置控制参数,为下一次的判断和操作做准备。
调用延迟子程序 ACALL DELAY,用于控制跑马灯移动的速度,通过延迟一定时间来调整 LED 灯状态更新的频率,使其以合适的速度显示,便于观察。
(3)延迟子程序(DELAY 程序段)
通过简单的循环结构实现延迟功能。在这个延迟子程序中,通过将寄存器R5设置为一个初始值(这里是#20),然后在循环中不断对R5进行减 1 操作,直到R5的值变为0,以此来消耗一定的时间,从而达到延迟的目的。
2.流程图
程序从RESET处开始,跳转到MAIN;
在MAIN中,设置堆栈指针、初始化变量、配置定时器和中断,然后等待T0定时器中断;
当T0定时器中断发生时,跳转到MAIN2进行中断服务处理;
在MAIN2中,根据条件判断B值是否为零,如果不为零则更新LED灯状态,并调用DELAY进行延时;
DELAY过程进行简单延时操作;
返回到MAIN2处理下一个循环;
循环执行上述步骤,直到程序结束。
3.主要模块设计思路及分析
(1)主程序模块(MAIN)
1-1堆栈指针设置
MOV B,#14H:寄存器 B 被用作一个控制参数,其具体用途是与定时器中断相关的计数或时间控制。初始化为 #14H,这个值会影响跑马灯的速度、周期等特性。
MOV TMOD,#01H:设置定时器 / 计数器 0 的工作模式为模式 1。
1-2 LED 初始状态设置
MOV A,#0FEH 和 MOV P2,A:这两条指令用于设置 LED 灯的初始状态。#0FEH 对应的二进制值为 11111110,假设连接到 P2 端口的 LED 灯是低电平点亮,那么初始状态就是除了最低位的 LED 灯熄灭外,其他 LED 灯点亮。
1-3中断设置与启动
SETB ET0、SETB EA 和 SETB TR0:这三条指令分别用于使能定时器 0 中断、总中断以及启动定时器 0 开始计时。使能定时器 0 中断允许单片机在定时器 0 计数溢出时自动跳转到中断服务程序MAIN2执行相应的操作。使能总中断则确保了整个系统能够响应定时器 0 中断以及其他可能的中断请求。启动定时器 0 开始计时后,定时器 0 将按照设定的工作模式和初值开始计数,当计数达到设定值时触发中断,从而实现定时控制跑马灯状态更新的功能。
(2)中断服务程序模块(MAIN2)
2-1中断次数判断与控制
DJNZ B,RETURN:该指令用于判断寄存器 B 的值是否为 0。如果 B 不为 0,则将 B 减 1 并跳转到 RETURN 处,是为了控制跑马灯状态更新的频率或时间间隔。
2-2跑马灯状态更新
RL A、MOV P2,A:RL A 指令对累加器 A 中的值进行循环左移操作,实现了 LED 灯点亮状态的向左移动,模拟跑马灯的效果。然后将更新后的 A 值输出到 P2 端口,从而更新了连接到 P2 端口的 LED 灯的显示状态。
MOV B,#14H:在完成一次跑马灯状态更新后,将 B 寄存器重新赋值为 #14H,重置了控制参数,为下一次的判断和操作做好准备。这样可以确保每次跑马灯状态更新的间隔或条件是一致的,保证了跑马灯效果的稳定性和可重复性。
(3)延迟子程序模块(DELAY)
MOV R5, #20:这里设置了外层循环的次数为 #20,可以根据实际需要调整这个值来改变延迟的总时间。如果需要更长的延迟时间,可以增大 R5 的值;反之,如果需要缩短延迟时间,可以减小 R5 的值。
三、 实现效果
四、总结
1. 通过对 B 寄存器的计数操作,可以在定时器中断多次发生后才进行一次跑马灯状态更新,从而实现对跑马灯速度和节奏的更精细控制。例如,如果 B 的初始值为 #14H,每次中断时 B 减 1,当 B 减到 0 时,才进行真正的跑马灯状态更新操作,这样就可以实现每隔一定次数的定时器中断更新一次 LED 灯状态,而不是每次中断都更新。
2. 在 8051 单片机中,定时器 / 计数器 0 的工作模式 1 是 16 位定时器 / 计数器模式,具有较大的计数范围和较高的定时精度,适用于需要较长时间定时或对定时精度有一定要求的应用场景。这里选择模式 1 是为了满足跑马灯效果中对定时中断间隔的要求,通过合适的初值设置,可以实现精确的时间控制,从而控制跑马灯的速度和节奏。
相关文章:
汇编语言与接口技术--跑马灯
一、 实验要求 在单片机开发板的LED灯D1~D8上实现跑马灯。LED与单片机引脚连线电路如下图: 单片机芯片选择AT89C51,晶振频率设为12MHz,操作参考单片机开发板使用说明。跑马灯点亮的时间间隔约为1秒。分别用定时器的模式1和模式2实现。(用P83…...
springcloud篇3-docker需熟练掌握的知识点
docker的原理请参考博文《Docker与Kubernetes》。 一、安装docker的指令 1.1 安装yum工具 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken补充:配置镜像源 注意: yum安装是在线联网下载安装,而很多的资源…...
Unity网络通信相关
Socket 通信一张图搞定 谁提供服务谁绑定端口,建立Listener,写Host...
leetcode 173.二叉搜索树迭代器栈绝妙思路
以上算法题中一个比较好的实现思路就是利用栈来进行实现,以下方法三就是利用栈来进行实现的,思路很好,很简练。进行next的时候,先是一直拿到左边的子树,直到null为止,这一步比较好思考一点,下一…...
模电面试——设计题及综合分析题0x01(含答案)
1、已知某温控系统的部分电路如下图(EDP070252),晶体管VT导通时,继电器J吸合,压缩机M运转制冷,VT截止时,J释放,M停止运转。 (1)电源刚接通时,晶体…...
Linux性能优化-系列文章-汇总
前言 Linux性能优化,涉及了CPU,内存,磁盘,网络等很多方面,一方面涉及的知识面广,同时又要在原理方面掌握一定的深度。所以整理总结了Linux性能优化的一系列文章。当处理Linux性能问题的时候,可…...
仓库叉车高科技安全辅助设备——AI防碰撞系统N2024G-2
在当今这个高效运作、安全第一的物流时代,仓库作为供应链的中心地带,其安全与效率直接关系到企业的命脉。 随着科技的飞速发展,传统叉车作业模式正逐步向智能化、安全化转型,而在这场技术革新中,AI防碰撞系统N2024G-2…...
threejs 安装
参考了threejs官方网站文档安装,上来就是各种报错,最终参考之前大佬发的攻略解决了。过程供大家参考。 官方文档地址如下: three.js docshttps://threejs.org/docs/index.html#manual/en/introduction/Installation 具体参考这篇攻略&#…...
《 C++ 点滴漫谈: 十七 》编译器优化与 C++ volatile:看似简单却不容小觑
摘要 本文深入探讨了 C 中的 volatile 关键字,全面解析其基本概念、典型用途以及在现代编程中的实际意义。通过剖析 volatile 的核心功能,我们了解了它如何避免编译器优化对硬件交互和多线程环境中变量访问的干扰。同时,文章分析了 volatile…...
【Vim Masterclass 笔记05】第 4 章:Vim 的帮助系统与同步练习
文章目录 Section 4:The Vim Help System(Vim 帮助系统)S04L14 Getting Help1 打开帮助系统2 退出帮助系统3 查看具体命令的帮助文档4 查看帮助文档中的主题5 帮助文档间的上翻、下翻6 关于 linewise7 查看光标所在术语名词的帮助文档8 关于退…...
电脑中缺失的nvrtc64_90.dll文件如何修复?
一、文件丢失问题 案例:nvrtc64_90.dll文件缺失 问题分析: nvrtc64_90.dll是NVIDIA CUDA Runtime Compilation库的一部分,通常与NVIDIA的CUDA Toolkit或相关驱动程序一起安装。如果该文件丢失,可能会导致基于CUDA的应用程序&…...
leveldb的DBSequence从哪里来,到哪里去?
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) leveldb数据库的DBSequence从哪里来,到哪里去? 大概的情形是,leveldb的记录初始DBSequence为0,随着记录的增加,记录sequence不断随着增加,并持久化…...
nginx高可用集群搭建
本文介绍nginx高可用集群的搭建。利用keepalived实时检查nginx进程是否存活、keepalived的虚拟ip技术,达到故障转移的目的。终端用户通过访问虚拟ip,感知不到实际发生的故障。架构图如下: 0、环境 Ubuntu:22.04.2 ltsnginx: 1.…...
基于TCP的Qt网络通信
基于TCP的Qt网络通信 项目源码:https://github.com/say-Hai/TcpSocketLearn/tree/QTcpSocket 在标准C没有提供专门用于套接字通信的类,所以只能使用操作系统提供的基于C的API函数,但是Qt就不一样了,它是C的一个框架并且里边提供了…...
MySql---进阶篇(六)---SQL优化
6.1:insert的优化: (1)普通的插入数据 如果我们需要一次性往数据库表中插入多条记录,可以从以下三个方面进行优化。 insert into tb_test values(1,tom); insert into tb_test values(2,cat); insert into tb_test values(3,jerry); 1). 优…...
什么是回归测试?
什么是回归测试? 回归测试被定义为一种软件测试,以确认最近的程序或代码更改没有对现有功能产生不利影响。回归测试只是对已经执行的测试用例的全部或部分选择,重新执行这些用例以确保现有功能正常工作。 进行此测试是为了确保新的代码更改不会对现有…...
详解MySQL SQL删除(超详,7K,含实例与分析)
文章目录 前言1. 删除表中的所有记录基本语法使用场景注意事项运用实例分析说明2. 删除特定记录基本语法使用场景注意事项运用实例分析说明3. 删除单条记录基本语法使用场景注意事项运用实例分析说明4. 删除违反引用完整性的记录基本语法使用场景注意事项运用实例分析说明5. 删…...
lec7-路由与路由器
lec7-路由与路由器 1. 路由器硬件 路由器的硬件部分: 断电失去: RAM断电不失去:NVRAM, Flash, ROMinterface也算是一部分 路由器是特殊组件的计算机 console 口进行具体的调试 辅助口(Auxiliary&…...
知识库召回列表模式揭秘:实现智能信息检索新突破
目录 一、什么是知识库的召回列表模式 召回列表模式的工作流程 典型应用场景 召回列表模式的优势 二、知识库召回列表模式的技术实现细节 1. 数据准备 2. 召回策略 3. 排序策略 4. 结果展示与交互 三、技术架构示例 1. 系统架构 2. 代码示例 四、总结 随着人工智能…...
WCH的CH57X的J-LINK的芯片FLASH烧录文件
WCH的CH57X的J-LINK的芯片FLASH烧录文件,需要在 D:\app\Keil_v5\SEGGER\JLink_V616a目录中JLINKDEVICES.XML文件中修改并增加以下信息。同时,需要加入CH57X.FLM文件 <Device> <ChipInfo Vendor"WCH" Name"CH57X" WorkRAMAddr"…...
Rust 基础入门指南
Rust 基础入门指南 1. Rust 语言概述 Rust 的历史与设计理念 Rust 是由 Mozilla 研究院的 Graydon Hoare 于2010年开始创建的系统编程语言。其设计目标是创建一种安全、并发、实用的编程语言,特别关注内存安全和并发性。 Rust 的核心设计理念包括: …...
Qt|QWidget窗口支持旋转
功能实现:使用QWidget创建的窗口支持窗口旋转功能。 展示的示例中支持由水平方向旋转至垂直方向。至于其它角度旋转的问题,看完这篇文章后应该会很简单能实现的! 开发环境:win VS2019 Qt 5.15.2 在实现之前也有想用使用 QProp…...
docker compose部署kafka集群
先部署zookeeper集群,启动 参考:docker compose部署zookeeper集群-CSDN博客 再部署kafka集群 networks: net: external: true services: kafka1: restart: always image: wurstmeister/kafka:2.13_2.8.1 container_name: kafka1 …...
Spring源码分析之事件机制——观察者模式(三)
目录 自定义事件 事件监听器 事件发布者(服务层) 使用示例controller层 Spring源码分析之事件机制——观察者模式(一)-CSDN博客 Spring源码分析之事件机制——观察者模式(二)-CSDN博客 这两篇文章是这…...
如何使用axios实现文件上传
文件上传 axios 支持文件上传,通常使用 FormData 对象来封装文件和其他表单数据。 import axios from axios;const formData new FormData(); formData.append(file, fileInput.files[0]); formData.append(description, 文件描述);axios.post(/api/upload, form…...
wx016基于springboot+vue+uniapp的超市购物系统小程序
开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…...
LLM - 使用 LLaMA-Factory 部署大模型 HTTP 多模态服务 (4)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144881432 大模型的 HTTP 服务,通过网络接口,提供 AI 模型功能的服务,允许通过发送 HTTP 请求,交互…...
JeeSite 快速开发平台:全能企业级快速开发解决方案|GitCode 光引计划征文展示
投稿人GitCode ID:thinkgem 光引计划投稿项目介绍 JeeSite 快速开发平台,不仅仅是一个后台开发框架,它是一个企业级快速开发解决方案,后端基于经典组合 Spring Boot、Shiro、MyBatis,前端采用 Beetl、Bootstrap、Admi…...
HackMyVM-Airbind靶机的测试报告
目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、Getshell 3、提权 使用ipv6绕过iptables 四、结论 一、测试环境 1、系统环境 渗透机:kali2021.1(192.168.101.127) 靶 机:debian(192.168.101.11…...
探索Wiki:开源知识管理平台及其私有化部署
在如今的信息时代,企业和团队的知识管理变得愈发重要。如何有效地存储、整理、共享和协作,是提高团队效率和创新能力的关键因素之一。今天,我要为大家介绍一款非常有用的github上开源知识管理工具——Wiki,并分享它的私有化部署方…...
网关的主要作用
在网络安全领域,网关扮演着举足轻重的角色,它不仅是网络间的桥梁,更是安全防线的守护者。以下是网关在网络安全中的几个关键作用: 1. 防火墙功能:网关常常集成了防火墙技术,能够对进出网络的数据包进行严格…...
黑马JavaWeb开发跟学(十五).Maven高级
黑马JavaWeb开发跟学.十五.Maven高级 Maven高级1. 分模块设计与开发1.1 介绍1.2 实践1.2.1 分析1.2.2 实现 1.3 总结 2. 继承与聚合2.1 继承2.1.1 继承关系2.1.1.1 思路分析2.1.1.2 实现 2.1.2 版本锁定2.1.2.1 场景2.1.2.2 介绍2.1.2.3 实现2.1.2.4 属性配置 2.2 聚合2.2.1 介…...
TLS(传输层安全,Transport Layer Security)是用于在网络上提供通信安全的一种加密协议。
TLS(传输层安全,Transport Layer Security)是用于在网络上提供通信安全的一种加密协议。它是SSL(安全套接层,Secure Sockets Layer)的继任者,旨在确保两个应用程序之间数据传输的隐私性、完整性…...
Statistic for ML
statistical concept 統計學概念 免費完整內容 PMF and CDF PMF定義的值是P(Xx),而CDF定義的值是P(X < x),x為所有的實數線上的點。 probability mass function (PMF) 概率質量函數 p X ( x ) P ( X x ) pX(x)P(Xx) pX(x)P(Xx) 是離散隨機變數…...
Node.js 函数
Node.js 函数 1. 概述 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,它允许开发者使用 JavaScript 编写服务器端和网络应用程序。在 Node.js 中,函数是一等公民,意味着它们可以作为变量传递,可以作为参数传递给其他函数,也可以从其他函数返回。本文将详细…...
数据结构:时间复杂度和空间复杂度
我们知道代码和代码之间算法的不同,一定影响了代码的执行效率,那么我们该如何评判算法的好坏呢?这就涉及到了我们算法效率的分析了。 📖一、算法效率 所谓算法效率的分析分为两种:第一种时间效率,又称时间…...
使用 Docker 安装 Redis
随着微服务架构和分布式应用的广泛应用,缓存技术已经成为提升系统性能和响应速度的关键手段。而 Redis 作为一个高效、轻量级的内存数据存储解决方案,因其极高的性能和丰富的数据结构支持,广泛应用于缓存、消息队列、实时分析等领域。 在现代…...
【源码+文档+调试讲解】“健康早知道”微信小程序
摘 要 随着信息化时代的到来,管理系统都趋向于智能化、系统化,“健康早知道”微信小程序也不例外,但目前国内的市场仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大,人工管理显然已无法应对时代…...
Linux中操作中的无痕命令history技巧
当我们需要查看Linux下的操作记录时,就可以用history命令来查看历史记录 1、关闭history记录功能,如果不想让别人看到自己在Linux上的操作命令,可以用这个命令 set o history 2、打开history记录功能 set -o history3、清空记录 histor…...
Springboot+NettySocket通讯教程
需求背景 最近需要对接一些硬件设备,他们选择了socket通讯,并且使用的是私有化协议加密通讯。这种情况下适合原生的socket加解密解析,不适合NettySocket,这在开发中增加了难度。所有的代码都要手动去敲。 // springboot原生socket通讯教程https://blog.csdn.net/renkai72…...
Spingboot定时任务与过滤器,拦截器
文章目录 Spingboot定时任务与过滤器,拦截器1. 定时任务Scheduled2. 拦截器 Spingboot定时任务与过滤器,拦截器 1. 定时任务Scheduled 一种是使用 Spring 自带的定时任务处理器 Scheduled 注解另一种就是使用第三方框架 Quartz ,Spring Boo…...
大数据学习(33)-续集
今天开始重新更新大数据 -- 感谢大家的支持!!!...
overleaf写学术论文常用语法+注意事项+审阅修订
常用语法 导入常用的宏包 \usepackage{cite} \usepackage{amsmath,amssymb,amsfonts} \usepackage{algorithmic} \usepackage{algorithm} \usepackage{graphicx} \usepackage{subfigure} \usepackage{textcomp} \usepackage{xcolor} \usepackage{lettrine} \usepackage{booktab…...
基于fMRI数据计算脑脊液(CSF)与全脑BOLD信号的时间耦合分析
一、前言 笔者之前的文章《基于Dpabi和spm12的脑脊液(csf)分割和提取笔记》,介绍了如何从普通的fMRI数据中提取CSF信号。首先是基础的预处理,包括时间层校正、头动校正,再加上0.01-0.1Hz的带通滤波。接着用SPM12分割出CSF区域,设置一个比较严格的0.9阈值,确保提取的真是…...
使用Dockerfile构建镜像
由于格式和图片解析问题,为了更好体验可前往 阅读原文 前面我们学习了可以使用docker commit命令式构建新的镜像,而此方式相对来说比较繁琐且对于旁人来说内部都是黑箱操作,无法了解制作的具体细节。很有可能很长时间后制作者也会对其忘却&am…...
SQL字符串截取函数——Left()、Right()、Substring()用法详解
SQL字符串截取函数——Left()、Right()、Substring()用法详解 1. LEFT() 函数:从字符串的左侧提取指定长度的子字符串。 LEFT(string, length)string:要操作的字符串。length&#x…...
python字符串函数用法大全
目录 1.0 capitalize()函数 2.0 title()函数 3.0 swapcase()函数 4.0 lower()函数 5.0 upper()函数 7.0 center()函数 8.0 ljust()函数 9.0 rjust()函数 10.0 zfill()函数 11.0 count()函数 13.0 decode()函数 14.0 expandtabs()函数 15.0 find()函数 16.0 rfind()…...
纵览!报表控件 Stimulsoft Reports、Dashboards 和 Forms 2025.1 新版本发布!
Stimulsoft 2025.1 新版发布,旨在增强您创建报告、仪表板和 PDF 表单的体验!此最新版本为您带来了许多改进和新功能,使数据处理更加高效和用户友好。亮点包括对 .NET 9 的支持、Microsoft Analysis Services 的新数据适配器、发布向导中适用于…...
【蓝桥杯——物联网设计与开发】Part2:OLED
目录 一、OLED (1)资源介绍 🔅原理图 🔅驱动原理 (2)STM32CubeMX 软件配置 (3)代码编写 (4)实验现象 二、OLED接口函数封装 🟡️OLED_Wri…...
壁纸样机神器,这个工具适合专业设计师用吗?
壁纸样机神器在一定程度上适合专业设计师使用,但是否适合具体取决于设计师的需求和使用场景: 适合专业设计师的方面 快速实现设计想法:专业设计师在创作过程中,有时需要快速将设计想法变为可视化的效果图,以便进行初…...