




已阅读5页,还剩50页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章MCS 51程序设计 4 1汇编语言的格式4 2伪指令4 3顺序程序设计4 4分支程序设计4 5循环程序设计4 6查表程序设计4 7数制转换程序程序设计4 8运算程序设计 4 1汇编语言的格式 1 汇编语言这里介绍MCS 51单片机的汇编语言 2 汇编语言的语句格式一条汇编语言的语句包括四部分内容 标号 操作码 操作数和注释 其格式为 标号 操作码操作数 注释例如 LOOP MOVA 20H A 20H 汇编语言格式 地址机器码源程序注释ORG0000H 整个程序起始地址0000200030LJMPMAIN 跳向主程序ORG0030H 主程序起始地址0030C3MAIN CLRC MAIN为程序标号0031E6LOOP MOVA R0003237ADDCA R1003308INCR00034DAFBDJNZR1 LOOP 相对转移00368003SJMPNEXT00387803MOVR0 03H003A18NEXT DECR0003B80FESJMP HERE SJMPHEREEND 结束标记 标号 标号是语句地址的标志符号 用于引导对该语句的非顺序访问 有关标号的规定为 由1 8个ASCII字符组成 第一个字符必须是字母 其余字符可以是字母 数字或其他特定字符 不能使用已经定义了的符号作为标号 如指令助记符 寄存器符号名称等 后边必须跟冒号 4 2伪操作指令 1 ORG Origin 定义程序的起始地址2 END程序结束标志3 DB DefineByte 定义字节4 DW DefineWord 定义字5 EQU Equate 表达式赋值6 BIT定义位地址 伪指令是汇编程序能够识别并对汇编过程进行某种控制的汇编命令 它不是单片机执行的指令 所以没有对应的可执行目标码 汇编后产生的目标程序中不会再出现伪指令 一 起始地址设定伪指令ORG格式为 ORG表达式该指令的功能是向汇编程序说明下面紧接的程序段或数据段存放的起始地址 表达式通常为16进制地址 也可以是已定义的标号地址 ORG8000HSTART MOVA 30H 此时规定该段程序的机器码从地址8000H单元开始存放 在每一个汇编语言源程序的开始 都要设置一条ORG伪指令来指定该程序在存储器中存放的起始位置 若省略ORG伪指令 则该程序段从0000H单元开始存放 在一个源程序中 可以多次使用ORG伪指令规定不同程序段或数据段存放的起始地址 但要求地址值由小到大依序排列 不允许空间重叠 例 ORG2000H MOVSP 60H MOVR0 2FH MOVR2 0FFH ORG伪指令说明其后面程序的目标代码在存储器中存放的起始地址是2000H 即 存储器地址目标程序 2000H758160 2003H782F 2005H7AFF 二 汇编结束伪指令END格式为 END该指令的功能是结束汇编 汇编程序遇到END伪指令后即结束汇编 处于END之后的程序 汇编程序将不处理 三 字节数据定义伪指令DB 标号 DB字节数据表功能是从标号指定的地址开始 在ROM中定义字节数据 该伪指令将字节数据表中的数据根据从左到右的顺序依次存放在指定的存储单元中 一个数据占一个存储单元 例如 DB howareyou 把字符串中的字符以ASCII码的形式存放在连续的ROM单元中 又如 DB 2 4 6 8 10 18把6个数转换为十六进制表示 FEH FCH FAH 08H 0AH 12H 并连续地存放在6个ROM 该伪指令常用于存放数据表格 如要存放显示用的十六进制的字形码 可以用多条DB指令完成 DB0C0H 0F9H 0A4H 0B0HDB99H 92H 82H 0F8HDB80H 90H 88H 83HDB0C6H 0A1H 86H 84H 四 字数据定义伪指令DW 标号 DW字数据表功能是从标号指定的地址单元开始 在程序存储器中定义字数据 该伪指令将字或字表中的数据根据从左到右的顺序依次存放在指定的存储单元中 应特别注意 16位的二进制数 高8位存放在低地址单元 低8位存放在高地址单元 例如 ORG1400HDATA DW324AH 3CH 汇编后 1400H 32H 1401H 4AH 1402H 00H 1403H 3CH 五 空间定义伪指令DS 标号 DS表达式功能是从标号指定的地址单元开始 在程序存储器中保留由表达式所指定的个数的存储单元作为备用的空间 并都填以零值 例如 ORG3000HBUF DS50 汇编后 从地址3000H开始保留50个存储单元作为备用单元 六 赋值伪指令EQU符号名EQU表达式功能是将表达式的值或特定的某个汇编符号定义为一个指定的符号名 例如 LENEQU10SUMEQU21HBLOCKEQU22HCLRAMOVR7 LENMOVR0 BLOCKLOOP ADDA R0INCR0DJNZR7 LOOPMOVSUM AEND该程序的功能是 把BLOCK单元开始存放的10个无符号数进行求和 并将结果存入SUM单元中 七 位地址符号定义伪指令BIT格式为 符号名BIT位地址表达式功能是将位地址赋给指定的符号名 其中 位地址表达式可以是绝对地址 也可以是符号地址 例如 STBITP1 0将P1 0的位地址赋给符号名ST 在其后的编程中就可以用ST来代替P1 0 伪操作指令例子 MATHEQU03HORG0000HMAIN CLRCLOOP MOVA R0MOVR1 MATH 相当于MOVR1 03HNEXT SJMP ORG1100HDB01H 04H 09H 05H END ROM中地址数据110001110104110209110305 汇编语言程序设计步骤 1 确定方案和计算方法2 了解应用系统的硬件配置 性能指标 3 建立系统数学模型 确定控制算法和操作步骤 4 画程序流程图 确定程序的流向 5 编制源程序1 合理分配存储器单元和了解I O接口地址 2 按功能设计程序 明确各程序之间的相互关系 3 用注释行说明程序 便于阅读和修改调试和修改 4 3顺序程序顺序程序是指无分支 无循环结构的程序 其执行流程是依指令在存储器中的存放顺序进行的 例内部RAM的2AH 2EH单元中存储的数据如图所示 试编写程序实现图示的数据传送结果 方法一 MOVA 2EH 2字节 1个机器周期MOV2EH 2DH 3字节 2个机器周期MOV2DH 2CH 3字节 2个机器周期MOV2CH 2BH 3字节 2个机器周期MOV2BH 00H 3字节 2个机器周期 方法二 CLRA 1字节 1个机器周期XCHA 2BH 2字节 1个机器周期XCHA 2CH 2字节 1个机器周期XCHA 2DH 2字节 1个机器周期XCHA 2EH 2字节 1个机器周期以上两种方法均可以实现所要求的传送任务 方法一使用14个字节的指令代码 执行时间为9个机器周期 方法二仅用了9个字节的代码 执行时间也减少到了5个机器周期 实际应用中应尽量采用指令代码字节数少 执行时间短的高效率程序 即注意程序的优化 Eg 拼字将外部数据存储器3000H和3001H的低4位取出拼成一个字 送到3002H单元中 4 4分支程序 分支结构可以分成单分支 双分支和多分支几种情况 单分支 x y均为8位二进制数 设x存入R0 y存入R1 求解 图4 2 单分支 x y均为8位二进制数 设x存入R0 y存入R1 求解 程序如下 START CJNER0 00H SUL1 R0中的数与00比较不等转移 MOVR1 00H 相等 R1 0 SJMPSUL2 SUL1 JCNEG 两数不等 若 R0 0 则R1 01H SJMPSUL2 NEG MOVR1 0FFH R0 0 则R1 0FFH SUL2 RET 双分支程序例设变量x以补码的形式存放在片内RAM的30H单元 变量y与x的关系是 当x大于0时 y x 当x 0时 y 20H 当x小于0时 y x 5 编制程序 根据x的大小求y并送回原单元 程序段如下 START MOVA 30HJZNEXTANLA 80H 判断符号位JZLPMOVA 05HADDA 30HMOV30H ASJMPLPNEXT MOV30H 20HLP SJMP 三 多分支程序例根据R7的内容转向相应的处理程序 设R7的内容为0 N 对应的处理程序的入口地址分别为PP0 PPN 程序段如下 START MOVDPTR TAB 置分支入口地址表首址MOVA R7 分支转移序号送AADDA R7 分支转移序号乘以2MOVR3 A 暂存于R3MOVCA A DPTR 取高位地址XCHA R3INCAMOVCA A DPTR 取低位地址MOVDPL A 处理程序入口地址低8位送DPLMOVDPH R3 处理程序入口地址高8位送DPHCLRAJMP A DPTRTAB DWPP0DWPP1 DWPPN 4 5循环程序 按某种控制规律重复执行的程序称为循环程序 循环程序有先执行后判断和先判断后执行两种基本结构 循环程序一般由四个主要部分组成 1 初始化部分 为循环程序做准备 如规定循环次数 给各变量和地址指针预置初值 2 处理部分 为反复执行的程序段 是循环程序的实体 也是循环程序的主体 3 循环控制部分 这部分的作用是修改循环变量和控制变量 并判断循环是否结束 直到符合结束条件时 跳出循环为止 4 结束部分 这部分主要是对循环程序的结果进行分析 处理和存放 一 先执行后判断例50ms延时程序 若晶振频率为12MHz 则一个机器周期为1 s 执行一条DJNZ指令需要2个机器周期 即2 s 采用循环计数法实现延时 循环次数可以通过计算获得 并选择先执行后判断的循环结构 程序段如下 DEL MOVR7 200 1 sDEL1 MOVR6 123 1 sNOP 1 sDEL2 DJNZR6 DEL2 2 s 计 2 123 sDJNZR7 DEL1 2 s RET共计 2 123 2 2 200 1 s 即50 001ms 二 先判断后执行例将内部RAM中起始地址为data的数据串传送到外部RAM中起始地址为buffer的存储区域内 直到发现 字符停止传送 由于循环次数事先不知道 但循环条件可以测试到 所以 采用先判断后执行的结构比较适宜 程序段如下 MOVR0 dataMOVDPTR bufferLOOP0 MOVA R0CJNEA 24H LOOP1 判断是否为 字符SJMPLOOP2 是 字符 转结束LOOP1 MOVX DPTR A 不是 字符 执行传送INCR0INCDPTRSJMPLOOP0 传送下一数据LOOP2 例题 工作单元清零 在应用系统程序设计时 有时经常需要将存储器中各部分地址单元作为工作单元 存放程序执行的中间值或执行结果 工作单元清零工作常常放在程序的初始化部分中 设有50个工作单元 其首址为外部存储器8000H单元 则其工作单元清零程序如下 CLEAR CLRA MOVDPTR 8000H 工作单元首址送指针 MOVR2 50 置循环次数 CLEAR1 MOVX DPTR A INCDPTR 修改指针 DJNZR2 CLEAR1 控制循环 RET 例题 设在内部RAM的BLOCK单元开始处有长度为LEN个的无符号数据块 试编一个求和程序 并将和存入内部RAM的SUM单元 设和不超过8位 BLOCKEQU20H LENEQU30H SUMEQU40H START CLRA 清累加器A MOVR2 LEN 数据块长度送R2 MOVR1 BLOCK 数据块首址送R1 LOOP ADDA R1 循环加法 INCR1 修改地址指针 DJNZR2 LOOP 修改计数器并判断 MOVSUM A 存和 RET 多重循环 例710秒延时程序 延时程序与MCS 51执行指令的时间有关 如果使用6MHz晶振 一个机器周期为2 s 计算出一条指令以至一个循环所需要的执行时间 给出相应的循环次数 便能达到延时的目的 10秒延时程序如下 DELAY MOVR5 100 DEL0 MOVR6 200 DEL1 MOVR7 248 DEL2 DJNZR7 DEL2 DJNZR6 DEL1 DJNZR5 DEL0 RET 从内部RAM22h单元开始存有一个无符号数数据块 长度n存于21h中 求出数据块中的最小数 存于20h中 ORG0030HMOVR0 22H 数据块起始地址MOVR1 21H 数据个数nMOV20H 0FFH 最大数LOOP MOVA R0 取新数INCR0 为取下一个新数作准备CJNEA 20H LOOP1 与原最大数比较LOOP1 JNCNEXT 大 原最小数保留MOV20H A 小 改变最小数NEXT DJNZR1 LOOP 循环END 上例程序中采用了多重循环程序 即在一个循环体中又包含了其它的循环程序 这种方式是实现延时程序的常用方法 使用多重循环时 必须注意 1 循环嵌套 必须层次分明 不允许产生内外层循环交叉 2 外循环可以一层层向内循环进入 结束时由里往外一层层退出 3 内循环可以直接转入外循环 实现一个循环由多个条件控制的循环结构方式 4 6查表程序设计 1 用DPTR查表 查0 9平方表 1000C083TA PUSHDPH1002C082PUSHDPL1004902000MOVDPTR TAB100793MOVCA A DPTR1008D082POPDPL100AD083POPDPH100C22RETORG2000HTAB DB00H 01H 04H 09H200000200101200204200309 2 用PC查表 查0 9平方表 ORG1000H1000C083TA ADDA 01H 01H为偏移量100283MOVCA A PC100322RET100400DB00H 01H 04H 09H100501END100604100709偏移量 表首地址 查表指令下一条指令地址 1004H 1003H 01H 4 7数制转换程序设计 例 8位二进制转换成BCD码 用十进制表达的二进制码 程序名 BINBCD1 功能 0 FFH内的二进制数转换为BCD数 入口 A存要转换的二进制数 出口 R0存放BCD数百 十 个位数的地址BINBCD1 MOVB 100DIVABMOV R0 AINCR0MOVA 10XCHA B A 原 B B 10DIVABMOV R0 AINCR0XCHABMOV R0 ARET BCD码与二进制数的转换 图4 6BCD码 十进制 转换成二进制数程序流程图 程序清单如下 MAIN MOVA R MOVR2 A 给子程序入口参数ACALLBCDBIN 调用子程序MOVB 64HMULABMOVR6 AXCHA BMOVR AMOVA R4MOVR2 AACALLBCDBIN 调用子程序ADDA R6MOVR4 AMOVA R ADDCA 00HMOVR ARET 子程序如下 BCDBIN MOVA R2ANLA 0F0H 取高位BCD码 屏蔽低4位SWAPAMOVB 0AHMULABMOVR AMOVA R2ANLA 0FHADDA R3 加低位BCD码MOVR2 ARET ASCII码与二进制数的互相转换 例 编程实现十六进制数表示的ASC1I代码转换成4位二进制数 1位十六进制数 解 对于这种转换 只要注意到下述关系便不难编写出转换程序 字符0 字符9 的ASCII码值为 30H 39H 它们与30H之差恰好为 00H 09H 结果均 0AH 字符A 字符F 的ASCII码值为 41H 46H 它们各自减去37H后恰好为 0AH 0FH 结果 0AH 根据这个关系可以编出转换程序如下 程序以R1作为入口和出口 ASCHIN MOVA R1 取操作数CLRC 清进位标志位CSUBBA 30H ASCII码减去30H 实现0 9的转换MOVR1 A 暂存结果SUBBA 0AH 结果是否 9 JCLOOP 若 9则转换正确XCHA R1SUBBA 07H 若 9则减37HMOVR1 ALOOP RET HEX ASCII 4 8运算程序 一 多字节数加法 1 多字节无符号数加法 CLRCMOVR0 40H 指向加数最低位MOVR1 5OH 指向另一加数最低位MOVR2 04H 字节数作计数初值LOOP1 MOVA R0 取被加数ADDCA R1 两数相加 带进位MOV R0 AINCR0 修改地址INCR1DJNZR2 LOOPl 未加完转LOOP1JNCLOOP2 无进位转LOOP2MOV R0 01HLOOP2 DECR0RET 二 多字节数减法 MOVR0 40H 指向被减数最低位MOVR1 5OH 指向减数最低位MOVR2 04H 字节数CLRCLOOP1 MOVA R0SUBBA R1 完成一个字节的减法运算MOV R0 AINCR0INCR1DJNZR2 LOOP1RET 三 多字节十进制数 BCD码 加法 图4 4BCD码多字节加法程序流程图 BCDADD MOV20H R0MOV23H R CLRCLOOP0 MOVA R0 取被加数ADDCA R1 两数相加DAA 十进制调整MOV R0 AINCR0 指针加1INCR1DJNZR LOOP0 作完加法否MOVR2 23HJNCRETURN 有无进位 MOV R0 01HINCR RETURN MOVR0 20HRET 四 多字节数乘法 ZHENFA MOVA R0MOVB R1MULAB R1 R0 MOVR A 积的低位送到R MOVR4 B 积的高位送到R4MOVA R0MOVB R2MULAB R2 R0 ADDA R4 R1 R0 的高位加 R2 R0 的低位MOVR4 A 结果送R4 进位在CY中MOVA BADDCA OOH R2 R0 的高位加低位来的进位MOVR A 结果送R RET 五 多字节数除法 DV MOVR7 08H 设计数初值DVl CLRCMOVA R RLCAMOVR AMOVA R6RLCA 将 R6 R 左移一位MOV07H C 将移出的一位送07H位保存CLRC SUBBA R2 余数 高位 减除数JBO7H GOU 若标志位为1 说明够减 JNCGOU 无借位也说明够减ADDA R2 否则 恢复余数AJMPDV2GOU INCR 商上1DV2 MOVR6 A 保存余数 高位 DJNZR7 DVlRET 4 9I O端口控制程序 例 试编出能模拟图 b 电路的程序 ORG0200HDBIT00HEBIT01HGBIT02HLOOP1 ORLP1 08H 准备P1 3输入LOOP2 MOVC P1 3 检测K3状态JCLOOP2 若未准备好 K3断 则LOOP2ORLP1 03H 若准备好 则准备输入P1 0和P1 1状态MOVC P1 0 输入K0状态MOVD C 送入D MOVC P1 1 输入K1状态MOVE C 送入EANLC D D E送CMOVG C 送入GMOVC EORLC D D E送CANLC G D E D E MOVP1 2 C 输出结果SJMPLOOP1 准备下次模拟END 4 10子程序调用时的参数传递方法 一 通过寄存器或片内RAM传递参数 例 利用通过寄存器或片内RAM传递参数这种方法编出调用SUBRT子程序的主程序 解 应该是 MAIN MOVR0 30H 传送RAM数据区的起
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- JJF 2248-2025液体容积式流量计型式评价大纲
- 售楼处物业管理制度
- 国际核安全管理制度
- 土地网格化管理制度
- 地方公路处管理制度
- 培训班应急管理制度
- 培训课时费管理制度
- 基酒出入库管理制度
- 增塑剂车间管理制度
- 备件申购及管理制度
- 2025年继续教育公需科目试题及答案
- 公司收购公司部分股权之可行性研究报告
- 曲靖一中2025届高考决胜全真模拟卷(二)化学试题及答案
- 2025-2030中国环戊醇行业市场深度分析及发展趋势与投资战略研究报告
- 高血压RDN介入治疗新进展
- 办公大楼光储充建设方案
- 山东建筑大学《模拟电路与数字电路》2023-2024学年第二学期期末试卷
- 2025写字楼租赁定金合同的范本
- 浙江省杭州市北斗联盟2024-2025学年高一下学期4月期中联考地理试卷(含答案)
- 2025年贵州六盘水市燃气集团六盘水燃气有限公司招聘笔试参考题库含答案解析
- 妊娠期子宫蜕膜息肉诊治中国专家共识(2024年版)解读课件
评论
0/150
提交评论