本节书摘来自异步社区《例说8051:单片机程序设计案例教程》一书中的第1章,第1-4节,作者 张义和,陈敌北,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1-4 实例演练
单片机系统的设计中,软件与硬件息息相关,采用不同的电路设计,程序可能就不太一样。因此,在编写程序之前,必须确定电路的连接状态,例如要利用8051的Port 2来控制8个LED,让这8个LED分成两组(高四位与低四位),交互闪烁,其设计步骤如下:
- 如图1-19所示的电路中,当Port 2的引脚输出低电平(0)时,其所连接的LED因正向导通而亮;若将引脚输出高电平(1)时,其所连接的LED因反向截止而不亮。因此,我们的程序设计就要让Port 2输出为“00001111”,使左边四个LED亮,右边四个LED不亮。隔一段时间后,再将输出反相,即左边四个LED不亮,右边四个LED亮,……如此周而复始。
- 有了电路和思路后,随即可画出流程图,如图1-20所示。
- 除简单的程序外,根据流程图来编写程序是一个较容易且保险的方法。若要编写程序,则进入文本编辑程序后,按行输入,其中每行“;”右边的部分是注释,是对该条指令的说明,只提供备注信息,不会影响源程序运行。在此建议尽量要求自己对自己所编写的程序进行注释,一方面可以增加该程序的可读性,另一方面则可养成良好的程序编写习惯。
ORG 0 ;程序从0地址开始
START: MOV A, #0FH ;让ACC的内容为00001111
LOOP: MOV P2, A ;从Port 2输出ACC的内容
CPL A ;对ACC的内容取补码(即反相)
CALL DELAY ;调用延迟子程序
JMP LOOP ;跳到LOOP处执行
;=======================================================
DELAY: ;延迟子程序
MOV R7, #20 ;R7寄存器加载次数20
D1: MOV R6, #25 ;R6寄存器加载次数25
DJNZ R6, $ ;本行执行R6次
DJNZ R7, D1 ;D1循环执行R7次
RET ;返回主程序
END ;结束程序
ch1.asm
- 通常我们会将所有开发工具都放在一个文件夹里(如D:8051),包括PE2、X8051、LINK、AVSIM51、TEST.BAT(前面所介绍的自动批处理文件),以及所编辑的源程序。当源程序编辑完成且存盘(ch1.asm)后,在命令提示符下输入:
屏幕将出现一连串操作,最后停止,如图1-21所示。
- 此时产生了*.hex文件,可进一步进行软件仿真,同样是在命令提示符下输入:
屏幕出现如图1-22所示画面。
- 紧接着载入刚才编译完成的文件,按、键,再输入ch1.hex,按键即可载入ch1.hex,如图1-24所示。