51单片机汇编——延时和点灯

发布者:创意狂想最新更新时间:2023-01-06 来源: zhihu关键字:51单片机  汇编  延时  点灯 手机看文章 扫描二维码
随时随地手机看文章

前言

这篇文章主要是看视频学习51汇编,但是我的环境总是配置不好,出现了这个问题(keil2+vdmagdi.exe+Proteus),有懂的小伙伴可以帮助一下我 ^.^

一、延时程序

1.1 延时程序的简介和分类

在单片机的控制应用中,常有延时的需要,CPU 过一段时间再去做某件事,称之为延迟。延时有两种方法,即软件延时和硬件延时

硬件延时是通过定时/计数器(中断程序)来实现的,这种方法不占用 CPU 的工作时间

软件延时一般采用循环程序,通过 CPU 执行一个具有固定延迟时间的循环体来实现的


1.2 软件延时

1、机器周期数

延时程序的延时时间主要与两个因素有关,一是所用晶振,二是延时程序中的循环次数,一旦晶振确定之后,则主要是如何设计与计算需给定的延时循环次数

晶振产生一个波形,这个波是有固定周期的,每个汇编指令执行的周期不同,下面是给出的指令和他的周期数


2、机器周期数求解

假设我们的晶振频率为 10Hz,产生的波形如下图

则 1 秒内震荡 10 次,1 秒 10 个时钟周期

2 个时钟周期是 1 个状态周期,1 机器周期是 6 个状态周期

单片机的晶振频率为 6MHz,则一机器周期为 2us;单片机的晶振频率为 12MHz,则一机器周期为1us;


1.3 基本延时程序模式及延时时间的计算

1、单循环延时程序

把上面的汇编程序封装成一个过程(汇编里面常用过程来表示函数的意思)

先把 #X (#后面的是立即数)数据移动到 R0 寄存器里面,然后循环执行 DJNZ 指令。DJNZ 指令的含义就是 R0 寄存器减少 1,如果 R0 不为 0,就跳转到标号为 DEL1 处执行;如果 R0 为 0 就继续往下执行

所以上述程序:

执行 X 个数次的 DJNZ 函数,总共 2*X*T 时间(T 为机器周期)。执行一次 MOV 函数,消耗 T 时间。执行一次 RET 跳出过程的指令,消耗 2T 时间(指令消耗的机器周期数在前面的图片中有写)


延时时间范围计算

设 X 是装入寄存器 R0 的时间常数,R0 是 8 位寄存器(以下的 R1、R2、R 均是 8 位),因为 0<=R0<=255,R0=0,延时时间最长,RO=1,延时时间最短。当 R0=0 时,由汇编语言的特征知其将从零开始判断,共 256 次,所以应在公式中代入 256,因此这个程序的最长定时时间为 1030us


2、双重循环延时程序

MOV R1,Y 执行了 1 次

MOV R0,X;DJNZ R1,DEL2 两条语句执行了 Y 次

DJNZ R0,DEL1 语句执行了 X*Y 次


3、三重循环延时程序


4、设计一个延时为 100us 的程序

让延时精确到 100us 的方法如下

NOP 是占位,不进行任何操作的汇编指令


二、汇编指令控制灯亮灭

2.1 单灯亮灭

1、电路图

XTAL1、XTAL2 接的是晶振,为单片机提供时钟脉冲信号

RST 为复位电路引脚


2、汇编程序

ORG:告诉单片机,下一条执行的指令起始位置

SETB 指令:将 P1.0 引脚置 1,让灯泡灭

LCALL 指令:调用 DELAY 延时过程

CLR 指令:寄存器清 0 指令,让灯泡亮

AJMP 指令:跳转到 START 循环执行这个过程


2.2 多灯亮灭

1、电路图


2、汇编程序

与单灯相比,单灯用的是位操作,这个是整体的地址赋值


2.3 开关控制灯亮灭

1、电路图


2、汇编程序

JB P0.0, LIG 指令:如果 P0.0 引脚为 1(高电平),则跳转到 LIG 过程,LIG 过程把等电平信号置为 0(低

电平),灯就亮;否则不跳转到 LIG,电平信号置为 1(高电平),灯就灭


2.4 多开关控制多灯泡

1、电路图


2、汇编代码

前面的代码依次判断每个灯需要亮或者灭。在 next1 前判断 P1.0 的亮灭,在 next2 前判断 P1.1 的亮灭。


3、电路图2


4、汇编程序2

把低 4 位的输入数据和高 4 位进行调换,再把高 4 位送到控制灯亮灭的地方,然后调用延时,延时程序用于软件防止抖动。最后调用循环函数


关键字:51单片机  汇编  延时  点灯 引用地址:51单片机汇编——延时和点灯

上一篇:51单片机汇编——延时和点灯
下一篇:51单片机学习——存储和引脚

推荐阅读最新更新时间:2024-11-11 10:22

