单片机嵌入式系统原理及应用 教学课件 ppt 作者 贾好来 ch4

上传人:E**** 文档编号:89155712 上传时间:2019-05-19 格式:PPT 页数:127 大小:1.99MB
返回 下载 相关 举报
单片机嵌入式系统原理及应用 教学课件 ppt 作者 贾好来 ch4_第1页
第1页 / 共127页
单片机嵌入式系统原理及应用 教学课件 ppt 作者 贾好来 ch4_第2页
第2页 / 共127页
单片机嵌入式系统原理及应用 教学课件 ppt 作者 贾好来 ch4_第3页
第3页 / 共127页
单片机嵌入式系统原理及应用 教学课件 ppt 作者 贾好来 ch4_第4页
第4页 / 共127页
单片机嵌入式系统原理及应用 教学课件 ppt 作者 贾好来 ch4_第5页
第5页 / 共127页
点击查看更多>>
资源描述

《单片机嵌入式系统原理及应用 教学课件 ppt 作者 贾好来 ch4》由会员分享,可在线阅读,更多相关《单片机嵌入式系统原理及应用 教学课件 ppt 作者 贾好来 ch4(127页珍藏版)》请在金锄头文库上搜索。

1、1,第4章 8051单片机程序设计基础,语言:汇编还是C?,确定了单片机,另一个老生常谈的争论就不得不面对了,学汇编还是C好?现在很多宣传一味鼓吹C语言的好,似乎“万恶的汇编”早就该下地狱了。这种观点是有失偏颇的。 客观的讲,汇编语言和C语言各有特点。汇编语言的本质是机器码,是直接和单片机对话的唯一途径。优点是效率高,缺点是难以驾驭。C语言的逻辑性更强,优点是只要掌握了语言本身编程就变得简单,而且移植性好。缺点是即使你写出了程序,完成了功能,但是对单片机本身的了解还是很少。,2,实际开发中大多会使用C语言,汇编语言在较为复杂的工程面前还是显得很无力。但是汇编语言在学习单片机的过程中却很有用,想

2、要真正懂得单片机的内部奥妙,还得借助汇编语言这个窗口。 因此,学习的正确流程应该是:先通过汇编语言将单片机硬件资源掌握透彻,C语言仅是一门语言,对硬件了解清楚的基础之上再学习C语言,很容易上手。,3,主要内容,4.1 汇编语言程序结构 4.2 算术运算程序设计 4.3 C51基础 4.4 C51和汇编语言的混合编程,4,4.1 汇编语言程序结构,4.1.1简单程序结构 4.1.2分支结构 4.1.3循环结构 4.1.4子程序及其参数传递方法 4.1.5中断服务程序 *4.1.6 前后台结构 *4.1.7 并行结构,5,4.1.1简单程序结构,简单结构程序执行时,从第一条指令开始顺序执行,直到最

3、后一条指令为止。它是构成较大、较复杂程序的最基本的结构。但它本身只能完成一些简单的任务,所以叫做简单程序。,6,例4.1将单字节BCD码转换成二进制数,ORG 100H MOV R2, #28H ;要转换的BCD数送入R2,入口 MOV A,R2 ANL A,#0F0H ;屏蔽低4位,取高4位 SWAP A ;高低4位交换 MOV B,#10 MUL AB ;210 MOV R3,A ;乘积送R3保存,7,MOV A,R2 ANL A,#0FH ;取低4位 ADD A,R3 ;2108送A MOV R3,A ;结果1CH送R3 END ;程序结束,8,例4.2 双字节移位,将30H、31H单元

4、存放的无符号数除2,商仍在原单元中,余数送入CY中。由于8051指令系统中只有单字节移位指令,故双字节移位需要分步进行,只给出程序段。,9,CLR C MOV A,30H RRC A MOV 30H,A MOV A,31H RRC A MOV 31H,A,10,4.1.2分支结构,在大量的实用程序中,需要对某些指令的执行结果进行判断,根据判断的结果决定程序的走向。判断后有“是”和“非”两种结果,程序也就有两种可能的执行方向,也就是程序产生了分支,形成了分支结构。 改变程序的执行顺序有两种方法:一是事先安排好的,程序执行到某条指令后转去执行指定的指令。这是通过无条件转移指令来实现的;第二种就是根

