《最新单片机原理及应用-汇编语言程序设计ppt课件.ppt》由会员分享,可在线阅读,更多相关《最新单片机原理及应用-汇编语言程序设计ppt课件.ppt(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 二、汇编语言程序设计的步骤与特点(1)分析任务(2)建立数学模型,确定算法(3)制定程序流程图(4)编写源程序(5)源程序的汇编与调试(6)编写程序说明文件程序设计概述程序设计概述分支结构程序分支结构程序参考程序:参考程序: ORG0000HVAR DATA30HFUNC DATA31H MOVA ,VAR;A X JZ DONE;若X=0,则转DONE JNBACC.7 ,POSI;若X0,则转POSI MOVA ,# 0FFH;若X0,则Y = 1DONE: MOVFUNC ,A;存函数值 SJMP$ END分支结构程序分支结构程序参考程序:参考程序: ORG0000HVAR: DATA
2、30HFUNC: DATA31H MOVA ,VAR;A X JZ DONE;若X=0,则转DONE MOVR0 , # 0FFH;先设X0,R0 = FFH JNBACC.7 ,NEG;若X0,R0 = 1NEG: MOVA ,# 01H ;若X0,则Y = 1DONE: MOVFUNC ,A;存函数值 SJMP$ END分支结构程序分支结构程序例例:根据R7的内容,转至对应的分支程序。设R7的内容为0N,对应的处理程序地址分别为P0P7START:MOV DPTR,#TAB MOV A,R7 ADD A,R7 ;R72A MOV R3,A ;暂存R3 MOVC A,A+DPTR ;取高位地
3、址 XCH A ,R3 INC A MOVC A,A+DPTR ;取低位地址 MOV DPL,A MOV DPH,R3 ;转移地址送入DPTR CLR A JMP A+DPTR TAB: DW P0 DW P1 DW PNP0高位P0低位TABP1高位P1低位TAB+2分支结构程序分支结构程序循环程序一般由: 初始化部分 循环体部分-处理部分、修改部分、控制部分 结束部分其结构一般有两种: 先进入处理部分,再控制循环 至少执行一次循环体 先控制循环,再进入处理部分 循环体是否执行,取决于判断结果。循环控制的一般方法: 循环次数已知:利用循环次数控制 循环次数未知:利用关键字控制 利用“逻辑尺”
4、 :根据“逻辑尺”的内容,进行控制开始设置循环初值循环处理循环修改结束处理结束循环结束?开始设置循环初值循环处理循环修改结束处理结束循环结束?YN例例:统计数据块的长度入口条件:内部RAM 30H开始的存储区有若干个数据,最后一个数据为字符FFH,结果存入40H单元。 ORG 0100HMAIN: MOV R1,#30H;R1作为地址指针 CLRA;累加器A作为计数器LOOP: CJNER1,#0FFH,NEXT;与数据FF比较,不 等转移 LJMPJSH1;找到结束符号,结束循环NEXT: INC A;计数器加1 INCR1;指针加l LJMP L00P;循环JSHl: INCA ;再加入l
5、个字符 MOV30H,A;存结果 END 例延时程序(晶振为延时程序(晶振为12M12M),),由于采用12M晶振,机器周期为1 s , D J N Z 的 指 令 周 期 为 2 , 整 个 程 序 的 执 行 时 间 为25020021s100000s0.1s ORG0100H ; 0.1s延时程序(晶振为12M)MOVR2,#200LOOP: MOVR3,#250DJNZR3,$DJNZR2,LOOPORG0100H ;1s延时程序(晶振为12M) MOVR1,#10LOOP1:MOVR2,#200LOOP:MOVR3,#250DJNZR3,$DJNZR2,LOOPDJNZR1,LOOP
6、1 带通用性问题,可以把它设计成通用子程序以供调用。这样使程序紧凑,缩短程序长度,调式方便。 1 子程序结构应具备 1)必须标明子程序入口地址,即名称 2)必须以返回指令RET结束子程序 2 子程序设计时注意事项: 1)要能正确传递参数: 入口条件:子程序中要处理的数据如何给予。 出口条件:子程序处理结果如何存放。 (寄存器、存储器、堆栈方式) 2)保护与恢复现场: 保护现场:压栈指令PUSH 恢复现场:弹出指令POP3 子程序特性 1)通用性 2)可浮动性 3)可递归和重入性例例单字节十六进制数转换成双字节ASCII码入口条件:待转换的单字节十六进制数在寄存器R2中。出口:高四位的ASCII
7、码在A中,低四位的ASCII码在B中。 ORG0100H MOVA,R2 MOVB,A ;暂存待转换的单字节十六进制数 LCALLMS1 ;转换低四位 XCHA,B;存放低四位的ASCII码 SWAPA ;准备转换高四位 LCALLMS1 ;转换高四位 LJMP$MS1:ANLA,#0FH;将累加器的低四位转换成 ASCII 码 ADDA,#90H DA A ADDCA,#40H DA A RET 例5:将多位十六进制数转换成ASCII码,设R0指向十六进制数低位, R2存放字节数,转换后R1指向ASCII码高位。HTASC: MOV A,R0 ;取十六进制数 ANL A,#0FH ;取低四位
8、 ADD A,#15 ;偏移修正 MOVC A,A+PC ;查表得ASCII码 MOV R1,A ;保存 INC R1 MOV A,R0 ;取十六进制数高四位 SWAP A ; ANL A,#0F0H ADD A,#06H ;偏移修正 MOVC A,A+PC ;查表 MOV R1,A ;保存 INC R0 ;指向下一单元 INC R1 DJNZ R2,HTASC RETASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H例 内部RAM20H单元开始存8个无符号8位二进制数,找出其中的最大数。极值
9、查找操作的主要内容是进行数值大小的比较。假定在比较过程中,以A存放大数,与之逐个比较的另一个数放在2AH单元中。比较结束后,把查找到的最大数送2BH单元中。程序流程如图所示。参考程序如下:MOVR0 , # 20H ;数据区首地址MOVR7 , # 08H ;数据区长度MOVA ,R0;读第一个数DECR7LOOP:INCR0MOV2AH ,R0;读下一个数CJNEA ,2AH ,CHK;数值比较CHK: JNCLOOP1;A值大转移MOVA ,R0;大数送ALOOP1:DJNZ R7 , LOOP;继续MOV2BH ,A;极值送2BH单元HERE:LJMPHERE;停止例例 编出能根据R6的
10、内容转向各个操作程序的程序。设该操作程序的转向地址分别为OPRD0,OPRDl, OPRDn。程序如下: MOV DPTR,#TAB3 ;指向转移地址表 MOV A,R6ADD A,R6JNC NANDINC DPHNAND:MOV R7,A MOVC A,A+DPTR ;取转向地址高8位 XCH A,R7 INC A MOVC A,A+DPTR ;取转向地址低8位 PUSH A ;转向地址入栈 MOV A,R7 PUSH A RET ;转向操作程序TAB3:DW OPRD0 ;转向地址表 DW OPRDl DW OPRDn例例 试编出能模拟图4-9中电路的程序。GF+DEVCC8031P1.0P1.1P1.2P1.3K0K1K3DEF(a) 8031的接线(b) 被模拟电路 ORG 0000H D BIT 00H E BIT 01H G BIT 02HLOOP1:ORL P1,#08H ;准备P1.3输入LOOP2:MOV C,P1.3 ;检测K3状态 JC LOOP2 ;若未准备好(K3断),则LOOP2 ORL P1,#03H ;若准备好,则准备输入P1.0和P1.1状态 MOV C,P1.0 ;输入K0状态 MOV D,C ;送入D MOV C,P1.1 ;输入K1状态 MOV E,C ;送入E ANL C,D ;DE送C MOV G,C ;送入G 32 结束语结束语