单片机-汇编语言_第1页
单片机-汇编语言_第2页
单片机-汇编语言_第3页
单片机-汇编语言_第4页
单片机-汇编语言_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

1、第章汇编语言程序设计 本章内容Single Chip Microcomputer概述分支程序循环程序简单程序查表程序子程序应用举例程序设计概述设计语言最早人们只能用机器语言(二进制)编写程序;为了方便记忆,人们开始用助记符形式的汇编语言编写程序,称为低级语言。然后再用汇编系统将其翻译成机器语言,该过程称为汇编;为了用更接近人的语言编写程序,程序设计师们发明了高级语言,如: BASIC、FORTRAN、PASCAL、 C、JAVA 然后再用编译系统将其翻译成机器语言,该过程称为编译;机器只能识别机器语言。所以必须用编译系统将高级语言编写的源程序编译成机器语言,用汇编系统将用汇编语言编写的源程序汇

2、编成机器语言;由低级或高级语言构成的程序称为源程序,由机器语言构成的程序称作目标程序; 源程序 目标程序 低级语言机器语言汇编高级语言机器语言编译程序设计实例引入实例假设一个班有50个人,共有3门选修课:计算机算法服装CAD设计德语请找出:同时选了三门课的同学;问题的解决第一步 如何在计算机中表示选修某门课的所有同学5122325225392939412252939计算机算法服装CAD设计德语选修这门人数学生的学号这个过程实际上是设计数据结构的问题问题的解决第二步 设计思路:找出同时选了三门课的同学这个过程实际上是设计算法的过程,既构建模型。计算机算法CAD设计德语重复该过程第三步:设计流程找

3、出第一个学生他选了德语吗?他选了CAD吗?记录要找的人还有学生吗?下一个学生NNYNYY结束他选计算机吗?NY几点启示整体构思;构建整体流程框图;结构合理,流程清晰,简单明了;局部模块化;为什么要用流程图?符合人进行逻辑思考的习惯计算机从根本上来说,没有任何逻辑性,所以,你必须告诉它,先做什么,后做什么,遇到什么情况又该做什么,等等流程图设计本身是一个逐步求精的过程,最终将任务划分为若干能由机器指令实现的小模块简单程序设计 结构特点: 按指令的先后顺序依次执行。例1:将20H单元的两个压缩BCD码拆开变成ASCII码,存入21H、22H单元。(假设20H中的BCD码为00110100)什么是B

4、CD码?什么是ASII码? 20H21H22HAB0011压缩BCD码0011 0011 0100低四位ASII码高四位ASII码方法1:将BCD码除以10H,恰好是将BCD码分别移到了A、B的低4位。然后再各自与30H相或,即成为ASCII码。方法2:利用半字节交换指令来实现。ORG 0000HMOV A,20HMOV B,#10HDIV ABORL B,#30HMOV 22H,BORL A,#30HMOV 21H,ASJMP $ 开始 (20H)A10HB A/B (A中为高4位BCD码,B中为低4位BCD码) B+30HB B(22H) A+30HA A(21H) 结束简单程序例1-方法

5、1源程序如下:20H21H22HAB00110100PCPCPC0011 01000001 0000PC001100000000 0100PC0011 0100PCPCPC0011PC ORG 0000H MOV R0,#20H MOV A,#30H XCHD A,R0 MOV 22H,A MOV A,R0 SWAP A ORL A , #30H MOV 21H, A SJMP $简单程序例1-方法2 开始 #20HR0#30HA A的低4位(20H)的低4位 A(22H)(20H)A A的低4位A的高4位 A(21H) 结束 A+30HAPCPCPCPCPCPCPCPCPC源程序如下:20H

6、21H22HAR000110010 000000110100000001000011010000110000001100000011PC0011程序设计概述-基本步骤题意分析画出流程图分配内存及端口编制源程序仿真、调试程序固化程序例2:有两组BCD码分别存放在23H、22H单元和33H、32H单元,求它们的和并送入43H、42H单元中去。(高位在前,低位在后)分析:32H33H42HA22H23H43H00111000011001010001000110000111BCD码83HBCD码11H例2:有两 组BCD码(如:1183H和5678H),分别存放在23H、22H单元和33H、32H单元

7、,求它们的和,并送入43H、42H单元中去。(高位在前,低位在后)解:流程图(框图)如何?请同学们自己绘制流程图。 开始(22H)A(32H)+AA十进制调整(33H)+AA A(43H) 结束 A(42H)(23H)A 十进制调整 ORG 0000H MOV A,22H ADD A,32H DA A MOV 42H,A MOV A,23H ADDC A,33H DA A MOV 43H,A SJMP $ END 此条加法指令可否改用带进位的(ADDC)? 开始(22H)A(32H)+AA十进制调整(33H)+AA A(43H) 结束 A(42H)(23H)A 十进制调整 ORG 2000H

