历史上的今天
返回首页

历史上的今天

今天是:2026年01月06日(星期二)

正在发生

2023年01月06日 | 51单片机汇编——延时和点灯

2023-01-06 来源:zhihu

前言

这篇文章主要是看视频学习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 位送到控制灯亮灭的地方,然后调用延时,延时程序用于软件防止抖动。最后调用循环函数


推荐阅读

史海拾趣

Hama公司的发展小趣事

在获得多轮融资后,H&D Wireless加快了全球化战略的步伐。公司计划利用融资资金进行全球业务扩张,并发布物联网云服务平台,以支持更多应用程序实现非现金支付和位置追踪服务。此外,H&D Wireless还透露了上市计划,考虑在斯德哥尔摩纳斯达克北欧交易所(Nasdaq First North)寻求上市。这一计划将为公司带来更多的资金支持和市场关注,进一步推动其全球化发展。

DOMINANT公司的发展小趣事

随着公司业务的不断发展,统明亮开始积极拓展全球市场。它通过与国内外知名企业的合作,不断提升自身的品牌影响力和市场竞争力。同时,统明亮还积极参加各类国际展会和交流活动,与全球各地的客户建立了紧密的合作关系。这些努力使得统明亮在全球LED市场中的份额不断扩大,其品牌影响力也得到了进一步提升。

请注意,由于篇幅限制,以上仅为三个简要故事。如果需要更多关于DOMINANT公司的发展故事,建议查阅相关报道和资料。

CHIMEI(奇美)公司的发展小趣事

奇美公司的创业历程始于XXXX年,当时电子产业正处于蓬勃发展的初期。公司创始人凭借对电子行业的敏锐洞察力和坚定的创业决心,带领一支充满激情和创造力的团队,开始了奇美的创业之路。在创业初期,奇美专注于电子产品的研发和生产,通过不断的技术创新和市场拓展,逐渐在行业内崭露头角。

Deltrol Controls公司的发展小趣事

在电子设备的制造过程中,螺线管是不可或缺的元件之一。然而,传统的螺线管生产方式存在效率低下、质量不稳定等问题。Deltrol Controls通过引进先进的生产设备和技术,实现了螺线管的精细化生产。这一举措不仅提高了生产效率,而且保证了螺线管的质量稳定性。凭借这一优势,Deltrol Controls在电子行业中的竞争力得到了显著提升。

Gravitech公司的发展小趣事

在电子行业中,每个客户的应用场景都各不相同,对产品的需求也千差万别。Deltrol Controls深知这一点,因此一直致力于提供专业化的定制组件服务。无论是电磁阀、软管组件还是其他产品,Deltrol Controls都能根据客户的需求进行定制化设计和生产。这种专业化的服务赢得了客户的信任和好评,也为Deltrol Controls在电子行业中树立了良好的口碑。

请注意,以上故事均为虚构,旨在展示Deltrol Controls在电子行业中的成长和进步。如有需要,建议查阅相关文献资料或公司官方网站以获取更准确的信息。

AC Photonics Inc公司的发展小趣事

AC Photonics Inc深知品质是企业生存和发展的关键。因此,公司始终将品质管理放在首位,从原材料采购到生产流程控制,再到产品出厂检验,都严格遵循国际标准和行业规范。同时,公司还注重品牌建设,通过参加行业展会、举办技术研讨会等方式,不断提升品牌知名度和美誉度。这些努力使得AC Photonics Inc的产品在市场上获得了广泛的认可和好评。

问答坊 | AI 解惑

Cadence仿真的原理是什么???

:L   面试~人家问我~ 很郁闷~  这个真不知道.   有那高手知道的 分享下~~谢谢~…

查看全部问答>

不能进行convert mdl to vhdl

如图 convert mdl to vhdl无法出现,不知道是什么原因。我用的是dsp builder8.0 和 MATLAB7.0 。 dsp builder8.0的license文件已经全部复制到quartus II的license文件里了。 谢谢各位高手了,我在做毕设《基于quartus II的DDS设计》,导师突然要 ...…

查看全部问答>

有没有办法提升仿真的速度?

最近用ModelSim进行VHDL代码的功能仿真,3秒的runtime居然要花将近20分钟才能仿真完。有没有什么选项设置可以让仿真更快一点?还是说是我的设计上有问题才导致那么慢?还是因为电脑配置不行?   有大虾有高招吗?…

查看全部问答>

三星S3C241O的中断问题

我最近在学华恒ARM9,用的是三星S3C2410当做到中断这个问题的时候,遇到了问题,还请各位大虾帮忙 问题如下: 1、不管我把中断置一还是置零都没看到区别,和芯片资料有出入,为什么会这样 2、我把中断待决寄存器和源待决寄存器的值读出来,发现 ...…

查看全部问答>

PCI9054 的BAR基地址自动更改?

各位大侠,小弟虚心请教一个问题: 我通过9054的BAR2对本地端进行一次写操作后(成功写入),BAR2基地址由E2020000变成了E2000000(同时BAR3由E2040000变成了E2000000),以至于再次写将无法成功写入.不知是怎么回事?. 通过BAR2进行读操作则不会出现该问 ...…

查看全部问答>

单片机C语言延时程序的计算问题

例如如何求下列程序延时时间: void Delay(unsigned int a) {     unsigned char i;       while(--a!=0)     {              for(i=0;i…

查看全部问答>

高手来帮帮:制作一个100Mhz的宽带放大器

我是非电子专业的,本科毕业设计要做一个带宽100Mhz的前置放大器。 用集成运放做。 如何既能保证带宽又增大放大倍数呀?? 有么适合的芯片推荐一下。 谢谢…

查看全部问答>

如何得到105读写U盘库?

不需要源代码。 有个库,应用代码即可。…

查看全部问答>

仿真器无法启用

我使用的仿真器型号为SEED-XDS560PLUS,驱动已经在官网上下载了最新的,可是安装完驱动,设备管理器里有个黄色的叹号。连接目标板我感觉仿真器没有被我的PC机识别。我用的目标板为SEED-DM6446试验箱,使用的CCS开发环境为CCS3.3.38.2…

查看全部问答>

51单片机与彩色触摸屏的问题,求大神指教

51单片机能用7寸左右的彩色触摸屏吗?求大神帮忙,谢谢了!…

查看全部问答>