




已阅读5页,还剩57页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第 章程序设计 虽然单片机的每 条指令能使计算机完成一种特定的操作 但要完成某一特定的任务还需要将这些指令按工作要求有序组合为一段完整的程序 程序实际上是一系列计算机指令的有序集合 我们把利用计算机的指令系统来合理地编写出解决某个问题的程序的过程 称之为程序设计 4 1简单汇编语言程序设计 编制程序的步骤 1 任务分析 硬件 软件系统分析 2 确定算法和工作步骤 3 程序总体设计和流程图绘制 关于流程图符号 开始 结束 圆角矩形工作任务 矩形判断分支 菱形程序流向 程序连接 开始 结束 4 分配内存 确定程序与数据区存放地址 5 编写源程序 6 调试 修改 最终确定程序 方法技巧 1 模块化设计 按功能分 显示 打印 输入 发送等 2 尽量采用循环及子程序结构 节省内存 汇编语言的规范 汇编语言源程序由以下两种指令构成汇编语句 指令语句 伪指令 指示性语句 汇编语句的格式 标号 操作码操作数 注释数据表示形式 二进制 b 十六进制 h 十进制 d或省略 ascii码 以单引号标识 3 伪指令 控制汇编用的特殊指令 这些指令不属于指令系统 不产生机器代码 4 1 1分支程序 分支程序可根据要求无条件或条件地改变程序执行流向 编写分支程序主要在于正确使用转移指令 分支程序有 单分支结构 双分支结构 多分支结构 散转 分支程序 分支程序可根据要求无条件或条件地改变程序执行流向 编写分支程序主要在于正确使用转移指令 分支程序有 单分支结构 双分支结构 多分支结构 散转 1 比较数的大小 入口条件 两个带符号数分别存在内部ram30h和31h单元中 试比较它们的大小 将较大的数存入32h单元中 x y为正 ov 0 则x yov 1 则x yx y为负 ov 0 则x yov 1 则x y org0100hmova 30h 取初值clrcsubba 31h x yjzdz1 x y jcebbjbov eb1 x y 0 ov 1 x yajmpdz1 x y 0 ov 0 x yebb jbov dz1 x y 0 ov 1 x yeb1 mova 31h x yajmpjs0dz1 mova 30h x yjs0 mov32h aend 例 设变量x以补码形式存放在片内ram30h单元中 变量y与x的关系是 编程根据x的值求y值并放回原单元 2 函数运算 org0000hstart mova 30hjznext x 0 转移anla 80h 保留符号位jzed x 0 转移mova 05h x 0 不转移adda 30hmov30h asjmpednext mov30h 20hed sjmp start movdptr tabmova r7adda r7 r7 2 amovr3 a 暂存r3movca a dptr 取高位地址xcha r3incamovca a dptr 取低位地址movdpl amovdph r3 转移地址送入dptrclrajmp a dptrtab dwp0dwp1 dwpn 例 根据r7的内容 转至对应的分支程序 设r7的内容为0 n 对应的处理程序地址分别为p0 p7 4 3 3循环程序 循环程序一般由 初始化部分循环体部分 处理部分 修改部分 控制部分结束部分其结构一般有两种 先进入处理部分 再控制循环至少执行一次循环体先控制循环 再进入处理部分循环体是否执行 取决于判断结果 开始 设置循环初值 循环处理 循环修改 结束处理 结束 循环结束 n y y n 循环控制的一般方法 循环次数已知利用循环次数控制循环次数未知利用关键字控制利用 逻辑尺 根据 逻辑尺 的内容 进行控制 例 统计数据块的长度 入口条件 内部ram30h开始的存储区有若干个数据 最后一个数据为字符ffh 结果存入40h单元 org0100hmain movr1 30h r1作为地址指针clra 累加器a作为计数器loop cjne r1 0ffh next 与数据ff比较 不等转移sjmpjsh1 找到结束符号 结束循环next inca 计数器加1incr1 指针加lsjmpl00p 循环jshl inca 再加入l个字符mov40h a 存结果end 4 1 3延时程序 1 0 1s延时程序 晶振为12m org0100hmovr2 200loop movr3 250djnzr3 djnzr2 loopret由于采用12m晶振 机器周期为1 s djnz的指令周期为2 整个程序的执行时间为250 200 2 1 s 100000 s 0 1s 2 1s延时程序 晶振为12m org0100hmovr1 10loop1 movr2 200loop movr3 250djnzr3 djnzr2 loopdjnzr1 loop1ret 例 50ms延时子程序 设晶振频率为12mhz 则机器周期为1us del movr7 200 1mcdel1 movr6 123 1mcnop 1mcdjnzr6 2mcdjnzr7 del1 2mcret 2mc 延时时间 t 1 200 1 1 2 123 2 2 50000us 50ms 4 2mcs 51常用子程序 4 2 1代码转换类程序设计4 2 2查表程序设计4 2 3定点数运算子程序4 2 4浮点数运算子程序 子程序问题 子程序设计时注意事项 1 给子程序赋一个名字 实际为入口地址代号 2 要能正确传递参数 入口条件 子程序中要处理的数据如何给予 出口条件 子程序处理结果如何存放 寄存器 存储器 堆栈方式 3 保护与恢复现场 保护现场 压栈指令push恢复现场 弹出指令pop4 子程序可以嵌套 4 2 1代码转换类程序设计 1 单字节十六进制数转换成双字节ascii码 表4 1十六进制数与ascii码之间的关系 入口条件 待转换的单字节十六进制数在寄存器r2中 出口 高四位的ascii码在a中 低四位的ascii码在b中 org0100hmova r2movb a 暂存待转换的单字节十六进制数lcallms1 转换低四位xcha b 存放低四位的ascii码swapa 准备转换高四位lcallms1 转换高四位sjmp ms1 anla 0fh 将累加器的低四位转换成ascii码adda 90hdaaaddca 40hdaaret 将多位十六进制数转换成ascii码 设r0指向十六进制数低位 r2存放字节数 转换后r1指向ascii码高位 htasc mova r0 取十六进制数anla 0fh 取低四位adda 15 偏移修正movca a pc 查表得ascii码mov r1 a 保存incr1mova r0 取十六进制数高四位swapa anla 0f0hadda 06h 偏移修正movca a pc 查表mov r1 a 保存incr0 指向下一单元incr1djnzr2 htascretasctab db30h 31h 32h 33h 34h 35h 36h 37hdb38h 39h 41h 42h 43h 44h 45h 46h 2 ascii码转换成十六进制数 入口条件 待转换的ascii码在r2中 出口 转换后的十六进制数在r3中 org0100hmova r2subba 30hclrcjnbacc 4 m1subba 7m1 movr3 asjmp end 3 十六进制整数转换成单字节 码整数 入口条件 待转换的单字节十六进制整数在r2中 出口 转换后的 码整数 十位和个位 在r5中 百位在r3中 mova r2hbcd movb 100 分离出百位 存放在r3中divabmovr3 amova 10 余数继续分离十位和个位xcha bdivabswapaorla b 将十位和个位拼装成 码movr5 asjmp end 4 双字节十六进制整数转换成双字节 码整数 入口条件 待转换的双字节十六进制整数在r6 r7中 出口 转换后的三字节 码整数在r3 r4 r5中 org0100hhb2 clra 码初始化movr3 amovr4 amovr5 amovr2 10h 转换双字节十六进制整数hb3 mova r7 从高端移出待转换数的一位到cy中rlcamovr7 amova r6rlca movr6 amova r5 码带进位自身相加 相当于乘 addca r5daa 十进制调整movr5 amova r4addca r4daamovr4 amova r3addca r3movr3 a 双字节十六进制数的万位数不超过 不用调整djnzr2 hb3 判断16位处理完 sjmp end 5 双字节 码整数转换成双字节十六进制整数 入口条件 待转换的双字节 码整数在r2 r3中 出口 转换后的双字节十六进制整数仍在r2 r3中 org0100hbh2 mova r3 将低字节转换成十六进制lcallbcd1movr3 amova r2 将高字节转换成十六进制lcallbcd1movb 100 扩大一百倍mulabadda r3 和低字节按十六进制相加movr3 aclra addca bmovr2 asjmp bcd1 movb 10h 分离十位和个位divabmovr4 b 暂存个位movb 10 将十位转换成十六进制mulabadda r4 十六进制加上个位retend 4 2 2查表程序设计 movca a dptrmovca a pc1 查表求ascii码入口条件 r0低四位有一个十六进制数 0 f 出口 将查表找出的相应ascii码并送回r0中 org0100hmova r0anla 0fh 屏蔽高4位adda 03h 查表指令pc值与表格pc值相差3字节movca a pc 查表movr0 a 存结果sjmp asctab db 0 1 2 3 4 5 6 7 db 8 9 a b c d e f 4 2 3定点数运算子程序 1 多字节 码加法入口条件 字节数在r7中 被加数在30h起始单元中 加数在40h起始单元中 出口 和在30h起始单元中 最高位进位在cy中 org0100hmovr7 03hmovr0 30hmovr1 40hmova r7 取字节数至r2中movr2 aadda r0 初始化数据指针 movr0 amova r2adda r1movr1 aclrcbb1 decr0 调整数据指针decr1mova r0addca r1 按字节相加daa 十进制调整mov r0 a 和存回 r0 中djnzr2 bb1 处理完所有字节end 2 多字节 码减法 入口条件 字节数在r7中 被减数在 r0 中 减数在 r1 中 出口 差在 r0 中 最高位借位在cy中 org0100hbcdb lcallmn1 减数 r1 十进制取补lcallbcda 按多字节 码加法处理cplc 将补码加法的进位标志转换成借位标志movf0 clcallmn1 恢复减数 r1 的原始值movc f0 恢复借位标志ret mn1 mova r0 r1 十进制取补子程序入口xcha r1 交换指针xcha r0lcallneg 通过 r0 实现 r1 取补mova r0xcha r1 换回指针xcha r0retbcda mova r7 取字节数至r2中movr2 aadda r0 初始化数据指针movr0 amova r2 adda r1movr1 aclrcbcd1 decr0 调整数据指针decr1mova r0addca r1 按字节相加daa 十进制调整mov r0 a 和存回 r0 中djnzr2 bcd1 处理完所有字节retneg mova r7 bcd码取补子程序deca movr2 amova r0movr3 aneg0 clrcmova 99hsubba r0 按字节十进制取补mov r0 a 存回 r0 中incr0 调整数据指针djnzr2 neg0 处理完 r2 字节mova 9ah 最低字节单独取补subba r0mov r0 amova r3 恢复指针movr0 aret 4 双字节二进制无符号数乘法子程序入口条件 被乘数在r2 r3中 乘数在r6 r7中 出口 乘积在r2 r3 r4 r5中 org0100hmuld mova r3 计算r3乘r7movb r7mulabmovr4 b 暂存部分积movr5 amova r3 计算r3乘r6movb r6mulabadda r4 累加部分积movr4 a clraaddca bmovr3 amova r2 计算r2乘r7movb r7mulabadda r4 累加部分积movr4 amova r3addca bmovr3 aclrarlca xcha r2 计算r2乘r6movb r6mulabadda r3 累加部分积movr3 amova r2addca bmovr2 aret 6 双字节二进制无符号数除法子程序入口条件 被除数在r2 r3 r4 r5中 除数在r6 r7中 出口 ov 0时 双字节商在r2 r3中 ov 1时溢出 org0100hdivd clrc 比较被除数和除数mova r3subba r7mova r2subba r6jcdvd1setbov 溢出ret dvd1 movb 10h 计算双字节商dvd2 clrc 部分商和余数同时左移一位mova r5rlcamovr5 amova r4rlcamovr4 amova r3rlcamovr3 axcha r2rlca xcha r2movf0 c 保存溢出位clrcsubba r7 计算 r2r3 r6r7 movr1 amova r2subba r6anlc f0 结果判断jcdvd3movr2 a 够减 存放新的余数mova r1movr3 aincr5 商的低位置一 dvd3 djnzb dvd2 计算完十六位商 r4r5 mova r4 将商移到r2r3中movr2 amova r5movr3 aclrov 设立成功标志ret 4 2 4浮点数运算子程序 1 浮点数的表示 1 二进制浮点操作数用三个字节表示 第一个字节的最高位为数符 其余七位为阶码 补码形式 第二字节为尾数的高字节 第三字节为尾数的低字节 尾数用双字节纯小数 原码 来表示 当尾数的最高位为 时 便称为规格化浮点数 简称操作数 2 十进制浮点操作数用三个字节表示 第一个字节的最高位为数符 用来表示正负数 0表示正数 1表示负数 其余七位为阶码 二进制补码形式 第二字节为尾数的高字节 第三字节为尾数的低字节 尾数用双字节bcd码纯小数 原码 来表示 当十进制数的绝对值大于 时 阶码就等于整数部分的位数 例如 156 6的阶码是03h 156 6的阶码是83h 当十进制数的绝对值小于1时 阶码就等于80h减去小数点后面零的个数 例如 0 00362的阶码是7eh 0 00362的阶码是0feh 例如 有一个十进制浮点操作数存放在30h 31h 32h中 数值是 0 07315 即 0 7315乘以10的 1次方 则阶码为7fh 若加上数符 30h 0ffh 31h 73h 32h 15h 3 运算精度单次定点运算精度为结果最低位的当量值 单次二进制浮点算术运算的精度优于十万分之三 单次二进制浮点超越函数运算的精度优于万分之一 bcd码浮点数本身的精度比较低 万分之一到千分之一 不宜作为运算的操作数 仅用于输入或输出时的数制转换 不管那种数据格式 随着连续运算的次数增加 精度都会下降 2 浮点数加减法子程序入口条件 被加数在 r0 中 加数在 r1 中 被减数在 r0 中 减数在 r1 中 当f0 0时 程序作浮点数加法运算 当f0 1时 程序作浮点数减法运算 出口 ov 0时 和 差 仍在 r0 中 ov 1时 溢出 org0100hfadd clrf0 设立加法标志sjmpas 计算代数和fsub setbf0 设立减法标志as lcallmvr1 计算代数和 先将 r1 传送到第二工作区movc f0 用加减标志来校正第二操作数的有效符号rrcaxrla r1movc acc 7asn mov1eh c 将第二操作数的有效符号存入位1eh中xrla r0 与第一操作数的符号比较rlcamovf0 c 保存比较结果lcallmvr0 将 r0 传送到第一工作区中lcallas1 在工作寄存器中完成代数运算mov0 incr0 将结果传回到 r0 中的子程序入口incr0 mova r4 传回尾数的低字节mov r0 adecr0mova r3 传回尾数的高字节mov r0 adecr0mova r2 取结果的阶码movc 1fh 取结果的数符movacc 7 c 拼入阶码中mov r0 aclracc 7 不考虑数符clrov 清除溢出标志cjnea 3fh mv01 阶码是否上溢 setbov 设立溢出标志mv01 mova r0 取出带数符的阶码retmvr0 mova r0 将 r0 传送到第一工作区中的子程序movc acc 7 将数符保存在位1fh中mov1fh c movc acc 6 将阶码扩充为 补码movacc 7 cmovr2 a 存放在r2中incr0mova r0 将尾数高字节存放在r3中movr3 aincr0mova r0 将尾数低字节存放在r4中movr4 adecr0 恢复数据指针decr0retmvr1 mova r1 将 r1 传送到第二工作区中的子程序movc acc 7 将数符保存在位1eh中mov1eh cmovc acc 6 将阶码扩充为 补码movacc 7 cmovr5 a 存放在r5中incr1 mova r1 将尾数高字节存放在r6中movr6 aincr1mova r1 将尾数低字节存放在r7中movr7 adecr1 恢复数据指针decr1retas1 mova r6 读取第二操作数尾数高字节orla r7jzas2 第二操作数为零 不必运算mova r3 读取第一操作数尾数高字节orla r4jnzeqmova r6 第一操作数为零 结果以第二操作数为准 movr3 amova r7movr4 amova r5movr2 amovc 1ehmov1fh cas2 reteq mova r2 对阶 比较两个操作数的阶码xrla r5jzas4 阶码相同 对阶结束jbacc 7 eq3 阶符互异mova r2 阶符相同 比较大小clrcsubba r5jceq4eq2 clrc 第二操作数右规一次mova r6 尾数缩小一半 rrcamovr6 amova r7rrcamovr7 aincr5 阶码加一orla r6 尾数为零否 jnz
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论