汇编程序与周期性程序设计

本文详细介绍了汇编语言中定时方法(多重循环和Nop指令)的应用,以及查表技术在求平方数程序中的运用。通过实例讲解了如何用单片机控制LED灯的周期性变化,并探讨了普中单片机实验开发板的使用。
摘要由CSDN通过智能技术生成

实验目的

1、深入了解汇编指令和常用程序结构,掌握汇编语言的两中定时方法,即多重循环技术定时法和利用循环和Nop指令结合的定时法。

2、掌握汇编语言的查表方法。

3、掌握普中单片机实验开发板的开发使用方法。

一、深入了解汇编指令和常用的程序结构,以下列周期性点亮LED灯的延时函数为例

一个机器周期包括12个时钟周期,若单片机工作于12M晶体震荡器下,那一个时钟周期为1/12us,所以一个机器周期为1us。MOV是单指令,所以MOV R6, #250的指令(机器)周期数为1,执行了250次,其对应的时钟周期总数为250us;DJNZ是双指令,所以DJNZ R6, #D2的指令周期为2,执行了250x250=62500次,其对应的时钟周期总数为125000us。DELAY延迟函数总调用了1+250+62500+250=63001次,时钟周期总数为1+250+(62500+250)x2=125751us,约为126ms,则这个LED灯大约126ms才变化一次亮灭状态。

1、通过软件多重循环计数定时方法

通过软件三重循环计数定时,实现LED灯每个1s亮灭的周期性变化代码如下图所示:

延迟函数总调用了1+(1+250+250x250+250+1)x8=504017次,所以,时钟周期总数为1+8+250x8+(250x250+250+1)x8x2=1006025us,约为1s

2、通过循环+Nop指令方法

Nop指令的指令周期为1,以单片机工作于12M晶体震荡器下为例,则Nop指令的时钟周期为1us。

通过双重循环+Nop指令的方法实现准确的LED 每隔1s亮灭的周期性变化,代码如图所示:

延迟函数总共调用了1+(1+250+1+250x250+1+250+1)x8=504023次,所以,时钟周期总数为1+8+250x8+8+8+(250x250+250+1)x8x2=1006041us,约为1s

二、掌握汇编语言用查表法完成求平方数的程序

汇编代码如图所示:

单片机中,0000H单元为系统启动地址,ORG 0000H LJMP A1 就是在该地址存放一条无条件跳转指令,转入主程序的空操作位置。那为什么要执行空操作呢?是因为单片机和外围扩展芯片的复位时间不可避免地出现不一致现象,执行空操作是为了等待外围扩展芯片从复位状态回到正常状态,这样外围扩展芯片就可以收到单片机的初始化操作,代码1~5行就是为了实现这样的操作。SP作为栈指针,会被系统默认赋值为70H。第6行代码是重新给栈指针赋值的操作,将60H~7FH强行划分为堆栈区。查表法完成求平方数就必须先建立表格,第11~12行代码实现表格的建立,DB指令将0~9的平方的十六进制数组成的表格写入到程序中去,表格起始地址为2000H。这里的表格是固定表格,即表格的位置固定在2000H~200AH中。第7行代码即是将表格的起始地址赋给DPTR。第8行代码即是你想要查询0~9中那个数的平方,MOV A,#03H,即是查询3 的平方数。第9行代码执行查表功能,即把表格起始地址往后加A个单元的平方数赋给A,执行完后A的值就为你想要查询的数的平方数。第10 行代码执行的是原地跳转指令,控制程序不会进入到未知空间中去

上述代码中的表格为固定表格,存在很大的弊端。因为表格会被放在代码的后面,若有效代码长度大于给定的空间,则会覆盖表格区域。此时就需要一个浮动表格,汇编代码如图所示:

因为标号隐含地址信息,我们可以把标号作为地址信息进行赋值语句。第11行代码用tab进行了对表格的标号,在第7行代码将标号tab作为立即数赋值给DPTR,即将表格的首地址作为立即数赋值给DPTR,这样DPTR就代表了表格的入口

Edsim51演示如图所示:

三、掌握普中单片机实验开发板的开发使用方法,在板子上完成LED周期性点灯的C程序实验

再Keil5中的汇编代码如图所示:

打开PZ-ISP,操作如图所示:

下载成功页面如图所示:

在开发版上演示如图所示:

参考文献

1、【公开课】哈工大 单片机原理及应用 第16讲_哔哩哔哩_bilibili第16讲是【公开课】哈工大 单片机原理及应用的第16集视频,该合集共计50集,视频收藏或关注UP主,及时了解更多相关视频内容。icon-default.png?t=N7T8https://www.bilibili.com/video/BV1zW411s73i?p=16&vd_source=3d1425d8916d0baf001d43ee5235c5a4

2、汇编程序与周期性任务设计-CSDN博客文章浏览阅读134次,点赞6次,收藏5次。通过这次实验,我感触很多。首先,弥补了之前对汇编语言的认识不充分、不深刻,现在能理解到汇编语言与C语言其实本质上都差不多,二者能相互转化。Keil是一个很好的软件,它能用生成HEX文件,然后烧录进芯片中。其次,我自己学习领会了平方数表的本质是“查找”,而不是“计算”,然后自己写了一段更为简练的代码进行验证。另外,纸上得来终觉浅,绝知此事要躬行。我在用STC-89C52RC开发板点亮8个独立的LED灯之一时,发现始终点不亮,又检查了好几遍代码。最后通过询问同学才得知,此LED灯乃是连接在P2.0口上的。https://blog.csdn.net/wodeshijiexialey/article/details/136988980

  • 32
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值