机械设计.ppt_第1页
机械设计.ppt_第2页
机械设计.ppt_第3页
机械设计.ppt_第4页
机械设计.ppt_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

第4章 mcs-51汇编语言程序设计,4.1 汇编语言程序设计概述 4.1.1 机器语言、汇编语言和高级语言 用于程序设计的语言基本上分为3种:机器语言、汇编语言和高级语言。 1.机器语言 二进制代码表示的指令、数字和符号简称为机器语言 不易懂,难记忆,易出错。,2汇编语言 英文助记符表示的指令称为符号语言或汇编语言 汇编语言特点: 面向机器的语言,程序设计员须对mcs-51的硬件有相当深入的了解。 助记符指令和机器指令一一对应,用汇编语言编写的程序效率高,占用存储空间小,运行速度快,用汇编语言能编写出最优化的程序。,能直接管理和控制硬件设备(功能部件),它能处理中断,也能直接访问存储器及i/o接口电路。 汇编语言和机器语言都脱离不开具体机器的硬件,均是面向“机器”的语言,缺乏通用性。 3高级语言 不受具体机器的限制,使用了许多数学公式和数学计算上的习惯用语,非常擅长于科学计算。常用的如basic、fortran以及c语言等。 高级语言优点:通用性强,直观、易懂、易学,可读性好。 使用c语言(c51)、pl/m语言来进行mcs-51的应用程序设计。 对于程序的空间和时间要求很高的场合,汇编语言仍是必不可缺的。,c语言和汇编语言混合编程 在很多需要直接控制硬件的应用场合,则更是非用汇编语言不可 使用汇编语言编程,是单片机程序设计的基本功之一 4.1.2 汇编语言语句的种类和格式 两种基本类型:指令语句和伪指令语句 (1)指令语句 已在第3章介绍 每一条指令语句在汇编时都产生一个指令代码机器代码 (2)伪指令语句 是为汇编服务的。在汇编时没有机器代码与之对应。,mcs-51的汇编语言的四分段格式如下: 标号字段 操作码字段 操作数字段 注释字段 例4-1 下面是一段汇编语言程序的四分段书写格式 基本语法规则: 1标号字段 是语句所在地址的标志符号 标号字段 操作码字段 操作数字段 注释字段 start: mov a,#00h ;0a mov r1,#10 ;10r1 mov r2,#00000011b ;3r2 loop:add a,r2 ;(a)+(r2)a djnz r1,loop;r1内容减1不 为零,则循环 nop here: sjmp here,2美元符号$的使用 用于表示该转移指令操作码所在的地址。例如,如下指令: jnb f0, $ 与如下指令是等价的: here:jnb f0,here 再如: here:sjmp here 可写为: sjmp $,4.2 汇编语言源程序的汇编 汇编语言源程序 “翻译”成机器代码(指令代码)的过程称为“汇编”。汇编可分为手工汇编和机器汇编两类: 4.2.1 手工汇编 人工查表翻译指令。但遇到的相对转移指令的偏移量的计算,要根据转移的目标地址计算偏移量,不但麻烦,且容易出错。 4.2.2 机器汇编 用编辑软件进行源程序的编辑。编辑完成后,生成一个ascii码文件,扩展名为“.asm”。然后在微计算机上运行汇编程序,把汇编语言源程序翻译成机器代码。,4.3 汇编语言实用程序设计 4.3.3 查表程序设计 数据补偿、修正、计算、转换等各种功能,具有程序简单、执行速度快等优点。 查表就是根据自变量x,在表格中寻找y,使y=f(x)。 执行查表指令时,发出读程序存储器选通脉冲/psen。在mcs-51的指令系统中,给用户提供了两条极为有用的查表指令: movc a,a+dptr movc a,a+pc 指令“movc a,a+dptr”完成把a中的内容作为一个无符号数与dptr中的内容相加,所得结果为某一程序,。 指令执行完,pc的内容不发生变化,仍指向查表指令的下一条指令。 优点在于预处理较少且不影响其它特殊功能寄存器的值,所以不必保护其它特殊功能寄存器的原先值。 缺点在于该表格只能存放在这条指令的地址x3x2x1x0以下的00ffh之中。表格所在的程序空间受到了限制。,例4-1 子程序的功能为:根据累加器a中的数x(09之间)查x的平方表y,根据x的值查出相应的平方y。x和y均为单字节数。 地 址 子程序 y3y2y1y0 add a,#01h y3y2y1y0+2 movc a,a+pc y3y2y1y0+3 ret y3y2y1y0+4 db 00h,01h,04h,09h,10h db 19h,24h,31h,40h,51h 第1条指令 add a,#01h 的作用是加上偏移量,可以根据a的内容查出x对应的平方。,movc a,a+dptr 这条指令的应用范围较为广泛,一般情况下,大多使用该指令,使用该指令时不必计算偏移量,使用该指令的优点是表格可以设在64k程序存储器空间内的任何地方,而不像 movc a,a+pc那样只设在pc下面的256个单元中,使用较方便。 上面的程序可改成如下形式:,push dph ;保存dph push dpl ;保存dpl mov dptr,#tab1 movc a,a+dptr pop dpl ;恢复dpl pop dph ;恢复dph ret tab1: db 00h,01h,04h,09h,10h db 19h,24h,31h,40h,51h 例4-2 在一个以mcs-51为核心的温度控制器中,温度传感器输出的电压与温度为非线性关系,传感器输出的电压已由a/d转换为10位二进制数。根据测得的不同温度下的电压值数据构成一个表,表中放温度,值y,x为电压值数据。设测得的电压值x放入r2r3中,根据电压值x,查找对应的温度值y,仍放入r2r3中。本例的x和y均为双字节无符号数。程序如下: ltb2:mov dptr,#tab2 mov a,r3 clr c rlc a mov r3,a xch a,r2 rlc a xch r2,a add a,dpl ;(r2r3)+(dptr) (dptr),mov dpl,a mov a,dph addc a,r2 mov dph,a clr a movc a,a+dptr ;查第一字节 mov r2,a ;第一字节存入r2中 clr a inc dptr movc a,a+dptr ;查第二字节 mov r3,a ;第二字节存入r3中 ret tab2:dw ;温度值表,例4-3 设有一个巡回检测报警装置,需对16路输入进行检测,每路有一最大允许值,为双字节数。运行时,需根据测量的路数,找出每路的最大允许值。看输入值是否大于最大允许值,如大于就报警。根据上述要求,编一个查表程序。 取路数为x(0x15),y为最大允许值,放在表格中。设进入查表程序前,路数x已放于r2中,查表后最大值y放于r3r4中。本例中的x为单字节数,y为双字节数。查表程序如下: tb3: mov a,r2 add a,r2 ;(r2)*2(a) mov r3,a ;保存指针 add a,#6 ;加偏移量,movc a,a+pc ;查第一字节 xch a,r3 add a,#3 movc a,a+pc ;查第二字节 mov r4,a ret tab3: dw 1520,3721,42645,7580 ;最大值 ;表 dw 3483,32657,883,9943 dw 10000,40511,6758,8931 dw 4468,5871,13284,27808,表格长度不能超过256个字节,且表格只能存放于movc a,a+pc指令以下的256个单元中。 查表指令(movc a,a+pc 、 movc a,a+dptr)的区别 1)movc a,a+pc表格长度不能超过256个字节,且表格只能存放于movc a,a+pc指令以下的256个单元中。 movc a,a+dptr表格可以设在64k程序存储器空间内的任何地方 2) movc a,a+pc pc是执行完本条指令后,指向下一条指令的 地址,需加上偏移量 movc a,a+dptr 不需要加偏移量。,3)根据表中指令的字节数不同,a分别乘以1、2或3,从表中取指令时,也要分1、2或3次进行。,单字节指令 a=a1,双字节指令 a=a2,基址+0,基址+1,基址+2,(a)=0对应的一条指令,(a)=1对应的一条指令,三字节指令 a=a3,基址+3,基址+4,基址+5,4.3.5 数据极值查找程序设计 在指定的数据区中找出最大值(或最小值)。 进行数值大小的比较,从这批数据中找出最大值(或最小值)并存于某一单元中。 例4-9 已知内部ram addr为起始的数据块内数据是无符号数,块长在len单元内,找出数据块中最大值并存入max单元。 程序如下:,org 2000h len data 20h max data 22h mov max,#00h ; max单元清零 mov r0,#addr ; addr送r0 loop: mov a,r0 ; 数块中某数送a cjne a,max,next1 ; a和(max)比较 next1: jc next ;若a(max),则next mov max,a ;若a(max),则大数送max next: inc r0 ;修改数据块指针0 djnz len,loop ;若未完,则转loop here: sjmp here end,4.3.6 数据排序程序设计 升序排,降序排。仅介绍无符号数据升序排。 冒泡法:相邻数互换的排序方法,类似水中气泡上浮 。排序时从前向后进行相邻两个数的比较,次序与要求的顺序不符时,就将两个数互换;顺序符合要求不互换。 假设有7个原始数据的排列顺序为:6、4、1、2、5、7、3。第一次冒泡的过程是: 6、4、1、2、5、7、3 ;原始数据的排列 4、6、1、2、5、7、3 ;逆序,互换 4、1、6、2、5、7、3 ;逆序,互换 4、1、2、6、5、7、3 ;逆序,互换 4、1、2、5、6、7、3 ;逆序,互换,4、1、2、5、6、7、3 ;正序,不互换 4、1、2、5、6、3、7 ;逆序,互换,第一次冒 泡结束 如此进行,各次冒泡的结果如下: 第1次冒泡结果:4、1、2、5、6、3、7 第2次冒泡结果:1、2、4、5、3、6、7 第3次冒泡结果:1、2、4、3、5、6、7 第4次冒泡结果:1、2、3、4、5、6、7 ;已完成排序 第5次冒泡结果:1、2、3、4、5、6、7 第6次冒泡结果:1、2、3、4、5、6、7 对于n个数,理论上应进行(n-1)次冒泡,有时不到(n-1)次就已完成排序 。,如何判定排序是否已完成,看各次冒泡中是否有互换发生,如果有数据互换,则排序还没完成。 在程序设计中,常使用设置互换标志的方法,该标志的状态表示在一次冒泡中是否有互换进行。 例4-10 假设8个数连续存放在20h为首地址的内部ram单元中,使冒泡法进行升序排序编程。设r7为比较次数计数器,初值为07h。tr0为冒泡过程中是否有数据互换的状态标志,tr0=0表示无互换发生,tr=1表明有互换发生。按前述冒泡序算法,程序如下:,sort: mov r0,#20h ;数据存储区首单元地址 mov r7,#07h ;各次冒泡比较次数 clr tr0 ;互换标志清“0” loop: mov a,r0 ;取前数 mov 2bh,a ;存前数 inc r0 mov 2ah,r0 ;取后数 clr c subb a,r0 ;前数减后数 jc next ;前数小于后数,不互换 mov r0, 2bh dec r0 mov r0,2ah ;两个数交换位置 inc r0 ;准备下一次比较 setb tr0 ;置互换标志 next: djnz r7,loop ;返回,进行下一次比较 jb tr0,sort ;返回,进行下一次冒泡 here: sjmp here ;排序结束,4.3.7 散转移程序设计 一、使用转移指令的散转程序 jmp a+dptr 需根据某一单元的内容是0,1,n,来分别转向处理程序0,处理程序1,处理程序n。 一个典型的例子就是当单片机系统中的键盘按下时,就会得到一个键值,根据不同的键值,跳向不同的键处理程序入口。 对于这种情况,可用直接转移指令(ljmp或ajmp指令)组成一个转移表,利用间接转移指令实现分支转移,例4-12 根据寄存器r2的内容,转向各个处理程序prgx(x=0n)。 (r2)=0,转prg0 (r2)=1,转prg1 (r2)=n, 转prgn,jmp1: mov dptr,#tbj1 mov a,r2 add a,r2 ; (r2)*2 (a) jnc nadd inc dph ; (r2)*2 256 nadd: jmp a+dptr tbj1: ajmp prg0 ajmp prg1 ajmp prgn,二、使用地址偏移量的散转程序 例 按r2的内容转向6个处理程序 jmp3: mov a,r2 mov dptr,#tbj3 movc a,a+dptr ;从表中读取变址 jmp a+dptr tbj3:db prg0-tbj3 db prg1-tbj3 . db prg5-tbj3 prg0:处理程序0 prg1:处理程序1 prg2:处理程序2 prg3:处理程序3 prg4:处理程序4 prg5:处理程序5,4.3.8 循环程序设计 计数循环结构 djnz rn,rel;工作寄存器作控制计数器 1、单循环定时程序 例 mov r5,#time loop:nop 1t nop 1t djnz r5,loop 2t 循环体为4t,若晶振为6mhz,则t=12/fosc=2s 一次循环延迟时间:4*t=8s 程序的延迟时间:8*time(s) 该程序最大延迟时间:256*8=2048 (s),2,多重循环定时 例4-16 50ms延时程序。 延时程序与mcs-51指令执行时间有很大的关系。在使用12mhz晶振时,一个机器周期为1s,执行一条djnz指令的时间为2s。这时,可用双重循环方法写出下面如下的延时50ms的程序: del: mov r7,#200 del1: mov r6,#125 del2: djnz r6,del2 ;125*2=250s djnz r7,del1 ;0.25ms*200=50ms ret,以上延时程序不太精确,它没有考虑到除“djnz r6,del2 ”指令外的其它指令的执行时间,如把其它指令的执行时间计算在内,它的延时时间为: del: mov r7,#200 1t del1: mov r6,#125 1t del2: djnz r6,del2 ;125*2=250s 2t djnz r7,del1 2t (250+1+2)*200+1=50.301ms 如果要求比较精确的延时,可按如下修改: del: mov r7,#200 1t del1: mov r6,#123 1t nop 1t del2: djnz r6,del2 ; 123*2t djnz r7,del1 ; (1+1+123*2+2)*200+1=50001t=500001s=50.001ms 实际延迟时间为50.001ms,注意。软件延时程序,不允许有中断,否则将严重影响定时的准确性。,采用增减指令对定时程序进行微调 mov r0, #time 1t loop:add a,r1 1t inc dptr 2t djnz r0,loop 2t 在6mhz晶振下,机器周期t=12/fosc=2s 定时时间为:5*2*time(s) 假设定时时间要求为24s,可以调整循环体的机器周期。,mov r0, #time 1t loop:add a,r1 1t inc dptr 2t nop 1t djnz r0,loop 2t 使time=2 定时时间=6*2s*2=24s,4.3.8 定点数运算程序设计,1、定点数的表示法 1)原码:符号位=0 正数 符号位=1 负数 加减运算时,必须按符号位的不同执行不同的运算。 正数:n补=n原 2)补码: n补=数值位取反+1 负数: =2n-数值 n是整数的位数 补码可直接带符号位进行运算,用ov位表示溢出与否,补码表示法的优点是加减运算方便: (83)10+(-4)10=(01010011)2+(11111100)2 =(01001111)2=(79)10 补码表示的数在执行乘除运算时,先转换成原码,在执行原码乘除,最后把积转换成补码,例 双字节数取补子程序 (r4r5)取补(r4r5) cmpt: mov a, r5 cpl a add a, #1 mov r5,a mov a,r4 cpl a addc a,#0 mov r4, a ret,2.带符号数的移位 带符号数进行算数移位时,必须保持最高位不变。 (1)正数:左移右移都移入0 (2)负数:原码表示:符号位不变,左移右移 都移入0 补码表示:符号位不变,右移移入 1,左移移入0 例 双字节原码左移一位子程序。 (r2r3)左移一位(r2r3),mov a, r3 clr c ; 保证让左移移入0 rlc a mov r3,a mov a,r2 rlc a mov a.7,c ;恢复符号位 mov r2, a,r2,r3,c,0,符号位不变,例 双字节原码右移一位子程序 (r2r3)右移一位( r2r3) 0 mov a,r2 mov c,a.7 ;保护符号位 clr a.7 ;移入0 rrc a mov r2,a mov a,r3 rrc a mov r3,a,r2,r3,c,c,符号位不变,a(r2),c,符号位,0,例 双字节补码右移一位子程序 功能(r2r3)右移一位(r2r3) mov a, r2 mov c, a.7 ;保护符号位 rrc a ;移入符号位 mov r2, a mov a, r3 rrc a mov r3,a,r2,r3,c,符号位不变,1,c,a(r2),c,符号位,1,三、定点数加减运算 原码的加减运算需根据符号位和不同的运算进行分类操作。补码加减运算非常方便,一般采用补码进行加减运算。 例 双字节补码加法子程序 (r2r3)+(r6r7) (r4r5),mov a ,r3 add a, r7 mov r5, a mov a, r2 addc a ,r6 mov r4,a,四、定点数乘法运算 1)无符号数二进制乘法 a=1011 b=1001 1011 1001 1011 0000 0000 + 1011 1100011 乘积a*b,乘数左移与部分积相加部分积右移+被乘数。,算法: 从低位开始检查各个乘数的位数(乘数右移) 若乘数位数为1,部分积右移+被乘数部分积。 若乘数位数为0,部分积右移部分积。,2)mcs-51快速乘法 把mcs51的单字节运算扩展为双字节的乘法 计算原理 r2 r3 r6 r7 r3r7h r3r7l r2r7h r2r7l r3r6h r3r6l r2r6h r2r6l r4 r5 r6 r7,例 无符号双字节快速乘法 (r2r3)*(r6r7)(r4r5r6r7) mov a, r3 mov b, r7 mul ab ; r3r7 ba xch a, r7 r7= r3r7l mov r5,b ; b=r5= r3r7h mov b,r2 mul ab r2r7 ba add a,r5 a=r2r7l+r3r7h mov r4,a r4=r2r7l+r3r7h clr a addc a,b mov r5,a ; (r5)=r2r7h ,4.3.9 码制转换程序设计 在单片机应用程序的设计中,经常涉及到各种码制的转换问题。在单片机系统内部经常采用二进制码。在输入/输出中,按照人的习惯均采用代表十进制数的bcd码表示。此外,打印机要打印某数字字符,则需要将该数字的二进制码转换为该字符的ascii码。 转换类型包括:二进制码与ascii码之间的转换 二进制与bcd码之间的转换 一、二进制码与ascii码之间的转换 由ascii码字符表可知,09的ascii码为30h39h,af的ascii码为41h46h,例 r0的低4位是一个二进制数,表示(0f) ,把它数码转换为ascii代码并存入r0 说明:二进制+30h=其ascii代码 二进制 9; 二进制+40h=其ascii代码 二进制 9;,三种方法: 1)若r0 9 r0+30hr0; 若r0 9 r0+37hr0,2 )利用daa指令,3)查表,方法一:,org 0400h mov a,r0 ;取转换值送a anl a,#0fh ;屏蔽高四位 add a,#90h ;a中内容+90h da a ; 十进制调整 addc a,#40h ;a中内容+40h da a ; 十进制调整 mov r0,a ;存转换结果 sjmp $ ;结束 end,方法二:利用da a指令,方法三 :查表 org 0400h mov a, r0 anl a,#0fh ;屏蔽高4位 add a,#03h ;地址调整 movc a,a+pc ;查表 mov r0,a ;存结果 sjmp,$ asctab: db 0, 1,2,3,4 db 5, 6,7,8,9 db a, b,c,d,e,f end,多位十六进制数转换成ascii码 思路:,低四位转换成ascii 高四位转换成ascii,循环体完成一个字节十六进制数的转换,字节-1不为0转移,结束,例 多位十六进制数转换为ascii码 入口: (r0)=十六进制数低位地址指针 (r2)=字节数 出口: (r1)=ascii码地址指针,二、二进制码到bcd码的转换 二进制,1111001b=121d,bcd码(一个字节表示一个bcd码),00000001,00000010,1,2,00000001,1,压缩bcd码(一个字节表示2个bcd码),方法一:通过除以1000、100、10等10的次幂,获得千、百、十位数,例 8位二进制数转换成bcd数 (a)为二进制数,r0为十位数和个位数地址指针(压缩的bcd码) mov b,#100 div ab ;(a)=百位数 mov r0,a ; 存入ram inc r0; mov a, #10 xch a, b div a, b ; (a)=十位数,(b)=个位数 swap a add a,b ; 合成到(a) mov r0, a 存入ram,该方法的缺点:被转换数较大时,需进行多字节除法运算,运算速度较慢,程序缺乏通用性,方法二:y=an2n+an-12n-1+an-22n-2+a0 =(an2)+an-1) 2+an-2 ) 2) 2 +a0 (每次相加时进行bcd码调整),例 双字节二进制数转换为bcd数 入口:(r2r3)为双字节16位二进制数 出口:(r4r5r6为转换完的压缩bcd码) y=a727+a626+a525+a0 =(a72)+a6) 2+a5 ) 2) 2 +a0 (每次相加时进行bcd码调整) 计算结果2+ r2r3的次高位计算结果,r2r3,c,二进制位数-1=0?,结束,r4r5r6清零,n,y,y=a727+a626+a525+ a0 =(a72)+a6) 2+a5 ) 2) 2 +a0,da a 调整,例 双字节二进制数转换为bcd数 入口:(r2r3)为双字节16位二进制数 出口:(r4r5r6为转换完的压缩bcd码),r2r3,c,loop:

温馨提示

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

评论

0/150

提交评论