《例说8051:单片机程序设计案例教程》——2-7 实例演练
本节书摘来自异步社区《例说8051:单片机程序设计案例教程》一书中的第2章,第2-7节,作者 张义和,陈敌北,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2-7 实例演练如图2-16所示为本单元的实验电路,在此将进行单灯左移、双灯左移,以及霹雳灯的实验。
在此的“单灯左移”是从Port 2输出的8个LED中,从P2.0所连接的LED开始亮,任何时刻只有一个LED亮,如图2-17所示。
设计要点
1.如图2-14所示,若要LED亮,则P2输出0;因此,刚开始时输出11111110,即可使最右边的LED亮,其余不亮。
2.若要从右边第一个LED亮,转成第二个LED亮,可用左移指令,即
3.在此要介绍8051的“计数循环”结构的格式,如下所示:
其中Rn为记录次数的寄存器,例如要重复执行循环体5次,则
4.每个LED亮的时间约0.1s,因此需要一个延迟子程序,在此将应用前述的计数循环,如下所示:
其中的“DJNZ R6, $”指令是对本身那一条指令执行R6次。对于12MHz时钟脉冲的8051系统而言,12个周期(1个机器周期)刚好是1s,整个子程序的延迟时间T为
R6=250,R7=200,则延迟时间T0.1s。
流程图与程序设计
ORG 0 ;程序从0地址开始 START: MOV A, #FEH ;让ACC的内容为11111110 LOOP: MOV P2, A ;从Port 2输出ACC的内容 RL A ;将ACC的内容左移 CALL DELAY ;调用延迟子程序 JMP LOOP ;跳到LOOP处执行 ;=================================================== DELAY: ;延迟子程序(0.1s) MOV R7, #200 ;R7寄存器加载次数200 D1: MOV R6, #250 ;R6寄存器加载次数250 DJNZ R6, $ ;本行执行R6次 DJNZ R7, D1 ;D1循环执行R7次 RET ;返回主程序 END ;结束程序
ch2-1.asm
软件仿真
经过汇编与连接后,即可以AVSIM51进行软件仿真,但要注意下列事项:
1.软件仿真并不能正确反应延迟子程序的延迟时间,若以R7=200、R6=250仿真,恐怕要等非常久;最好能改短一点,例如R7=20、R6=25即可。以本延迟子程序为例,通常R6的值尽量大一点,R7的值尽量小一点,时间误差比较小。
在线仿真
连接好图2-13所示的电路,再连接好在线仿真器,然后加载经过汇编与连接后的*.hex文件,以进行在线仿真。对于延迟子程序而言,在线仿真能真正反映延迟时间,因此要记得把R7与R6恢复正常。
举一反三
1.认识单灯左移的程序之后,修改该程序,让它变成单灯右移的功能。
2.试设计一个双灯左移的程序。
3.在本单元里采用一个0.1s的延迟子程序,若要得到0.01s的延迟,要如何修改?1s的延迟子程序又如何设计?
2-7-2 霹雳灯“霹雳灯”是只有一个LED亮,由右边移至左边,再移回右边,如此不断地来回移动。在此将以图2-14所示的电路为例设计一个霹雳灯程序。
设计要点
1.一般地,霹雳灯程序可以看作是单灯左移与单灯右移的组合,即
2.若一开始是单灯左移,则其初始值为“11111110”,即最右边LED亮,其他不亮。
3.左移7次后,将变成最左边LED亮,其他不亮。紧接着是单灯右移,右移7次后,又恢复为最右边LED亮,其他不亮。如此周而复始,即为霹雳灯。
流程图与程序设计
ORG 0 ;程序从0地址开始 ;单灯左移================================================== START: MOV A, #FEH ;让ACC的内容为11111110 LOOP: MOV R0, #7 ;以R0为左移的计次计数器 LOOPL: MOV P2, A ;从Port 2输出ACC的内容 RL A ;将ACC的内容左移 CALL DELAY ;调用延迟子程序 DJNZ R0, LOOPL ;LOOPL循环执行R0次 ;单灯右移================================================== MOV R0, #7 ;以R0为右移的计次计数器 LOOPR: MOV P2, A ;从Port 2输出ACC的内容 RR A ;将ACC的内容右移 CALL DELAY ;调用延迟子程序 DJNZ R0, LOOPR ;LOOPR循环执行R0次 JMP LOOP ;重新开始 ;延迟子程序============================================== DELAY: ;延迟子程序(0.1s) MOV R7, #200 ;R7寄存器加载次数200 D1: MOV R6, #250 ;R6寄存器加载次数250 DJNZ R6, $ ;本行执行R6次 DJNZ R7, D1 ;D1循环执行R7次 RET ;返回主程序 END ;结束程序
ch2-2.asm
软件仿真
经过汇编与连接后,即可以AVSIM51进行软件仿真,注意事项与2-7-1节相同。
在线仿真
连接好图2-13所示的电路,再连接在线仿真器(ICE),即可下载经过汇编与连接后的*.hex文件,以进行在线仿真。
举一反三
认识单灯的霹雳灯程序之后,修改该程序,让它变成双灯的霹雳灯功能。
51单片机原理以及接口技术(四)--80C51的程序设计 单片机应用系统是合理的硬件与完善的软件的有机组合。软件就是各种指令依某种规律组合形成的程序。程序设计(或软件设计)的任务是利用计算机语言对系统预完成的任务进行描述和规定。
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- mybatis简单案例源码详细【注释全面】——Dao层映射文件(UserMapper.xml)【重要】
- mybatis简单案例源码详细【注释全面】——Dao层接口(UserMapper.java)
- mybatis简单案例源码详细【注释全面】——实体层(Role.java)
- ENode框架Conference案例分析系列之 - 订单处理减库存的设计
- Ansible 入门案例
- SAP Marketing Cloud Restful API SDK 使用案例分享
- XAI之GS:全局代理(Global Surrogate,对黑盒机器学习执行模型可解释性的技术)的简介、常用工具包、案例应用之详细攻略
- NLP之NNLM:NNLM神经语言模型算法(词向量法的始祖)的简介、网络结构、案例应用、代码实现之详细攻略
- ML之kNN:k最近邻kNN算法的简介、应用、经典案例之详细攻略
- Python:魔术方法(__getitem__、__len__等包含双下划线构成的方法)的简介、使用案例之详细攻略
- 实战案例丨使用云连接CC和数据复制服务DRS实现跨区域RDS迁移和数据同步
- 第29讲:多表查询综合案例
- Microsoft SDK 中Sample案例之Amcap項目 的运行方法(转)
- js ajax 经典案例
- 【SPSS】二项分布检验详细操作教程(附案例实战)
- 数据分析案例-大数据相关招聘岗位可视化分析
- Nginx 配置实例-反向代理案例二