8、CLR C MOV A,22H ADD A,32H DA A MOV 42H,A MOV A,23H ADDC A,33H DA A MOV 43H,A END32H33H42HA22H23H43H1000 00110101 01100001 00010111 10001000 00110111 1000+1111 10110110 00010001 00010101 01100110 01110110 1000PCPCPCPCPCPCPCPCPC1111 10110110 0001PC0110 1000PC0110 0111分支程序设计结构特点:不一定按指令的先后顺序依次运行程序,程序的流向

9、有两个或两个以上分支,根据指定条件选择程序的流向。如实训程序中采用的分支:P3.4=0?点亮所有二极管N二极管交叉点亮Y分支程序的典型实例实例:已知30H单元中有一变量X,要求编写一程序按下述要求给Y赋值,结果存入31H单元。 X+1, X0 Y = 0 , X = 0 1 , X0题意:根据X的不同,程序编写时有三个出口,即有三个分支! 想一想:程序怎么编写?分支程序实例-三分支程序开始 XAA= 1 A= A+1存结果结束YYNN程序框图:A0?A=0?分支程序实例-三分支程序 源程序如下: ORG 2000H MOV A,30H JZ LP1 ;X = 0,转LP1处理 JNB ACC.

10、7,LP2 ;X0,转LP2处理 MOV A,#0FFH ;X0,则Y= 1 SJMP LP1 LP2:ADD A,#01 ;X 0,Y=X+1 LP1:MOV 31H,A ;存结果 SJMP $ ;循环等待,$表示转至 本地址,此方法适用 于一字节的偏移量最高位为符号位。例 设内部RAM20H单元和30H 单元中分别存放了两个8位的无符号数 X、Y, 若XY 则让P1.0管脚连接的LED亮;若XY,点亮P1.1X=Y,点亮P1.0X0?NY程序清单 X DATA 20H Y DATA 30H;伪指令 ORG 0000H MOV A,X XRL A,Y ;X,Y进行异或 JB ACC.7,NE

11、XT1 ;二者符号不同,跳转到NEXT1 MOV A,X ;符号相同 CJNE A,Y,NEQUAL;X Y,跳转到NEQUAL CLR P1.0 ;X=Y,点亮P1.0 SJMP FINISHNEQUAL: JC XXY ;X Y,转移到XDYNEXT1: MOV A,X JNB ACC.7,XDY ;判断X的正、负,正则转移到XDYXXY: CLR P1.2 ;X Y,点亮P1.1FINISH: SJMP $ END散转程序散转程序是指通过修改某个参数后,程序可以有三个以上的流向,多用于键盘程序。常用的指令是JMP A+DPTR,该指令是把16位数据指针DPTR的内容与累加器A中的8位无符

12、号数相加,形成地址,装入程序计数器PC,形成散转的目的地址。DPTR+APCA中内容为8位无符号数16位地址数 程序清单如下:JUMP1: MOV DPTR,JPTAB1 ;跳转表首送数据指针 MOV A,R7 ADD A,R7 ;R72A (修正变址值) JNC NOAD ;判有否进位 INC DPH ;有进位则加到高字节地址 NOAD: JMP A+DPTR ;转向形成的散转地址人口JPTAB1: AJMP OPR0 ;直接转移地址表 AJMP OPR1 . AJMP OPRn 例: 根据R7的内容,转向各自对应的操作程序 (R7= 0,转入OPR0;R7= 1,转入OPR1R7= n,转

13、入OPRn)循环程序设计结构特点:利用转移指令反复运行需要多次重复的程序段。实例:前面几个实训中用到的延时程序:(DELAY) DELAY: MOV R3, #OFFH DEL2: MOV R4,#0FFH DEL1: NOP NOP DJNZ R4,DEL1 DJNZ R3,DEL2 RET 循环程序的组成: 1. 初始化部分(设定循环次数等)。 2. 循环体(重复执行的部分,用于完成实际操作) 3. 循环控制(不断修改和判别循环变量,直至结束)。 4. 循环结束处理。循环程序设计延时程序中延时时间的设定:源程序: 指令周期DELAY: MOV R3, #( X )H 2个T机器 DEL2:

14、 MOV R4,#( Y )H 2个T机器 DEL1: NOP 1个T机器 NOP 1个T机器 DJNZ R4,DEL1 2 个T机器 DJNZ R3,DEL2 2个T机器 RET指令周期、机器周期T机器与时钟周期T时钟的关系: T机器=12T时钟=121/fosc=1s (假设晶振频率fosc为12M)延时时间的简化计算结果: (1+1+2) X Y 延时时间怎样计算?若想延时100ms,只需修改计数初始值,即 (1+1+2) 125200s=100ms#200#125循环程序设计1S延时程序源程序:DELAY: MOV R2, #10 DEL3: MOV R3, #200DEL2: MOV

15、 R4,#125DEL1: NOP NOP DJNZ R4,DEL1 DJNZ R3,DEL2 DJNZ R2, DEL3 RET循环程序设计编程实现P1口连接的8个LED显示方式如下:从P1.0到P1.7的顺序,依次点亮其连接的LED。设循环次数 显示模式字送P1口开始 显示模式字左移1位设循环初值 次数10YN子程序实例引入 ORG 0000HSTART: MOV R2,#08H ;设置循环次数 MOV A,#0FEH ;送显示模式字NEXT: MOV P1,A ;点亮二极管 ACALL DELAY RL A ;左移一位,改变显示模式字 DJNZ R2,NEXT ;循环次数减1,不为零,继

16、续点亮 SJMP START ;下面一个二极管 DELAY: MOV R3,#0FFH ;延时子程序开始DEL2: MOV R4,#0FFHDEL1: NOP DJNZ R4,DEL1 DJNZ R3,DEL2 RET END 数据传送程序不同存储区域之间的数据传输:将内部RAM30H单元开始的内容传送到外部RAM0100H单元开始的区域,直到遇到传送的内容是0为止。地址指针R0赋初值 (R0)AA(DPTR), 地址指针增1地址指针DPTR赋初值 A = 0NY初始化部分循环体循环控制循环结束开始结束查表程序表格是事先存放在ROM中的,一般为一串有序的常数,例如平方表、字型码表等。表格可通过

17、伪指令DB来确定。通过查表指令MOVC A,A+DPTR MOVC A,A+PC来实现。 在LED显示和键盘处理程序中将会用到。用查表法计算平方(一) ORG 0000H MOV DPTR,#TABLE ;表首地址送DPTR MOV A,#05;被查数字05A MOVC A,A+DPTR ;查表求平方 SJMP $ TABLE:DB 0,1,4,9,16,25,36,49,64,81 END 用查表法计算平方(二) ORG 0000H1000H MOV A,#05 ;05 A1002H ADD A,#02 ;修正累加器A1004H MOVC A,A+PC ;查表求平方1005H SJMP $

18、1007H: DB 0,1,4,9,16,25,36,49,64,81 END八路彩灯控制程序要求:(1)D1D8八个彩灯按规定顺序依次点亮(间隔1秒),最后全量;(2)按规定顺序依次熄灭(间隔1秒),最后全灭;(3)八个灯同时点亮,保持1秒;(4)八个灯同时熄灭,保持0.5秒; 再将第3、4步重复4遍,最后整个程序再重复N遍。步骤:(1)绘制流程图(2)编写程序(3)调试程序参考程序(一) ORG 0000H LJMP MAIN ORG 0100HMAIN:MOV R7,#7LOOP: MOV R6,#16 MOV R5,#4 MOV DPTR,#TABL MOV R4,#0LOOP1:MO

19、V A,R4 MOVC A,A+DPTR MOV P1,A INC R4 LCALL DELAY LCALL DELAY DJNZ R6,LOOP1LOOP2: MOV P1,#0FFH LCALL DELAY LCALL DELAY MOV P1,#00H LCALL DELAY DJNZ R5,LOOP2 DJNZ R7,LOOP SJMP $ END 开始 初始化参数 查表 延时循环次数到否?结束NY 亮灭4次循环N次到否?NY 子程序设计在实际问题中,常常会遇到在一个程序中多次用到相同的运算或操作,若每遇到这些运算或操作,都从头编起,将使程序繁琐、浪费内存。因此在实际中,经常把这种多次

20、使用的程序段,按一定结构编好,存放在存储器中,当需要时,可以调用这些独立的程序段。通常将这种可以被调用的程序段称为子程序。主要内容: 1. 主程序与子程序的关系 2. 子程序嵌套 3. 子程序的调用与返回主程序与子程序的关系 子程序SUB 主程序MAIN返回 LCALL SUB 调用子程序子程序入口地址RET如调用延时程序的过程 ORG0000H MAIN:MOVA,#0FEH;送显示初值 LP:MOVR0,#10;送闪烁次数 LP0:MOVP1,A;点亮LEDLCALLDELAY;延时MOVP1,#0FFH;熄灭灯LCALLDELAY;延时DJNZR0,LP0 RLA SJMPLP例:LED

