片机程序设计(改).ppt_第1页
片机程序设计(改).ppt_第2页
片机程序设计(改).ppt_第3页
片机程序设计(改).ppt_第4页
片机程序设计(改).ppt_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

1、第三章 MCS-51单片机汇编语言程序设计,3.1 概述 一、二种程序语言 汇编语言:短、快;充分发挥硬件功能。 执行效率高 高级语言(C语言):长、慢;硬件控制麻烦; 编程效率高 单片机能执行的程序是机器语言(目标程序),二、目标程序两种文件格式 用于写入单片机或仿真调试。 BIN文件:二进制文件,机器码。 HEX文件:INTEL公司定义, 地址、数据和校验码 ASCII码存储,可显示、打印 需用符号转换程序OHS51转换 三、两种语言的操作过程:图3-1,连接/定位器 L51,汇编语言 源程序,汇编器A51,符号转换程序OHS51,绝对地址目标程序 .BIN,C语言程序,浮动地址目标程序,

2、编译器C51,HEX,图 3-1 两种语言源程序转换成目标程序,编辑器、汇编器、编译器、连接/定位器、 符号转换程序、. WAVE、KEIL uVision2 WAVE集成软件:P248,五、汇编与汇编程序 汇编语言源程序转换成机器语言目标程序,四、集成开发环境,1、汇编的两方法 手工汇编 人工查指令表,得到程序中每条指令对应的机器代码,人工计算地址。早期使用。 机器汇编 用汇编程序对汇编语言源程序进行汇编。 源程序要提供给一些附加信息,遵循汇编程序的一些约定。用伪指令实现,1)确定程序中每条汇编语言指令的机器码 2)确定每条指令在存储器中的存放地址,3)语法检查,提供错误信息 4)生成目标执