5、据程序执行的结果来决定转移到何处去。这是通过条件转移指令来实现的,分支程序就属这种情况。,11,转移指令都有条件测试功能,根据测试后的结果来确定是否转移,条件成立则转移,否则执行下一条指令。 例4.3 给定8位有符号数X,求符号函数Y。所谓符号函数,即当X0时,Y为1,当X0时,Y等于-1,而当X=0时,Y=0。这是一个典型的分支程序。,12,13,图4-1 例4.3程序流程图,ORG 100H START:MOV R0,#30H ;存放有符号数的地址指针 ; 30H送R0,而(30H)=X MOV A,R0 ; (A)X ANL A,R0 ; 做与运算,出标志 JZ ZERO ; 判(A)=

6、0否?(A)=0,转ZERO,(A)非0, ; 下一条 JNB ACC.7, NEXT ; (A)的最高位不是1,即为正数,转 ; 标号NEXT,如是1,执行下一条 MINUS:MOV R1,#0FFH ; (A)的最高位是1,即为负数, ;(R1)=-1 SJMP EXIT ; 转出口 ZERO: MOV R1,#0 ; (R1)0 SJMP EXIT ; 转出口 NEXT: MOV R1,#1 ; (R1) = 1,即R1做为出口Y=1 EXIT: SJMP EXIT ; 原地踏步,14,4.1.3循环结构,一个程序若包含多次重复执行的程序段,则称为循环结构。循环程序和分支程序都是非顺序结

7、构程序,但它们在程序走向和所实现的功能上是不同的。 先看实例:,15,例4.4 求存放在片内RAM 20H单元开始的10个无符号数的最小值,ORG 100H MOV R0,20H ;置地址指针 MOV R7,10 ;计数器初值 MOV A,R0 ;取第一个数 DEC R7 ;实际的比较次数 LOOP: INC R0 ;修改地址指针 MOV 40H,R0 ;取后一个数 CJNE A, 40H, NEXT ;前数与后数比较,16,17,NEXT: JC LOPP1 ;前一个数小,不交换 MOV A,40H ;前一个数大,把后一个数送A LOPP1: DJNZ R7,LOOP ;计数器减1,不为0转

8、LOOP MOV 41H, A ;循环结束,最小值送;41H单元 HERE: SJMP $ ;$指HERE标号,踏步 END,18,图42 例4.4程序流程图,19,循环程序的构成,设置初值部分,进入循环之前要给出初始状态,称为初始化,一般包括建立计数器,设置地址指针及其他变量的初值。初值又分为循环工作部分的初值和循环结束条件的初值。 循环工作部分,这是循环结构的基本部分,也叫循环体,是为重复执行任务编写的程序段。 循环控制部分,控制循环的次数,一般包括修改计数器,修改指针,检测循环结束条件等。 结束部分用于分析和存储结果。,20,图4-3 循环程序流程图,如果循环工作部分又包含新的循环程序,

9、称为循环嵌套,如出现多次嵌套,就称为多重嵌套。而循环工作部分不包含另外的循环体就称为单重循环。,21,单重循环和多重循环,单重循环及其控制方法,控制循环的方法有多种,这里只介绍其中的三种。当循环次数已知时,利用计数器控制循环最方便。当循环次数未知时,可采用按实际条件控制循环,或采用逻辑尺的方法。,22,例4.5 求存放于首地址为20H单元的多个学生考试成绩之和。这个问题可利用成绩是正数的特点,在成绩数据区后放一个负数作为结束条件。 ORG 1000H START: MOV R0,#20H ;首地址指针 MOV R1,#0 MOV R2,#0,23,LOOP: MOV A, R0 ; 取第1个数

10、 JB ACC.7,DONE ; 是负数,结束循环 ADD A,R1 JNC NEXT INC R2 NEXT: INC R0 MOV R1,A SJMP LOOP DONE: SJMP $,24,用逻辑尺控制循环,例4.6 若单片机进行8路巡回检测,采集的数据要用不同的函数加以处理。设第0、3、5路用FUNC1处理,而1、2、4、6、7路用FUNC2处理,这样在一个循环中包括两个支路,可使用一个二进制位串来控制程序沿那一个位串来循环,本题的位串设计为11010110,0表示用FUNC1处理,1表示用FUNC2处理,这个二进制位串称为逻辑尺。其长度根据需要可为一字节,或多字节。程序运行时,可将