21、灯的闪烁点亮(一)延时次数-1=0点亮相应的LEDYN熄灭相应的LED延时初值左移1位指向下一个LED设闪烁次数送显示初值开始子程序嵌套 子程序嵌套(或称多重转子)是指在子程序执行过程中,还可以调用另一个子程序。 子程序SUB1 主程序MAINLCALL SUB1 RET 子程序SUB2RETLCALL SUB2 子程序嵌套范例:LED灯闪烁(二) ORG 0000H MAIN: MOV A,#0FEH;送显示初值 COUN: ACALL FLASH;调闪烁子程序 RL A;A左移,下一个灯闪烁 SJMP COUN ;循环不止 FLASH: MOV R0,#10;送闪烁次数FLASH1: MO

22、V P1,A;点亮LED LCALL DELAY;延时 MOV P1,#0FFH;熄灭灯 LCALL DELAY;延时 DJNZ R0,FLASH1;闪烁次数不够10次,继续 RET DELAY: MOV R3,#0FFH ;延时子程序 DEL2: MOV R4,#0FFH DEL1: NOP DJNZ R4,DEL1 DJNZ R3,DEL2 RET END子程序的调用与返回 问题:子程序调用、返回到主程序中的正确位置,并接着执行主程序中的后续指令呢? 为了解决这个问题,我们采用了堆栈技术。 子程序SUB1 主程序MAINRET 子程序SUB2RET201020132110211321002

23、20020 132013 PC21 131321堆栈指针SP堆栈LCALL SUB1LCALL SUB2子程序设计注意事项 (1)要给每个子程序起一个名字,也就是入口地址的代号。 (2)要能正确地传递参数。即首先要有入口条件,说明进入子程序时,它所要处理的数据放在何处(如:是放在A中还是放在某个工作寄存器中等)。另外,要有出口条件,即处理的结果存放在何处。 (3)注意保护现场和恢复现场。在子程序使用累加器、工作寄存器等资源时,要先将其原来的内容保存起来,即保护现场。当子程序执行完毕,在返回主程序之前,要将这些内容再取出,送还到累加器、工作寄存器等原单元中,这一过程称为恢复现场。例:查表子程序。

24、注意:1.入口参数和出口参数的位置 2.现场的保护与恢复。子程序的参数传递 范例:计算平方和c=a2+b2 ORG0000H ;主程序MOVSP,#3FH ;设置栈底MOVA,31H ;取数a存放到累加器A中作为入口参数LCALL SQR ;计算a2MOVR1,A ;出口参数平方值存放在A中MOVA,32H ;取数b存放到累加器A中作为出口参数LCALL SQR ;计算b2ADDA,R1 ;求和MOV33H,A ;存放结果SJMP$ ;子程序:SQR;功能:通过查表求出平方值y=x2;入口参数:x存放在累加器A中;出口参数:求得的平方值y存放在A中;占用资源:累加器A,数据指针DPTRSQR:

25、USH DPH ;保护现场,将主程序中DPTR的高八位放入堆栈 PUSH DPL ;保护现场,将主程序中DPTR的低八位放入堆栈 MOV DPTR,#TABLE ;在子程序中重新使用DPTR,表首地址DPTR MOVC A, A+DPTR ;查表 POP DPL;恢复现场,将主程序中DPTR的低八位从堆栈中弹出 POP DPH;恢复现场,将主程序中DPTR的高八位从堆栈中弹出 RETTABLE: DB 0,1,4,9,16,25,36,49,64,81常用汇编子程序代码转换 例:将二进制转换为BCD码查找程序 例:查找关键字。 例:查找最大值。 程序名:BINBCD 功能:二进制数转换为BCD

26、码 入口参数:要转换的二进制数存放在累加器A中(00H-FFH) 出口参数:转换后的BCD码存放在B(百位)和A(十位和个位)中BINBCD: PUSH PSW MOV B,#100 DIV AB ;除法指令,A/B 商在A中,余数在B中 PUSH ACC ;把商(百位数)暂存在堆栈中 MOV A,#10 XCH A,B ;余数交换到A中,B=10 DIV AB ;A/B商(十位)在A中,余数在B(个位)中 SWAP A ;十位数移到高半字节 ADD A,B ;十位数和个位数组合在一起 POP B ;百位数存放到B中 POP PSW RET程序名 :FIND ; 功能:片内RAM中数据检索入口参数:R0指向数据块首地址,R1中为数据块长度,关键字存于累加器A中出口参数:若找到关键字,把关键字在数据块中的序号存放到A中,若找不到 关键字,A中存放序号00H占用资源:

温馨提示

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

评论

0/150

提交评论