3、行文件(*.OBJ/*.HEX)、 列表文件(*.LST),地址 机器码源程序 ORG 2000H 2000H 78 30 MAIN:MOV R0,#30H 2002H E6 MOV A,R0,2、汇编的主要任务,六、汇编语言程序设计步骤 与书中不太一样,1、确定方案和计算方法 2、了解应用系统的硬件配置、性能指标 3、建立系统数学模型,确定控制算法和操作步骤 4、合理分配存储器单元和了解I/O接口地址,5、编制源程序 1)按功能模块设计程序,明确各程序之间的相互关系 2) 用流程图表示程序结构和功能,3)程序中用注释说明指令在程序中的作用,方便阅读、调试和修改,1. 机器指令:指令系统中的全

4、部指令。每条机器指令都有对应的机器代码,可以被CPU执行。 2. 伪指令: 汇编控制指令,没有机器代码,只用于汇编过程,为汇编程序提供汇编信息。 3、宏指令 定义、调用,一、 汇编语言指令类型,3.2 伪指令,宏调用: 宏指令名 实际参数 宏指令名 实际参数,宏定义: 宏指令名 MACRO 形式参数 ;被定义的程序段 ENDM,二、常用伪指令及功能,1.起始指令 ORG nn 定义程序或数据块的起始地址,连续存放在程序存储器中。 例: 指令地址 机器码源程序 ORG 2000H 2000H 78 30 MAIN:MOV R0,#30H 2002H E6 MOV A,R0,ORG 3000H 3

5、000H 23 TAB: DB 23H,100,A 3001H 64 3002H 41,2.字节定义 标号: DB 表达式, 在程序存储器中以标号为起始地址存放字节数据。 例: LN:DB 32,C,25H,-1,3. 字定义 标号:DW 表达式, 在程序存储器中以标号为起始地址存放字数据。低地址高字节! 例: GH :DW 1234H,5678H,08,5. 等值指令 符号 EQU 表达式 表示EQU两边的量等值,用于为或标识符赋值。例: X1 EQU 2000H X2 EQU 0FH MAIN:MOV DPTR,#X1 ; DPTR=2000H ADD A,#X2 ; A=A+0FH,4保

6、留字节 标号:DS 数值表达式 在程序存储器中保留以标号为起始地址的若干 字节单元,单元数由数值表达式指定。例: L1:DS 32 ; 从L1地址开始保留32个存储单元,6. 位定义 符号 BIT 位地址 类似EQU指令,定义的是位操作数地址。 例:AIC BIT P1.1,7.汇编结束 END 源程序段结束。 汇编程序对END指令后的内容不处理。 A51汇编程序其它伪指令:P50表3-1,3.3顺序程序,顺序程序(简单程序),程序走向只有一条路径,常用程序结构 顺序程序 分支程序 循环程序 子程序,例3-1 外部数据存储器的000EH和000FH单元的内容交换,分析: 只能用MOVX与A间传

7、送; 必须用中间变量(20H)暂存; 低八位地址用R0、R1指示; 高八位地址由P2指示。 程序如下页,ORG 0000H MOV P2, #0H ;送地址高八位至P2口 MOV R0, #0EH ;R0= 0EH MOV R1, #0FH ;R1=0FH MOVX A, R0 ;A=(000EH) MOV 20H, A ;(20H)=(000EH) MOVX A, R1 ;A=(000FH) XCH A, 20H ; A=(000EH),(20H)=(000FH) MOVX R1, A MOV A, 20H MOVX R0, A ;交换后的数送各单元 SJMP $ END,例3-2:将R4R

8、5双字节符号数求补程序,ORG 0000H MOV A,R5 ;取低字节 CPL A ADD A,#1 ;低字节变补 MOV R5,A MOV A,R4 ;取高字节 CPL A ADDC A,#0 ;高字节变补 ORL A, #80H; 恢复负号 MOV R4,A END,加此指令有问题,书P51例3-2为(31)(30H)求补,也有问题,例3-3 片内RAM的20H单元变量值为00H05H,用查表法 其平方值, 存入片内RAM的21H单元,ORG 0000H MOV DPTR,#TAB MOV A,20H MOVC A,A+DPTR ;查表 MOV 21H,A SJMP $ TAB2: DB

9、 00H,01H,04H,09H,16H,25H END,分析 :在程序存储器安排一张平方表,首地址为TAB,以DPTR指向表首址,A存放变量值,利用查表指令MOVC A,A+DPTR,即可求得。 表中数据用BCD码存,若平方值为两字节,程序应如何改? 若用MOVC A,A+PC呢,例(书无): 分解压缩型BCD码为非压缩型式BCD码,ORG 0000H MOV R0,#40H;设指针 MOV A,R0;取一个字节 MOV R2,A;暂存 ANL A,#0FH;清0高半字节 INC R0 ;R0=41H MOV R0,A ;保存数据个位,MOV A,R2 SWAP A ;十位换到低半字节 AN

10、L A,#0FH INC R0 ;R0=42H MOV R0,A;保存数据十位 END,05,06,ORG 0000H MOV A,R2 JNB ACC.7,N ;为正数? CPL A ;负数求补 INC A MOV R2,A N: SJMP $ ;结束,3.4 分支程序由条件转移指令构成程序判断框部分,形成分支结构,3.4.1 单分支程序 一个条件判断,有两种分支结构,例1 求8位有符号数的绝对值。 方法:正数不变,负数求补,例2 根据行李重量计算行李运费,以10kg为1个计价单位G , G在40H单元中。计价方法:为50kg以内按3元; 50kg以上部分按2元计价。 由此列出算式,G3 ;

11、当G5,3G因重复使用,先暂存在R2。流程见左, 程序如下页,ORG 0100H FRT: MOV A,40H;取行李重量计价单位G MOV R3,A MOV B,#03H;运费M=G3 MUL AB MOV R2,A;暂存3G,MOV A,R3;取回G CJNE A,#05H,L1;G 5 ? SJMP WETC L1: JC WETC;是,转至WETC SUBB A,#05H;否则 M=3G+2(G-5) RLC A ADD A,R2 MOV R2 ,A WETC:MOV 41H,R2 ;存运费 M RET,3.4.2多分支散转程序 根据多种输入条件或多种运算结果,转向不同的处理程序。 通

12、常用JMP A+DPTR间接转移指令实现。 有两种设计方法: 1. 查转移地址表: 将转移地址列成表格,将表格的内容作转移的目标地址。 2. 查转移指令表: 将转移到不同程序的转移指令列成表格,判断条件后查表,转到表中指令执行。 程序例子见下页,1. 利用转移地址表实现转移 例3-7 根据R3的内容转向对应的程序,R3=0n, 处理程序入口符号地址为PR0PRn (n128)。 分析:PR0PRn列成表格,每一项占两个单元; PRn在表中的偏移量为2n,R3乘2得偏移地址; (2n)、(2n+1)为高/低八位地址,送DPTR; 用JMP A+DPTR(A先清零)即转移到PRn入口,PR0 EQ

13、U 0110H ;用伪指令定义PRn的具体地址 PR1 EQU 0220H PR2 EQU 0330H,MOV A,R3 ;R3A ADD A,ACC ;A*2 MOV DPTR,#TAB PUSH ACC MOVC A,A+DPTR ;取地址表中高字节 MOV B,A ;暂存于B INC DPL ;有问题! POP ACC MOVC A,A+DPTR ;取地址表中低字节 MOV DPL,A MOV DPH,B ;DPTR为表中地址 CLR A ;A=0 JMP A+DPTR ;转移 TAB:DW PR0,PR1,PR2,.,PRn ;转移地址表,TAB,TAB+2,DPH DPL,例 R3=

14、1的操作,02,20,2. 利用转移指令表实现转移 例3-8 设有五个按键编码分别为3AH、47H、65H、70H、8BH,已存于B中,要据此键转向不同的处理程序,分别为PR0 、PR1 、PR2、PR3、PR4,分析: 键码列表(一字节),AJMP指令列表(二字节); B与键码表逐项相比,得序号,乘2得AJMP表的偏移地址; 用JMP A+DPTR转向AJMP指令,从而实现多分支转移,设JPT的地址为001AH、PR0入口地址为0110H ,P39:2.4.2节, 求AJMP PR0的机器码: 001A=0000 0000 0001 1010 0110=0000 0001 0001 0000

15、 0010 0001 0001 0000 (2110h,a10a9a8a7a6a5a4a3a2a1a0,程序中不必写机器码,PR0入口地址为0100H,AJMP PR0的机器码为2110H, PR1 ,AJMP PR1 0220H, PR2入口地址为0220H,AJMP PR2的机器码为4120H。 设B=65H,键值为2,转移指令表JPT,键码表TAB,65H,A,2,B,2A,A=1,A=2,A=0,65H,65H,MOV DPTR,#TAB ;置键码表首址 MOV A,#0 ;表的起始字节的偏移量为0 NEXT:PUSH ACC MOVC A,A+DPTR ;A=键码表的编码 CJNE

16、A,B,AGAN ;将B中值和键码表的值比较 POP ACC RL A ;如相等,序号乘2得分支表内偏移量 MOV DPTR,#JPT ;置分支表首址 JMP A+DPTR AGAN:POP ACC ;不相等比较下一个 INC A ;序号加1 CJNE A,#5,NEXT SJMP $ ;键码查完还没有B中按键编码程序结束 JPT: AJMP PR0 ;分支转移表 AJMP PR1 AJMP PR2 AJMP PR3 AJMP PR4,TAB: DB 3AH,47H,65H,70H,8BH;键码表 END,循环程序可重复执行指令段多次,使程序缩短,节省存储单元,但不节省执行时间。 循环次数控制

17、有两种方式: 1、先判断再处理:先判断循环条件是否满足,如不满足,就不循环,多以循环条件控制。 2、先处理再判断:循环执行一遍后,再判断下一轮是否还循环,多以计循环次数控制。 特别注意循环次数设置正确,不能死循环。 单重循环: 多重循环:内外循环不能交叉; 不允许外循环跳入内循环,3.5 循 环 程 序 设 计,例 3-9 10ms延时子程序,单片机晶振为6MHz。 分析 : 两个因素:晶振频率和循环次数; 晶振6MHz,一个机器周期是2s; 用内循环实现1ms延时,外循环10次。 由1ms计算内循环次数: 从P295附录A查每条指令机器周期; 内循环次数设为未知数MT; 列式计算内循环次数,

18、ORG 0020H MOV R0,#0AH;外循环10次 DL2:MOV R1,#MT ;内循环MT次 DL1:NOP NOP ;空操作指令 DJNZ R1,DL1 DJNZ R0,DL2 RET,1 1 1 1 2 2,1+1+2)2SMT=1000S MT=125=7DH,实际延时时间: 1+1+(1+1+2)125+2102S =10062S=10.062mS,若需要延时更长时间,可以采用多重循环,机器周期数,内,外,一重最大延时? 能否准确延时,例3-10 编写多字节数10程序。 首址20H多字节无符号数,低地址低地址,R7字节数,乘10后的积仍存放在原地址中,345 H 0A H 3

19、2 H 28 H 2B H 1E H 20B H,分析: 用R1为多字节数的地址指针, 部分积的低字节仍存放于本单元, 部分积的高字节存放于R2, 以便和下一字节的部分积的低位相加。以R7作字节数计数,CLR C ;清进位位C MOV R1,#20H ;R1指示地址 MOV R2,#00H ;存积的高八位寄存器R2清0 S10:MOV A, R1 ;取一字节送A MOV B,#0AH ;10送B PUSH PSW MUL AB ;字节乘10 POP PSW ADDC A,R2 ;上次积高八位加本次积低八位 MOV R1,A ;送原存储单元 MOV R2,B ;积的高八位送R2 INC R1 ;

20、指向下一字节 DJNZ R7,S10 ;未乘完去SH10,否则向下执行 MOV R1,B ;存最高字节积高字节,有问题,思考:不用PUSH、POP,将低字节进位加到R2中,例3-11 片内RAM无符号数排序(P57,START:CLR 00H CLR C MOV R7,#0AH MOV R0,#30H MOV A,R0 LOOP: INC R0 MOV R2,A SUBB A,R0 MOV A,R2 JC NEXT SETB 00H XCH A,R0 DEC R0 XCH A,R0 INC R0,NEXT:MOV A,R0 DJNZ R7,LOOP JB 00H,START SJMP ,此程序

21、有错,P58例3-12:多字节BCD码减法 P59例3-13:十进制转换为二进制 在实验中调试验证,MCS-51单片机有着优异的位逻辑功能, 可以方便的实现各种复杂的逻辑运算。 这是软件替代硬件的方法, 简化、完成代替硬件,但要多费运算时间。 例3-14 编程序,以实现图3-7中的逻辑运算电路,3.6 位操作程序设计,其中P1.1和P2.2分别是端口线上的信息,TF0和IE1分别是定时器定时溢出标志和外部中请求标志, 25H和26H分别是两个位地址, 运算结果由端口线P1.3输出。程序见下页,图3-7 硬件逻辑运算电路,START:MOV C,P2.2 ORL C,TF0 ANL C,P1.1

22、 MOV F0,C MOV C,IE1 ORL C,/25H ANL C,F0 ANL C,/26H MOV P1.3,C SJMP ,例3-15 设累加器A的各位ACC.0ACC.7分别记为X0X7,编制程序用软件实现下式: Y=X0X1X2+X0X1X2+X0X1X2X3+X4X5X6X7,X0 BIT ACC.0 X1 BIT ACC.1 X2 BIT ACC.2 X3 BIT ACC.3 X4 BIT ACC.4 X5 BIT ACC.5 X6 BIT ACC.6 X7 BIT ACC.7,ORG 0000H MOV C,X0 ANL C,X1 ANL C,X2 MOV 00H,C ;X0X1X2 MOV C,X0 ANL C,/X1 MOV 01H,C ;X0X1 ANL C,/X2 ORL C,00H MOV 00H,C MOV C,X2 ANL C,01H,ANL C,X3 ;X0X1X2X3 ORL C,/00H MOV 00H,C MOV C,X7 ANL C,/X6 ANL C,/X5 ANL C,/X4 ;X4 X5 X6 X7 ORL C,00H ;最终结果YC SJMP ,子程序对模块化程序设计是必不可少的, 用ACALL或LCALL调用

温馨提示

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

评论

0/150

提交评论