MCS-51系列单片机的程序设计.ppt_第1页
MCS-51系列单片机的程序设计.ppt_第2页
MCS-51系列单片机的程序设计.ppt_第3页
MCS-51系列单片机的程序设计.ppt_第4页
MCS-51系列单片机的程序设计.ppt_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MCS-51系列单片机的程序设计,第四章,交叉汇编语言MASM51,单片机汇编语言程序设计方法及技巧,了解交叉汇编语言MASM51的特点,掌握顺序程序、分支程序、循环程序、查表程序、子程序的基本设计方法和技巧,掌握汇编语言程序设计的一般步骤,4.1 交叉汇编语言MASM51,汇编语言源程序是由汇编指令和伪指令组成的文件,其扩展名为“ASM”。,1)人工汇编 人工汇编是通过人工查出源程序中所有汇编指令的机器码,并依次将机器码输入单片机中,使之成为单片机能直接执行的目标程序。,2)机器汇编 机器汇编是指在计算机上通过汇编程序对源程序进行汇编,即从源程序到目标程序的转换过程是由计算机上的汇编程序自动完成的。,3)交叉汇编 是指用一种计算机上的汇编程序去汇编另一种计算机的源程序,为另一种计算机产生目标程序。,单片机MCS-51汇编语言程序设计步骤: 1 分析问题 2 确定算法 3 设计程序流程图 4 分配内存单元 5 编写汇编语言源程序 6 调试程序,4.2 程序设计方法及技巧,4.2.1 顺序程序设计,分析:应注意片内和片外的寻址指令不同,ORG 1000H MOV R0 ,#68H MOV A ,R0 ; 片内RAM104单元内容送累加器 MOV DPTR ,#0104H MOVX DPTR ,A ; 完成片内RAM104单元内容送片 ; 外104H单元中 INC R0 MOV A ,R0 ; 片内RAM105单元内容送累加器 INC DPTR MOVX DPTR ,A ; 完成片内RAM105单元内容送片 ; 外105H单元中 SJMP $ END,1. 简单分支程序,4.2.2 分支程序设计,图4.1 简单分支程序转移,分析:只要将两数进行比较,用比较的结果作为分支转移的条件就很容易地找出其中的大数。,ORG 1000H CLR C MOV R0 , #FIRST ;第一个数地址送R0中 MOV A , R0 ;取第一个数 INC R0 ;R0指向第二个数地址 SUBB A , R0 ;两数比较 JC BIG ;第二个数大转BIG DEC R0 ;R0指向第一个数地址 BIG: MOV SECOND , R0 ;存大数 SJMP $ END,参考程序,2)多路分支程序(散转程序),图4.2 多路分支程序转移,1)把AJMP或LJMP指令组成一个分支程序的 转移表,表的首地址放入DPTR中; 2)调整后的出口信息放入累加器A中; 3)执行JMP A+DPTR转向对应的分支程序。,可通过间接转移指令JMP A+DPTR和 无条件转移指令中的AJMP或LJMP指令来实现 多路分支转移:,例 4.3,已知R0中存放有一数字关键码,要求根据码值的不同,分别转向对应的码值程序段去执行。即当R0=K时,便执行CODEK程序。,ORG 1000H MOV DPTR ,#TAB ;表首址送DPTR MOV A ,R0 ;取数字关键码 ADD A ,R0 ;每条AJMP指令占用两个字 ;节,将关键码乘以2 JNC LESS ;关键码小于128转LESS INC DPH LESS: JMP A+DPTR TAB: AJMP CODE0 ;关键码为0,转CODE0执行 AJMP CODE1 ;关键码为1,转CODE1执行 AJMP CODE255 ;关键码为255,转CODE255 ;执行,AJMP指令的转移范围不超出所在的2KB字节区间,如各小段程序较长,在2KB字节内无法全部容纳,上面的程序应该怎样修改?,思考,1)循环初始化 设置循环的初始状态,位于循环程序的开头位置 2)循环处理 循环程序的主体部分,是通过反复执行来完成数据的具体处理,它位于循环体内。,4.2.3 循环程序设计,循环程序由4部分组成:,3)循环控制 也在循环体内,是用于控制循环的继续与否。 4)循环结束 通常位于循环体后,是用来存放循环处理的最终结果及恢复各寄存器与工作单元的原始值。,设MCS-51单片机内部RAM从40H开始的连续16个单元中,每个单元中分别存放有单字节的带符号数。要求将其中的正数存入50H开始的连续单元中,负数存入60H开始的连续单元中,并将正数、负数和零的个数分别存入70H、71H、72H单元中。,例 4.4,1)带符号数的最高位为符号位,可通过 最高位来判断正负。 2)程序中需要分别从40H、50H 和60H单 元开始取源数、存放正数和负数,故需要三 个地址指针来指向对应的内存单元;设对应 的地址指针分别为R0、R1和R2,由于R2 不 能用间接寻址方式,故R2需要同R1或R0进行 交换后,才能进行负数的存放。,分析,图4.3 程序流程图,参考程序: ORG 1000H CLR A MOV 70H , A ; 存放正数的个数单元清0 MOV 71H , A ; 存放负数的个数单元清0 MOV 72H , A ; 存放零的个数单元清0 MOV R3 , #10H ; 设循环计数器初值 MOV R0 , #40H ;设源数地址指针 MOV R1 , #50H ;设正数地址指针 MOV R2 , #60H ;设负数地址指针,LOOP:MOV A , R0 ; 取源数 JZ ZERO ; 源数为0,转ZER0 JNB ACC.7 , POSI ; 源数为正,转POSI INC 71H ; 负数个数加1 MOV R4 , A ; 暂存源数 MOV A , R2 XCH A , R1 ; R1与R2中的内容交换 XCH A , R4 MOV R1 , A ;存负数 XCH A , R4 XCH A , R1 ; R1与R2中的内容交换 INC R2 ;调整负数地址指针 SJMP LOOP1 ; 转循坏控制,POSI: INC 70H ;正数个数加1 MOV R1 , A ;存正数 INC R1 ;调整正数地址指针 SJMP LOOP1 ZERO: INC 72H ;零的个数加1 LOOP1:INC R0 ;调整源数地址指针 DJNZ R3 , LOOP ;未送完,继续 SJMP $ END,查表就是把事先计算或测得的数据按照一定的顺序编制成表格存放在存储器中,然后根据输入的数据,从表格中查出所需的结果。,4.2.4 查表程序设计,片内RAM的EGA单元中有一个大写的英文字母,要求将此字母在英文字母表中的位置送入片内的COUNT单元中,如EGA单元中字母为I时,则COUNT单元中需送入数字9。,例 4.6,如果将26个英文字母按照顺序编成一个表,通过查表法得到一个字母与EGA单元中的字母比较,若不相等再查,同时记录查表的次数。查完后,将记录次数送COUNT单元。,分析,ORG 1000H EGA EQU 50H COUNT EQU 60H MOV COUNT,#00H MOV A , #16 ;调整地址 LOOP: PUSH A MOVC A , A+PC ;查表 CJNZ A , EGA , NF ;所查字母与EGA中字母比较 SJMP LAST ;相等则转到LAST NF: POP A INC A ;调整地址 INC COUNT ;记数值加1 SJMP LOOP ;继续查 LAST: INC COUNT ;记数值加1 SJMP $ ;等待 ALPT: DBA,B,Y,Z,求y= n! (n=0,1,9),已知n的值在片内RAM的NUM单元中,求得的y 值用BCD码表示且存放到片内GETY开始的单元中。,例 4.6,分析:可将函数值列成表,采用查表法求y= n! 当n= 9时,y= 362880H,需要三个单元存放结果。设每个n对应的y值都用3个单元来存放,则y值在表格中的首地址的计算公式为: y地址=函数表首址+ n*3,参考程序 ORG 1000H NUM EQU 50H GETY EQU 60H MOV R1,#03H MOV R0,#GETY MOV A ,NUM ; 取n值 MOV B ,#03H MUL AB ; n*3 MOV R2 ,A ; 暂存 MOV DPTR ,#TAB ; 表的首地址送DPTR中,LOOP: MOVC A ,A+DPTR ;查表 MOV R0 , A ;存结果 INC R0 ;调整存放结果地址指针 INC DPTR ;修正表地址指针 MOV A , R2 ;恢复n*3 DJNZ R1 , LOOP ;未查完,继续 SJMP $ TAB: DB 01H , 00H , 00H , 01H , 00H , 00H DB 02H , 00H , 00H , 06H , 00H , 00H DB 24H , 00H , 00H , 20H , 01H , 00H DB 20H , 07H , 00H , 40H , 50H , 00H DB 20H , 03H , 04H , 80H , 28H , 36H,编写子程序时应注意: a.子程序的第一条指令之前必须有标号; b.子程序中需要保护现场; c.主程序和子程序之间的参数传递。,4.2.5 子程序设计,1) 数码转换子程序,例4.7 二进制码转换为ASCII码,二进制数与ASCII码的对应关系: 四位二进制 ASCII 0000 (0) 30H 0001 (1) 31H 1001 (9) 39H 1010 (A) 41H 1111 (F) 46H,ORG 1000 BTOASC: PUSH A PUSH PSW MOV A , R0 ANL A , #0FH ;取四位二进制数 MOV R0 , A ;暂存 CLR C SUBB A , #0AH ;与10比较 MOV A , R0 ;恢复四位二进制数 JC LOOP ;小于10转LOOP ADD A , #07H ;大于10先加07H LOOP: ADD A , #30H ;加30H MOV R0 , A ;存结果 POP PSW POP A RET,已知片内BLOCKB单元开始处有一数据块,块长在R2中,在此数据块的每个单元中存放有一个未组合的BCD码,要求将每个BCD码转换为ASCAII码,并存放在片内BLOCKA开始的连续单元中。,例4.8 BCD码转换为ASCAII码,主程序: ORG 1000H MOV R2 ,#L MOV R0 ,#BLOCKB ;设BCD码的地址指针 MOV R1 ,#BLOCKA ;设ASCAII的地址指针 LOOP:ACALL TRANS ;调用TRANS子程序 DJNZ R2 ,LOOP ;未转换完,继续 SJMP $,将一位BCD码转换为ASCAII码的子程序: TRANS: MOV A , R0 ;取BCD码 ADD A , #30H MOV R1 , A ;送ASCAII码 INC R0 INC R1 RET ;返回,分析:将一位BCD码转换为相应的ASCAII码只 需加上30H即可。,设片内40H单元中有一组合的BCD码,要求将其转换为二进制数存回原处。 分析: 1)组合的BCD码为两位十进制数,需将十位 数和个位数分开处理。 2)十位数转换时只要累加0AH就能将其转换 为相应的二进制数,然后再将个位数直接 加到转换后的十位数上就可完成整个数的 转换。,例4.9 BCD码转换为二进制数,ORG 1000H BCDTOB: MOV A , 40H ANL A ,#F0H ;取十位数 SWAP A ;将十位数换到低4位 JZ DONE ;十位数为0,返回 MOV R3 ,#00H ;累加和寄存器清0 LOOP: DEC A ACALL ADD0AH ;调用加10子程序 JNZ LOOP ;未加完继续 MOV A ,40H ANL A ,#0FH ;取个位数 ADD A,R3 ;与十位相加 MOV 40H , A ;转换完,存结果 DONE: RET ;(书上此处有错),加10子程序:,已知8位二进制数在R0中,要求将其转换为BCD码并存放在片内30H、31H单元中。,分析:8位二进制数转换成3位BCD码数,用压缩BCD码存放,百位数放31H单元,十位、个位数放30H单元。,例4.10 二进制数转换为BCD码,程序流程图为:,ORG 1000H BTOBCD: MOV A,R0 ;取二进制数 MOV B,#100 DIV AB ;除以100 MOV R1,#31H MOV R1 , A ;百位的BCD码数存31H单元 DEC R1 XCH A ,B ; 二进制数除以100的余数送累加器中 MOV B , #10 DIV AB ; 除以10 SWAP A ADD A ,B ;十位与个位的BCD码进行组合 MOV R1 ,A ;组合的BCD码送30H中 RET,已知片内RAM ADR1开始的单元依次从低位到高位存放有L个字节的无符号数,片外RAM ADR2开始的单元也依次从低位到高位存放有L个字节的无符号数。请编一个加法程序,将他们的和存放在ADR1开始的连续单元中。,2) 算术运算子程序,例4.11 多字节无符号数相加,程序流程框图:,ORG 1000H NSADD: MOV R0,#ADDR1 ;设被加数的地址指针 MOV DPTR ,#ADDR2 ;设加数的地址指针 MOV R2 ,#L ;设循环计数器初值 CLR C LOOP: MOVX A ,DPTR ;取加数 ADDC A , R0 ;两数相加 MOV R0 , A ;存和 INC R0 ;调整被加数地址指针 INC DPTR ;调整加数地址指针 DJNZ R2 , LOOP ;未加完,继续 RET ;返回,已知被乘数和乘数分别为双字节的无符号数,被乘数的高字节和低字节分别存放在R7和R6中,乘数的高字节和低字节分别存放在R5和R4中。要求乘积存放在片内RAM以ADR开始的单元中。 分析:由于只有单字节乘法指令,双字节的乘法需要分作4次乘法运算才能实现。,例4.15 两双字节无符号数相乘,ORG 1000H MUL1: MOV 40H ,#00H ;统计bdH+adL+bcL ;的进位单元清0 MOV 41H ,#00H ;统计adH+bcH+acL ;的进位单元清0 MOV R0 ,#50H ;积的首地址送R0中 MOV A ,R6 ;b送A MOV B ,R4 ;d送B MUL AB ;bd MOV R0 , A ;bdL送50H单元中 MOV R1 , B ;bdH送R1中,MOV A , R7 ; a送A MOV B , R4 ; d送B MUL AB ; ad MOV R2 , A ; adL送R2中 MOV R3 , B ; adH送R3中 MOV A , R6 ; b送A MOV B , R5 ; c送B MUL AB ; bc ADD A , R2 ;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论