(47)--3.4.6子程序结构程序设计举例.ppt

上传人:刘静 文档编号:96426906 上传时间:2023-11-27 格式:PPT 页数:16 大小:81.83KB
返回 下载 相关 举报
(47)--3.4.6子程序结构程序设计举例.ppt_第1页
第1页 / 共16页
(47)--3.4.6子程序结构程序设计举例.ppt_第2页
第2页 / 共16页
点击查看更多>>
资源描述

《(47)--3.4.6子程序结构程序设计举例.ppt》由会员分享,可在线阅读,更多相关《(47)--3.4.6子程序结构程序设计举例.ppt(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第3章 MCS-51 单片机的指令系统3.4.6 3.4.6 子程序结构程序设计举例子程序结构程序设计举例子程序结构是单片机模块化程序设计中的一种重要程序结构。在实际应用中,经常会遇到一些带有通用性的问题,如延时处理、字符处理、数值转换以等操作。或者在一个程序中出现了多次相同功能的程序时,如果每次都重写一遍,就会使得整个程序变得冗长,会占用大量的内存。把具有功能相对完整、结构相对独立的而且经常会用到的公用程序按照一定结构写成固定的程序段,当需要时,可以直接调用,这种能够完成一定功能、可以被其它程序调用的公共程序段称为子程序采用子程序结构设计,可以使得程序总体架构更加清晰,简化了程序的逻辑结构,

2、而且还便于分块调试,可有效地提高编程效率。3.4.6 3.4.6 子程序结构程序设计举例子程序结构程序设计举例子程序设计时的注意问题(1 1)每个子程序必须有个名称,叫子程序名。子程序命名时应尽量体现其功能,以便于程序的阅读和维护。子程序名是子程序第一条指令的符号地址。(2 2)主程序通过子程序调用指令实现对子程序的调用。有长调用指令LCALL和绝对调用指令 ACALL。3.4.6 3.4.6 子程序结构程序设计举例子程序结构程序设计举例子程序设计时的注意问题(3 3)明确入口参数与出口参数 子程序是主程序的一部分,在主程序调用时需要传递入口参数给子程序,也就是输入给子程序的数据以及存放的位置

3、等;当子程序执行完毕时,如果需要传回子程序的处理结果时,就是把出口参数传递给主程序,主要有三种传递方法u利用累加器A或工作寄存器Rn传递u利用指针寄存器传递参数u利用堆栈传递参数3.4.6 3.4.6 子程序结构程序设计举例子程序结构程序设计举例子程序设计时的注意问题(4 4)保护现场和恢复现场。现场是指调用子程序时需要用到的寄存器或存储区。现场保护需要用PUSH指令把需要保护的寄存器或者存储单元压入堆栈,在子程序完成后,利用POP指令恢复现场。(5 5)子程序最后一条指令是子程序返回指令RET。(6 6)子程序可以嵌套,就是在一个子程序中调用另一个子程序。由于子程序的每次调用都会需要利用堆栈

4、保存断点,受堆栈深度的限制,子程序的嵌套次数是有限的【例】编程设计一个子程序,实现09数字平方的查表。设变量X的值存放在累加器A中,查表后所求的X2的值放在累加器A中。3.4.6 3.4.6 子程序结构程序设计举例子程序结构程序设计举例方法一(用DPTR作为基址寄存器),程序如下:;子程序名:GetSqaVal1;子程序功能:求09数的平方子程序;子程序入口:(A)=待处理的数;子程序出口:(A)=平方值(结果)ORG0100H;子程序存放位置,可不写。GetSqaVal1:MOVDPTR,#TABsq1;设置表格地址 MOVCA,A+DPTR;开始查表 RET;子程序返TABsq1:DB0,

5、1,4,9,16,25,36,49,64,81;平方表格;子程序名:GetSqaVal1;子程序功能:求09数的平方子程序;子程序入口:(A)=待处理的数;子程序出口:(A)=平方值(结果)ORG0100H;子程序存放位置,可不写。GetSqaVal1:MOVDPTR,#TABsq1;设置表格地址 MOVCA,A+DPTR;开始查表 RET;子程序返TABsq1:DB0,1,4,9,16,25,36,49,64,81;平方表格【例】编程设计一个子程序,实现09数字平方的查表。设变量X的值存放在累加器A中,查表后所求的X2的值放在累加器A中。3.4.6 3.4.6 子程序结构程序设计举例子程序结

6、构程序设计举例方法二(用PC作为基址寄存器),程序如下:;子程序名:GetSqaVal2;子程序功能:求09数的平方子程序;子程序入口:(A)=待处理的数;子程序出口:(A)=平方值(结果)ORG0100H;子程序存放位置,可不写。GetSqaVal2:INCA;修正偏移量A,查表指令执行时PC值指向RET;指令,没有指向表格,A加1后即指向表格MOVCA,A+PC;开始查表RET;子程序返回TABsq2:DB0,1,4,9,16,25,36,49,64,81;平方表格方法二(用PC作为基址寄存器),程序如下:;子程序名:GetSqaVal2;子程序功能:求09数的平方子程序;子程序入口:(A

7、)=待处理的数;子程序出口:(A)=平方值(结果)ORG0100H ;子程序存放位置,可不写。GetSqaVal2:INCA ;修正偏移量A,查表指令执行时PC值指向RET ;指令,没有指向表格,A加1后即指向表格 MOVCA,A+PC ;开始查表 RET ;子程序返回TABsq2:DB0,1,4,9,16,25,36,49,64,81 ;平方表格【例】请编程设计一个延时50MS的子程序,已知单片机的晶振频率是12MHZ。3.4.6 3.4.6 子程序结构程序设计举例子程序结构程序设计举例;子程序名:DL50ms;子程序功能:实现延时50ms的子程序;子程序入口:无;子程序出口:无 DL50m

8、s:MOV R6,#50;外循环,实现延时50ms;内循环,实现延时1ms的程序,选用R7作为循环计数器DL1ms:MOV R7,#200;为R7赋值指令,指令周期:1个机器周期DL5us:NOP;空操作,指令周期:1个机器周期NOP;空操作,指令周期:1个机器周期NOP;空操作,指令周期:1个机器周期DJNZR7,DL5us;DJNZ指令,指令周期:2个机器周期DJNZR6,DL1ms;外循环判断控制RET ;子程序返回;子程序名:DL50ms;子程序功能:实现延时50ms的子程序;子程序入口:无;子程序出口:无DL50ms:MOV R6,#50;外循环,实现延时50ms;内循环,实现延时1

9、ms的程序,选用R7作为循环计数器DL1ms:MOV R7,#200;为R7赋值指令,指令周期:1个机器周期DL5us:NOP;空操作,指令周期:1个机器周期NOP;空操作,指令周期:1个机器周期NOP;空操作,指令周期:1个机器周期DJNZR7,DL5us;DJNZ指令,指令周期:2个机器周期DJNZR6,DL1ms;外循环判断控制RET ;子程序返回【例】电路如图中所示,已知单片机的晶振频率是12MHZ,请编程实现发光二极管LED0亮0.1S灭0.1S的闪烁现象,要求采用模块化技术设计。3.4.6 3.4.6 子程序结构程序设计举例子程序结构程序设计举例LED0MCS-51P1.0+5V1

10、k【例】电路如图中所示,已知单片机的晶振频率是12MHZ,请编程实现发光二极管LED0亮0.1S灭0.1S的闪烁现象,要求采用模块化技术设计。3.4.6 3.4.6 子程序结构程序设计举例子程序结构程序设计举例ORG0000H;ORG伪指令SJMPMain;复位入口地址处放一条转移至用户程序的转移指令;主程序ORG0030H;用户程序从0030H单元开始存放,目的是Main:;避开中断入口地址MOVSP,#6FH;设置堆栈地址SETBP1.0;设置LED灯的初始状态,熄灭状态LpLED:CLRP1.0;点亮LED灯LCALLDL100ms;调用延时0.1s的子程序,令灯亮0.1sSETBP1.

11、0;熄灭LED灯LCALLDL100ms;调用延时0.1s的子程序,令灯灭0.1sSJMPLpLED;重复上述过程。ORG0000H;ORG伪指令SJMPMain;复位入口地址处放一条转移至用户程序的转移指令;主程序ORG0030H;用户程序从0030H单元开始存放,目的是Main:;避开中断入口地址MOVSP,#6FH;设置堆栈地址SETBP1.0;设置LED灯的初始状态,熄灭状态LpLED:CLRP1.0;点亮LED灯LCALLDL100ms;调用延时0.1s的子程序,令灯亮0.1sSETBP1.0;熄灭LED灯LCALLDL100ms;调用延时0.1s的子程序,令灯灭0.1sSJMPLp

12、LED;重复上述过程。【例】电路如图中所示,已知单片机的晶振频率是12MHZ,请编程实现发光二极管LED0亮0.1S灭0.1S的闪烁现象,要求采用模块化技术设计。3.4.6 3.4.6 子程序结构程序设计举例子程序结构程序设计举例;子程序;子程序名:DL100ms;子程序功能:实现延时0.1s的子程序;子程序入口:无;子程序出口:无DL100ms:MOVR6,#100;外循环,实现延时100ms,即0.1s;内循环,实现延时1ms的程序,选用R7作为循环计数器DL1ms:MOVR7,#200;为R7赋值指令,指令周期:1个机器周期DL5us:NOP;空操作,指令周期:1个机器周期NOP;空操作

13、,指令周期:1个机器周期NOP;空操作,指令周期:1个机器周期DJNZR7,DL5us;DJNZ指令,指令周期:2个机器周期DJNZR6,DL1ms;外循环判断控制RET;子程序返回END;程序汇编结束;子程序;子程序名:DL100ms;子程序功能:实现延时0.1s的子程序;子程序入口:无;子程序出口:无 DL100ms:MOV R6,#100;外循环,实现延时100ms,即0.1s;内循环,实现延时1ms的程序,选用R7作为循环计数器DL1ms:MOV R7,#200;为R7赋值指令,指令周期:1个机器周期DL5us:NOP;空操作,指令周期:1个机器周期NOP;空操作,指令周期:1个机器周期NOP;空操作,指令周期:1个机器周期DJNZR7,DL5us;DJNZ指令,指令周期:2个机器周期DJNZR6,DL1ms;外循环判断控制RET;子程序返回END;程序汇编结束

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