汇编语言与接口技术--跑马灯

news2025/1/6 10:28:56

一、 实验要求

  1. 在单片机开发板的LED灯D1~D8上实现跑马灯。LED与单片机引脚连线电路如下图:

  1. 单片机芯片选择AT89C51,晶振频率设为12MHz,操作参考单片机开发板使用说明。
  2. 跑马灯点亮的时间间隔约为1秒。
  3. 分别用定时器的模式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 是为了满足跑马灯效果中对定时中断间隔的要求,通过合适的初值设置,可以实现精确的时间控制,从而控制跑马灯的速度和节奏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2270785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于数据融合的智能家居环境监测系统研究与设计(论文+源码)

1总体方案设计 本次基于数据融合的智能家居环境监测系统的设计,其系统总体架构如图2.1所示,整个系统在器件上包括了主控制器STM32F103单片机,MQ可燃气体传感器,光照传感器,DHT11温湿度传感器,风扇&#xff…

Mac中配置Node.js前端vscode环境(第二期)

核心组件:vscode、谷歌浏览器、Node.js(重点)、git 一、Node.js安装(nvm安装) 点击macos中的终端,保持bash,而不是zsh 若为zsh,则可在终端中使用下面命令变成bash chsh -s /bin/…

基于SpringBoot和Thymeleaf的仿小米电商系统源码下载与安装指南-幽络源

项目概述 这是一个基于 Spring Boot 2.X 和 Thymeleaf 技术栈的仿小米电商系统。该项目包括了前台商城系统和后台管理系统,经幽络源测试具备完整的电商功能,适合用作学习、参考或作为开发电商系统的基础。 前台商城系统: 包括首页登录、商品…

Deepseek v3 的笔记

基本概述 Deepseek v3是Deepseek发布的旗舰模型,属于607B的混合专家(MoE)模型,其中活跃参数为37B。在当前的模型领域,它堪称最佳的开源模型,性能超越了Llama 3.1 405b、Qwen和Mistral等知名模型。根据基准…

机器学习中的常用特征选择方法及其应用案例

工业界中,特征选择是机器学习模型开发的重要步骤,可以提高模型性能、减少过拟合和加速计算。针对类别型特征和数值型特征,特征选择方法有所不同。以下详细讲解方法和案例。 一、类别型特征的特征选择 1. 基于卡方检验 卡方检验是一种衡量两…

Pyecharts SVG 标记使用笔记

Pyecharts SVG 标记使用笔记 在数据可视化中,图表的标记点常常用于突出显示重要数据点。Pyecharts 提供了丰富的标记点配置选项,其中使用 SVG 路径来自定义标记点的样式是一个非常强大的功能。本文将详细介绍如何在 Pyecharts 中使用 SVG 路径来定制标记…

Spring SpEL表达式由浅入深

标题 前言概述功能使用字面值对象属性和方法变量引用#this 和 #root变量获取类的类型调用对象(类)的方法调用类构造器类型转换运算符赋值运算符条件(关系)表达式三元表达式Elvis 操作符逻辑运算instanceof 和 正则表达式的匹配操作符 安全导航操作员数组集合(Array 、List、Map…

大型模型推理加速入门

一 推理加速基础 1. 了解基本概念与术语 首先需要了解关于大模型的一些基本的历史发展,概念和术语,不需要全部看懂,只需要掌握大概情况,可以通过下面这篇文章进行: 大模型入门基本概念,术语 2. 了解Tra…

仓库叉车高科技安全辅助设备——AI防碰撞系统N2024G-2

在当今这个高效运作、安全第一的物流时代,仓库作为供应链的中心地带,其安全与效率直接关系到企业的命脉。 随着科技的飞速发展,传统叉车作业模式正逐步向智能化、安全化转型,而在这场技术革新中,AI防碰撞系统N2024G-2…

python-redis访问指南

Redis(Remote Dictionary Server)是一种开源的内存数据结构存储,可用作数据库、缓存和消息代理。它功能强大且灵活,可根据需求调整架构和配置,以高性能、简单易用、支持多种数据结构而闻名,广泛应用于各种场…

Flash Attention V3使用

Flash Attention V3 概述 Flash Attention 是一种针对 Transformer 模型中注意力机制的优化实现,旨在提高计算效率和内存利用率。随着大模型的普及,Flash Attention V3 在 H100 GPU 上实现了显著的性能提升,相比于前一版本,V3 通…

UE5失真材质

渐变材质函数:RadialGradientExponential(指数径向渐变) 函数使用 UV 通道 0 来产生径向渐变,同时允许用户调整半径和中心点偏移。 用于控制渐变所在的位置及其涵盖 0-1 空间的程度。 基于 0-1 的渐变中心位置偏移。 源自中心的径…

Ansys Aqwa 中 Diffraction Analysis 的疲劳结果

了解如何执行疲劳分析,包括由 Ansys Aqwa 计算的海浪行为。 了解疲劳分析 大多数机器故障是由于负载随时间变化,而不是静态负载。这种失效通常发生在应力水平明显低于材料的屈服强度时。因此,当存在动态载荷时,仅依赖静态失效理…

MT8788安卓核心板_MTK8788核心板参数_联发科模块定制开发

MT8788安卓核心板是一款尺寸为52.5mm x 38.5mm x 2.95mm的高集成度电路板,专为各种智能设备应用而设计。该板卡整合了处理器、图形处理单元(GPU)、LPDDR3内存、eMMC存储及电源管理模块,具备出色的性能与低功耗特性。 这款核心板搭载了联发科的MT8788处理…

【UE5 C++课程系列笔记】19——通过GConfig读写.ini文件

步骤 1. 新建一个Actor类,这里命名为“INIActor” 2. 新建一个配置文件“Test.ini” 添加一个自定义配置项 3. 接下来我们在“INIActor”类中获取并修改“CustomInt”的值。这里定义一个方法“GetINIVariable” 方法实现如下,其中第16行代码用于构建配…

Qt天气预报系统设计界面布局第四部分右边

Qt天气预报系统 1、第四部分右边的第一部分1.1添加控件 2、第四部分右边的第二部分2.1添加控件 3、第四部分右边的第三部分3.1添加控件3.2修改控件名字 1、第四部分右边的第一部分 1.1添加控件 拖入一个widget,改名为widget04r作为第四部分的右边 往widget04r再拖…

机器学习基础-机器学习的常用学习方法

半监督学习的概念 少量有标签样本和大量有标签样本进行学习;这种方法旨在利用未标注数据中的结构信息来提高模型性能,尤其是在标注数据获取成本高昂或困难的情况下。 规则学习的概念 基本概念 机器学习里的规则 若......则...... 解释:如果…

搭建nginx文件服务器

1、创建一个nginx配置文件/etc/nginx/nginx.conf user nginx; worker_processes 1;error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;events {worker_connections 1024; }http {include mime.types;default_type application/octet-stream;server {li…

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). 优…

逐光的黑色羽翼:一位黑色超模的成长之路-中小企实战运营和营销工作室博客

逐光的黑色羽翼:一位黑色超模的成长之路-中小企实战运营和营销工作室博客 在遥远的非洲肯尼亚,有一个小女孩名叫艾拉。她生活在一个小小的部落村庄里,每天伴随着朝阳起床,跟着家人放牧,在广袤无垠的草原上奔跑嬉戏&am…