8051单片机中访问int中字节的方法
在使用单片机中,unsigned int 占2个字节,unsigned char 占一个字节。而单片机是实行的字节寻址。16字节的bit寻址实在是不好用, 不好用在不能建数组。 在实际的开发过程中,要使用DPTR,还有定时器的TL0,TH0 的高低字节等。 需要我们先定义一个int类型的可以用来赋值什么的比较自然。 然后和0xff与得到低8,一个字节。可以放入DPTR的低字节或定时器的低字节。 将int类型的左移8位后,再和0xff与得到int的高8位,一个字节,移入到DPTR的高字节或定时器的高字节。 这样很麻烦。 实际上,我们可以通过struct和union方便的直接一步到位的得到int 类型的高字节和低字节,同时也能观察到5
[单片机]
80<font color='red'>51单片机</font>中访问int中字节的方法
51单片机入门 - SPI协议与应用实验
简介: 串行外围设备接口 全双工三线同步,可以同时发出和接收串行数据 采用主从(Master Slave)架构,支持多Slave模式应用,一般仅支持单Slave 时钟由Master控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后 目前应用中可以达到几Mbps的水平 优点:与普通的串行设备相比,可以按位传输,甚至可以暂停。当没有时钟跳变时,从设备不采集和传送数据。不需要寻址操作。全双工通信。 缺点:没有应答机制确认。 特点: 提供频率可编程时钟 发送结束、中断标志;写冲突保护 总线竞争保护 SPI总线工作的4种工作方式中,使用最广泛的是SPI0和SPI3方式 - - - - - - - - - -
[单片机]
<font color='red'>51单片机</font>入门 - SPI协议与应用实验
51单片机实现按住一个独立按键不松手的加速匀速触发
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: Independent-KEY ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200508 ---- @ModifiedTime: 2020
[单片机]
<font color='red'>51单片机</font>实现按住一个独立按键不松手的加速匀速触发
基于51单片机的流水灯设计
三个按键:A按键启动、B按键控制不同流水速度(低中高)、C按键 设计思路一(未用中断): 8个LED灯正极解电源,负极接单片机I/O口。 死循环:设置P2口为11111110,使用左移函数,循环七次。 同时每次位移中间加入延时函数。 三个按键:A按键启动、B按键控制不同流水速度(低中高)、C按键控制流水灯暂停蜂鸣器长响: 思路一:设置一个变量i,起初为0,按下A键后为1;当i为1进入死循环 设置变量j,按下B,j++,当j大于3,j=j-3;使用j*1000,来空置循环函数的延时时间。设置bit变量s=0,按下按键C,s++,当s=1,j进入循环蜂鸣器响,s=0退出循环。 在每次延时时检查按键 #inclu
[单片机]
基于<font color='red'>51单片机</font>的流水灯设计
51单片机pwm调制 产生多路分频信号 倍频
P1口各口输出频率不同的PWM信号,且P1.1口的PWM波周期是P1.0口的两倍,P1.2口PWM周期是P1.1的两倍,以此类推 单片机源程序如下: /*----------------------------------------------- 名称:定时器0 修改:无 内容:通过定时产生不同频率方波 ------------------------------------------------*/ #include reg52.h //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 /*------------------------------------------------
[单片机]
<font color='red'>51单片机</font>pwm调制 产生多路分频信号 倍频
ARM汇编编程基础之一 —— 寄存器
ARM的汇编编程,本质上就是针对CPU寄存器的编程,所以我们首先要弄清楚ARM有哪些寄存器?这些寄存器都是如何使用的? ARM寄存器分为2类,普通寄存器和状态寄存器 寄存器类别 寄存器在汇编中的名称 各模式下实际访问的寄存器 用户 系统 管理 中止 未定义 中断 快中断 通用寄存器和程序计数器 R0(a1) R0 R1(a2) R1 R2(a3) R2 R3(a4) R3 R4(v1) R4 R5(v2) R5 R6(v3) R6 R7(v4) R7 R8(v5) R8 R8_fiq R9(SB,v6) R9 R9_fiq R10(S
[单片机]
51单片机设计方案TOP10(九)
基于51单片机的光功率计的设计    摘要: 通过光电传感器将待测光信号变化转变为模拟信号,对模拟信号进行AD处理分析得到光信号的参数特性并在51单片机上通过串口通讯输出。    1 背景概述   1.1 光功率定义   光功率是光在单位时间内所做的功。光功率常用单位是毫瓦(mW)和分贝(dB),其中两者关系为1mW=0dB,而小于1mW的分贝为负值。例如,在光纤收发器或交换机说明书中,有其产品的发光和接收光功率,通常发光小于0dB。   接收端所能够接收的最小光功率称为灵敏度,能接收的最大光功率减去灵敏度的值称为动态范围,发光功率减去接收灵敏度是允许光纤损耗值。    1.2 使用分贝做单位主要有两个好处   (
[模拟电子]
<font color='red'>51单片机</font>设计方案TOP10(九)
TM1637四位数码管模块驱动(TM1637.h头文件)51单片机C语言
TM1637四位数码管模块是一个带时钟点的4位共阳数码管(0.36英寸)的显示模块,驱动芯片为TM1637,驱动方式为IIC,因此只需2根信号线即可使单片机控制4位8段数码管(数码管8级灰度可调)。 控制接口:共4个引脚(GND、VCC、DIO、CLK),GND为地,VCC为供电电源,DIO为数据输入输出脚,CLK为时钟信号脚。 TM1637.h单片机源程序如下: sbit CLK= P3^4; //定义模拟IIC总线的时钟线 sbit DIO = P3^5; //定义模拟IIC总线的数据线 code unsigned char tab = { 0x3F,/*0*/ 0x06,/*1*/
[单片机]
TM1637四位数码管模块驱动(TM1637.h头文件)<font color='red'>51单片机</font>C语言
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved