《例说8051:单片机程序设计案例教程》——2-7 实例演练

简介:

本节书摘来自异步社区《例说8051:单片机程序设计案例教程》一书中的第2章,第2-7节,作者 张义和,陈敌北,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2-7 实例演练

如图2-16所示为本单元的实验电路,在此将进行单灯左移、双灯左移,以及霹雳灯的实验。


screenshot

2-7-1 单灯左移

在此的“单灯左移”是从Port 2输出的8个LED中,从P2.0所连接的LED开始亮,任何时刻只有一个LED亮,如图2-17所示。


screenshot

设计要点

1.如图2-14所示,若要LED亮,则P2输出0;因此,刚开始时输出11111110,即可使最右边的LED亮,其余不亮。

2.若要从右边第一个LED亮,转成第二个LED亮,可用左移指令,即


screenshot

3.在此要介绍8051的“计数循环”结构的格式,如下所示:


screenshot

其中Rn为记录次数的寄存器,例如要重复执行循环体5次,则


screenshot

4.每个LED亮的时间约0.1s,因此需要一个延迟子程序,在此将应用前述的计数循环,如下所示:


screenshot

其中的“DJNZ R6, $”指令是对本身那一条指令执行R6次。对于12MHz时钟脉冲的8051系统而言,12个周期(1个机器周期)刚好是1s,整个子程序的延迟时间T为


screenshot

R6=250,R7=200,则延迟时间T0.1s。

流程图与程序设计


screenshot

       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的值尽量小一点,时间误差比较小。

screenshot

在线仿真

连接好图2-13所示的电路,再连接好在线仿真器,然后加载经过汇编与连接后的*.hex文件,以进行在线仿真。对于延迟子程序而言,在线仿真能真正反映延迟时间,因此要记得把R7与R6恢复正常。

举一反三

1.认识单灯左移的程序之后,修改该程序,让它变成单灯右移的功能。

2.试设计一个双灯左移的程序。

3.在本单元里采用一个0.1s的延迟子程序,若要得到0.01s的延迟,要如何修改?1s的延迟子程序又如何设计?

2-7-2 霹雳灯

“霹雳灯”是只有一个LED亮,由右边移至左边,再移回右边,如此不断地来回移动。在此将以图2-14所示的电路为例设计一个霹雳灯程序。

设计要点

1.一般地,霹雳灯程序可以看作是单灯左移与单灯右移的组合,即


screenshot

2.若一开始是单灯左移,则其初始值为“11111110”,即最右边LED亮,其他不亮。

3.左移7次后,将变成最左边LED亮,其他不亮。紧接着是单灯右移,右移7次后,又恢复为最右边LED亮,其他不亮。如此周而复始,即为霹雳灯。

流程图与程序设计


screenshot

       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文件,以进行在线仿真。

举一反三

认识单灯的霹雳灯程序之后,修改该程序,让它变成双灯的霹雳灯功能。

相关文章
|
7月前
|
物联网
MQTT常见问题之用单片机接入阿里MQTT实例失败如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
7月前
|
数据处理
MCS-51单片机汇编语言程序设计
MCS-51单片机汇编语言程序设计
182 0
|
传感器 数据采集 监控
上千个完整设计的单片机、8086、STM32制作教程和资料-转发分享
在网上收集了接近上千个完整设计的单片机、8086、STM32制作教程和资料-转发分享(涵盖了大部分的毕设课设题目),学习单片机的最好教程,也可以作为帮助大家在做电子课设毕设时有利的帮助,可以从以下百度网盘下载(按照编号下载)。
2191 0
上千个完整设计的单片机、8086、STM32制作教程和资料-转发分享
【单片机】简单的自定义延时程序设计(代码演示)
【单片机】简单的自定义延时程序设计(代码演示)
|
开发框架 JSON 物联网
Nanoframework 操作单片机蓝牙配置WIFI的案例
通过`Nanoframework`的蓝牙配置Wifi的名称和密码
144 0
|
算法 芯片
基于51单片机点阵汉字显示程序设计
基于51单片机点阵汉字显示程序设计
基于51单片机点阵汉字显示程序设计
蓝桥杯之单片机学习(十四)——基础技能综合实训案例解析
蓝桥杯之单片机学习(十四)——基础技能综合实训案例解析
285 0
蓝桥杯之单片机学习(十四)——基础技能综合实训案例解析
蓝桥杯之单片机学习(十二)——串口通信进阶应用案例解析
蓝桥杯之单片机学习(十二)——串口通信进阶应用案例解析
281 0
蓝桥杯之单片机学习(十二)——串口通信进阶应用案例解析
|
芯片
单片机:蜂鸣器发声和自动关闭一站式教程:(附赠如何控制声音大小和音调)软件编程+硬件原理+注意事项
单片机:蜂鸣器发声和自动关闭一站式教程:(附赠如何控制声音大小和音调)软件编程+硬件原理+注意事项
728 0
单片机:蜂鸣器发声和自动关闭一站式教程:(附赠如何控制声音大小和音调)软件编程+硬件原理+注意事项
蓝桥杯之单片机学习(九)——定时器的进阶综合案例解析
蓝桥杯之单片机学习(九)——定时器的进阶综合案例解析
240 0