《单片机程序设计》由会员分享,可在线阅读,更多相关《单片机程序设计(58页珍藏版)》请在金锄头文库上搜索。
1、第 章 汇编语言程序设计,本章内容,Single Chip Microcomputer,概述,分支程序,循环程序,简单程序,查表程序,子程序,应用举例,程序设计概述设计语言,最早人们只能用机器语言(二进制)编写程序; 为了方便记忆,人们开始用助记符形式的汇编语言编写程序,称为低级语言。然后再用汇编系统将其翻译成机器语言,该过程称为汇编; 为了用更接近人的语言编写程序,程序设计师们发明了高级语言,如: BASIC、FORTRAN、PASCAL、C、JAVA然后再用编译系统将其翻译成机器语言,该过程称为编译; 机器只能识别机器语言。所以必须用编译系统将高级语言编写的源程序编译成机器语言,用汇编系统
2、将用汇编语言编写的源程序汇编成机器语言; 由低级或高级语言构成的程序称为源程序,由机器语言构成的程序称作目标程序;,源程序 目标程序,低级语言,机器语言,汇编,高级语言,机器语言,编译,程序设计实例引入,实例 假设一个班有50个人, 共有3门选修课: 计算机算法 服装CAD设计 德语 请找出: 同时选了三门课的同学;,问题的解决,第一步如何在计算机中表示选修某门课的所有同学,选修这门人数,学生的学号,这个过程实际上是设计数据结构的问题,问题的解决,第二步设计思路:找出同时选了三门课的同学,这个过程实际上是设计算法的过程,既构建模型。,重复该过程,第三步:设计流程,几点启示,整体构思; 构建整体
3、流程框图; 结构合理,流程清晰,简单明了; 局部模块化;,为什么要用流程图?,符合人进行逻辑思考的习惯 计算机从根本上来说,没有任何逻辑性,所以,你必须告诉它,先做什么,后做什么,遇到什么情况又该做什么,等等 流程图设计本身是一个逐步求精的过程,最终将任务划分为若干能由机器指令实现的小模块,简单程序设计,结构特点: 按指令的先后顺序依次执行。 例1:将20H单元的两个压缩BCD码拆开变成ASCII码,存入21H、22H单元。(假设20H中的BCD码为00110100),什么是BCD码? 什么是ASII码?,0011,压缩BCD码,0011,0011,0100,低四位ASII码,高四位ASII码
4、,方法1:将BCD码除以10H,恰好是将BCD码分别移到了A、B的低4位。然后再各自与30H相或,即成为ASCII码。,方法2:利用半字节交换指令来实现。,ORG 0000H MOV A,20H MOV B,#10H DIV AB ORL B,#30H MOV 22H,B ORL A,#30H MOV 21H,A SJMP $,简单程序例1-方法1,源程序如下:,0011,0100,PC,PC,PC,0011 0100,0001 0000,PC,0011,0000,0000 0100,PC,0011 0100,PC,PC,PC,0011,PC,ORG 0000HMOV R0,#20HMOV A
5、,#30HXCHD A,R0MOV 22H,AMOV A,R0SWAP AORL A , #30HMOV 21H, ASJMP $,简单程序例1-方法2,PC,PC,PC,PC,PC,PC,PC,PC,PC,源程序如下:,0011,0010 0000,0011,0100,0000,0100,0011,0100,0011,0000,0011,0000,0011,PC,0011,程序设计概述-基本步骤,题意分析 画出流程图 分配内存及端口 编制源程序 仿真、调试程序 固化程序,例2:有两组BCD码分别存放在23H、22H单元和33H、32H单元,求它们的和并送入43H、42H单元中去。(高位在前,
6、低位在后),分析:,0011,1000,0110,0101,0001,0001,1000,0111,BCD码83H,BCD码11H,例2:有两 组BCD码(如:1183H和5678H),分别存放在23H、22H单元和33H、32H单元,求它们的和,并送入43H、42H单元中去。(高位在前,低位在后)解:,流程图(框图)如何? 请同学们自己绘制流程图。,ORG 0000HMOV A,22HADD A,32HDA AMOV 42H,AMOV A,23HADDC A,33HDA AMOV 43H,ASJMP $END,此条加法指令可否改用带进位的(ADDC)?,ORG 2000HCLR CMOV A
7、,22HADD A,32HDA AMOV 42H,AMOV A,23HADDC A,33HDA AMOV 43H,AEND,1000 0011,0101 0110,0001 0001,0111 1000,1000 0011,0111 1000,1111 1011,0110 0001,0001 0001,0101 0110,0110 0111,0110 1000,PC,PC,PC,PC,PC,PC,PC,PC,PC,1111 1011,0110 0001,PC,0110 1000,PC,0110 0111,分支程序设计,结构特点:不一定按指令的先后顺序依次运行程序,程序的流向有两个或两个以上分支
8、,根据指定条件选择程序的流向。 如实训程序中采用的分支:,分支程序的典型实例,实例:已知30H单元中有一变量X,要求编写一程序按下述要求给Y赋值,结果存入31H单元。X+1, X0Y = 0 , X = 01 , X0 题意:根据X的不同,程序编写时有三个出口,即有三个分支!,想一想:程序怎么编写?,分支程序实例-三分支程序,开始,XA,A= 1,A= A+1,存结果,结束,Y,Y,N,N,程序框图:,A0?,A=0?,分支程序实例-三分支程序,源程序如下:ORG 2000HMOV A,30HJZ LP1 ;X = 0,转LP1处理JNB ACC.7,LP2 ;X0,转LP2处理MOV A,#
9、0FFH ;X0,则Y= 1SJMP LP1LP2:ADD A,#01 ;X 0,Y=X+1LP1:MOV 31H,A ;存结果SJMP $ ;循环等待,$表示转至本地址,此方法适用于一字节的偏移量,最高位为符号位。,例 设内部RAM20H单元和30H 单元中分别存放了两个8位的无符号数 X、Y, 若XY 则让P1.0管脚连接的LED亮;若XY 则让P1.1管脚连接的LED亮。,方法1:两个数据做减法SUBB,可根据借位CY来判断两个数的大小!,方法2:两个数据做比较CJNE,再根据是否相等和借位CY来判断两个数的大小!,分支程序实例-数据比较大小,方法1编程:,X DATE 20HY DAT
10、E 30HORG 0000HMOV A,XCLR CSUBB A,Y JC L1CLR P1.0SJMP FINISH L1: CLR P1.1 FINISH: SJMP $END,X DATE 20HY DATE 30HORG 0000HMOV A,XCJNE A,Y,L0L0:JC L1CLR P1.0SJMP FINISH L1: CLR P1.1 FINISH: SJMP $END,方法2编程:,分支程序实例-数据比较大小,*例 两个有符号数的比较。,问题1:如何表示有符号数呢?,问题2:有符号数怎样比较大小?,1.先判断符号位,负数小;正数大. 2.符号相同,则用减法判断是否有借位.
11、,比较20H和30H单元两个有符号数的大小,结果按下述规律显示。 (20H)=(30H),P1.0点亮; (20H)(30H),P1.1点亮; (20H)(30H),P1.2点亮;,程序框图,程序清单,X DATA 20HY DATA 30H ;伪指令ORG 0000HMOV A,XXRL A,Y ;X,Y进行异或JB ACC.7,NEXT1 ;二者符号不同,跳转到NEXT1MOV A,X ;符号相同 CJNE A,Y,NEQUAL;X Y,跳转到NEQUALCLR P1.0 ;X=Y,点亮P1.0SJMP FINISH NEQUAL: JC XXY ;X Y,转移到XDY NEXT1: MO
12、V A,XJNB ACC.7,XDY ;判断X的正、负,正则转移到XDY XXY: CLR P1.2 ;X Y,点亮P1.1 FINISH: SJMP $END,散转程序,散转程序是指通过修改某个参数后,程序可以有三个以上的流向,多用于键盘程序。 常用的指令是JMP A+DPTR,该指令是把16位数据指针DPTR的内容与累加器A中的8位无符号数相加,形成地址,装入程序计数器PC,形成散转的目的地址。,DPTR,+,A,PC,A中内容为8位无符号数,16位地址数,程序清单如下: JUMP1: MOV DPTR,JPTAB1 ;跳转表首送数据指针MOV A,R7ADD A,R7 ;R72A (修正
13、变址值) JNC NOAD ;判有否进位INC DPH ;有进位则加到高字节地址 NOAD: JMP A+DPTR ;转向形成的散转地址人口 JPTAB1: AJMP OPR0 ;直接转移地址表AJMP OPR1. AJMP OPRn,例: 根据R7的内容,转向各自对应的操作程序 (R7= 0,转入OPR0;R7= 1,转入OPR1R7= n,转入OPRn),循环程序设计,结构特点:利用转移指令反复运行需要多次重复的程序段。 实例:前面几个实训中用到的延时程序:(DELAY)DELAY: MOV R3, #OFFHDEL2: MOV R4,#0FFHDEL1: NOPNOPDJNZ R4,DEL1DJNZ R3,DEL2RET 循环程序的组成:1. 初始化部分(设定循环次数等)。 2. 循环体(重复执行的部分,用于完成实际操作)3. 循环控制(不断修改和判别循环变量,直至结束)。4. 循环结束处理。,循环程序设计,延时程序中延时时间的设定:,源程序: 指令周期 DELAY: MOV R3, #( X )H 2个T机器 DEL2: MOV R4,#( Y )H 2个T机器 DEL1: NOP 1个T机器 NOP 1个T机器DJNZ R4,DEL1 2 个T机器 DJNZ R3,DEL2 2个T机器 RET,