11、逻辑尺移位,判断是0还是1,以决定对数据如何处理。程序流程如图4-4所示。,25,26,图4-4 用逻辑尺控制循环,多重循环,如果在一个循环体中又包含了其他的循环程序,即循环中还套着循环,这种程序称为多重循环程序。 例4.7 10秒延时程序。 延时程序与MCS-51执行指令的时间有关,如果使用12MHz晶振,一个机器周期为1s计算出执行一条指令以至一个循环所需要的时间,给出相应的循环次数,便能达到延时的目的。,27,DEL: MOV R5, #100 DEL0: MOV R6, #200 DEL1: MOV R7,#248 ;248*2 + 1 = 497个机器周期 DEL2: DJNZ R7

12、,DEL2 ;(248*2+1+2)*200+ 1 =99801个机器周期 DJNZ R6, DEL1 ; (248*2+1+2)*200+2) *100+1+2s DJNZ R5, DEL0 RET,28,4.1.4子程序及其参数传递方法,在实际程序中,常常会多次进行一些相同的计算和操作。如数制转换、函数式计算等等。如果每次都从头开始编制一段程序,不仅麻烦,而且浪费存储空间。因而对一些常用的程序段以子程序的形式,事先存放在存储器的某一个区域。当主程序在运行时,需要用子程序时,只要执行调用子程序的指令,使程序转至子程序。当子程序处理完毕,返回主程序,继续进行以后的操作。,29,30,调用子程序

13、的优点: (1)避免了对相同程序段的重复编制。 (2)简化程序的逻辑结构,同时也便于子程序调试。 (3)节省存储器空间。,8051指令系统中,提供了两条调用子程序指令ACALL及LCALL,并提供了一条返回主程序的指令RET。 ACALL: 子程序距离本指令的距离不超过2K LCALL: 子程序距离本指令的距离在64K内 子程序的调用,包含两个部分:保护现场和恢复现场。,31,参数传递,调用子程序时,主程序应先把有关的参数存放在约定的位置,子程序在执行时,可以从约定的位置取得参数,当子程序执行完,将得到的结果存入约定的位置,返回主程序后,主程序可以从这些约定的位置读取到需要的结果,这就是参数的

14、传递。,32,用累加器或寄存器进行参数的传递,用累加器和寄存器存放输入参数及结果参数,可以提高程序的运算速度,而且程序也很简单。其不足之处是参数不能传递得很多,因为寄存器的数量有限;主程序在调用子程序前必须将参数先送入寄存器;由于子程序参数的个数是固定的,故主程序不能任意设定参数的多少。,33,用指针寄存器进行参数的传递,当程序中所需处理的数据量比较大时,常常用存储器存放数据,而不用寄存器。用指针指示数据在存储器中所处的位置,可以大大节省参数传递中的工作量,使用指针的方法能实现数据长度可变的运算。8051指令系统中提供的由R0、R1作间址寄存器的指令很多,当参数存放在内部RAM时,用R0、R1

15、作指针,使参数的传递十分方便。 当参数在外部RAM或在程序存储器时,可用DPTR作指针。对可变长度运算时,数据长度可由寄存器指出,也可采用在数据后设置标志的办法。,34,用堆栈进行参数传递,堆栈可以用于主程序调用子程序时相互之间的参数传递。调用前,主程序用PUSH指令把参数压入堆栈,子程序在执行中按堆栈指针间接访问栈中参数,并且把运算结果送回堆栈。返回主程序后,主程序用POP指令得到堆栈中的结果参数。利用堆栈传递参数的方法比较简单,而且传递参数量比用寄存器来传递参数多得多,也不必为特定的参数分配存储单元。,35,例4.8 一位16进制数转换成ASCII码,HEASC: MOV R0,SP;借用

16、R0,为堆栈指针 DEC R0 DEC R0 ;R0指向被转换参数地址 XCH A,R0 ;保护累加器,取被转换参数 ANL A,#0FH ADD A,#2 ;表首地址 MOVC A,A+PC ;查表 XCH A, R0 ;结果送回堆栈 RET ATAB: DB 30H,31H,32H,39H DB 41H,46H,36,例4.9 把内部RAM中40H单元一字节的16进制数转换成两位ASCII码,存放在R1指出的两个单元中,调用HEASC子程序。,程序如下: HEX_TO_ASCII: MOV A,40H;直接寻址,(40H)A SWAP A ;两位16进制数半字节交换 PUSH ACC ACALL HEASC POP ACC,37,MOV R1,A;高半字节转换成ASCII码存结果 INC R1 PUSH 40H ACALL HEASC POP ACC MOV R1,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号