单片机实训教程电子教案_第1页
单片机实训教程电子教案_第2页
单片机实训教程电子教案_第3页
单片机实训教程电子教案_第4页
单片机实训教程电子教案_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

1、3 .1 实 训 概 要 程序是一系列有序指令的集合。单片机通过执行程序完成相应的任务。 程序设计的任务就是根据任务的要求,给出解决问题的步骤和算法,编制程序的过程。学习完指令系统后,就具备了程序设计的基础。汇编语言程序设计不但技巧性强,而且还有软硬件结合的特点。设计出的程序质量好坏,直接关系到单片机应用系统的特性和运行效率。为了能够编制出高质量的程序,必须从一个个程序模块的学习开始,通过熟读多练,反复上机训练,才能逐步掌握程序设计的方法和技巧。 第3章 汇编语言程序设计实训内容:顺序程序设计。 分支程序设计。 循环程序设计。 子程序设计。预备知识:汇编语言程序设计的一般步骤:分析问题。根据给

2、出的问题,熟悉和明确问题的要求,明确已知条件及对运算和控制的要求,建立数学模型。确定解题算法。根据实际问题的要求和指令系统的特点,选择解决问题的方法。算法是程序设计的依据,它决定了程序的正确性和程序的质量。画出程序流程图。程序流程图就是用各种规定的图形、流程线和简洁的文字表达解题步骤的一种图形。它直观、清晰地体现了程序设计思路,是程序的逻辑设计过程。资源分配。算法确定后,要为每一个变量、各种指针、计数器等分配工作单元,定义数据类型和数据结构。 根据程序流程图及资源分配情况,写出汇编语言源程序。上机调试。汇编语言源程序的一般结构: 在程序设计中将会遇到各种类型的程序,但不论程序如何复杂,都可以分

3、为如下基本结构: 顺序结构 分支结构 循环结构 子程序结构 其中顺序结构、分支结构和循环结构为三中基本结构。其结构流程如图3-1所示。入口MNP出口入口MN满足条件?出口入口满足条件?M改变条件?出口 3 .2 实训9 顺序程序设计训练321 实训目的 通过本节实训,主要学习下面内容:顺序程序的结构。顺序程序设计的编程方法。顺序结构程序的调试方法。322 实训要求1双字求和。设有两个四字节二进制数,分别存放在片内RAM30H和40H开始的单元中,先存低字节。求两数之和,并将和存于50H开始的单元中。2双字节二进制无符号数乘法。323 实训预习预习内容(1)掌握顺序程序的结构。(2)复习片内数据

4、存储器地址范围。(3)复习数据传送指令和二进制加法指令的功能。(4)复习乘法指令的功能。 程序设计基本思路(1)双字求和 编写程序前要掌握片内RAM的结构。MCS-51单片机片内RAM一个存储单元为一个字节,以字节为单位编址。因此,每个加数和结果各占四个字节。按照加法的相加思路,先做低字节相加,然后做高位字节相加。例如: 进行多字节加法运算时,低字节应选择不带进位加法指令ADD。其它字节相加时应选择带进位加法指令ADDC,将低位的进位值加入。(2)双字节二进制无符号数乘法 双字节二进制无符号数乘法的运算过程类似于一般十进制运算。首先进行资源分配:设被乘数存放在工作寄存器R2、R3中,乘数存放在

5、R6、R7中。乘积存放在R2、R3、R4和R5中。然后进行运算,先算低字节,并保存中间和,再计算高字节,将中间和累加。 324 实训器材 MCS-51单片机开发系统325 实训程序 1多字节加法实训程序如表3-1所示。 存储地址机器码行号源程序寻址方式20001ORG2000H2000E5302MOV A,30H200225403ADD A,40H2004F5504MOV 50H,A2006E5315MOV A,31H200835416ADDC A,41H200AF5517MOV 51H,A200CE5328MOV A,32H 200E35429ADDC A,42H2010F55210MOV

6、52H,A2012E53311MOV A,33H2014354312ADDC A,43H2016F55313MOV 53H,A2018920014MOV 00H,C201A53200115ANL 20H,#01H201D85205416MOV 54H,20H17END2双字节乘法实训程序如表3-2所示。 存储地址机器码行号源程序 寻址方式20001 ORG 2000H2000EB2 MOV A,R320018FF03 MOV B,R72003A44 MUL AB2004ACF05 MOV R4,B2006FD6 MOV R5,A2007EB7 MOV A,R3 20088EF08 MOV B,

7、R6200AA49 MUL AB200B2C10 ADD A,R4200CFC11 MOV R4,A200DE412 CLR A200E35F013 ADDC A,B2010FB14 MOV R3,A2011EA15 MOV A,R220128FF016 MOV B,R7 2014A417 MUL AB20152C18 ADD A,R42016FC19 MOV R4,A2017EB20 MOV A,R3201835F021 ADDC A,B201AFB22 MOV R3,A201BE423 CLR A201C3324 RLC A201DCA25 XCH A,R2 201E8EF026 MOV

8、B,R62020A427 MUL AB20212B28 ADD A,R32022FB29 MOV R3,A2023EA30 MOV A,R2202435F031 ADDC A,B2026FA32 MOV R2,A33 END326 实训步骤(1)阅读并理解程序,并画出两个程序的流程图。(2)将机器码送入单片机系统中,并检查是否正确。(3)对于多字节加法实训程序,运行程序前,将两个四字节数据分别送入30H和40H开始的单元中。 (4)单步执行程序,并将运行结果记录在表3-3中。12 34 56 78H + 23 45 67 89H = ?AB CD EF 01H + 94 39 82 71H =

9、 ?2A 3B 4C 5DH + 3F 4E 5D 6CH = ?(5)对于双字节乘法实训程序,运行程序前,将被乘数和乘数分别送入工作寄存器R2、R3和R6、R7中,执行程序,并记录结果。程序运行结果表格请读者自行设计。 程序运行前程序运行后30H40H50H31H41H51H32H42H52H33H43H53H54H327 思考与讨论1如何将程序改成十字节加法运算,编写程序并上机验证。2编写四字节减法程序,要求被减数和减数分别存放在片内RAM30H和50H开始的单元中,差存放在60H开始的单元。上机验证。3使用减法指令时应注意什么问题? 提示: 多字节加法实训程序可以考虑用循环结构完成,通过

10、固定次数循环实现多字节相加。 双字节乘法程序由于要保护中间和,占用的片内RAM单元较多,可考虑使用堆栈,但不能和工作寄存器组发生冲突。3 .3 实训10 分支程序设计训练331 实训目的 通过本节实训,主要学习下面内容: 分支程序的结构。 分支程序设计的编程方法。 分支结构程序的调试方法。 通过散转指令实现多分支程序设计方法。 332 实训要求 设单片机片内数据存储器20H单元存放00H03H四个不同的数。根据20H中存放数据的不同,在LED七段显示器上显示循环左移的数字0、1、2、3。即: 333 实训预习 JMP A+DPTR 是一条散转指令。它常用于多分支选择程序中。数据指针DPTR作为

11、基址寄存器,决定多分支程序的首地址,用累加器ACC作为变址寄存器来动态地选择某一分支,来实现多分支转移。该指令采用基址寄存器加变址寄存器间接寻址方式,将DPTR和ACC内容相加作为地址,该地址传送到程序计数器PC中。 为了在单片机开发系统上显示数字,必须了解所使用的单片机开发系统的显示器控制接口,通常用多功能接口芯片8155控制键盘和显示器。了解其字形口和字位口地址。(本系统字形口地址为0FF22H,字位口地址为0FF21H)。 同时,还应了解所用单片机开发系统的LED显示器是共阴极型还是共阳极型。以便给出其不同的字形码。不同类型LED字形码如表3-4所示。本系统采用共阳极型LED。表3-4

12、七段LED字形码 字符 共阳字形码 共阴字形码 字符 共阳字形码 共阴字形码 0 C0H 3FH C C6H 39H 1 F9H 06H D A1H 5EH 2 A4H 5BH E 86H 79H 3 B0H 4FH F 8EH 71H 4 99H 66H P 8CH 73H 5 92H 6DH Y 91H 6EH 6 82H 7DH U C1H 3EH 7 F8H 07H H 89H 76H 8 80H 7FH L C7H 38H 9 90H 6FH BFH 40H A 88H 77H “灭” FFH 00H B 83H 7CH 334 实训器材MCS-51单片机开发系统335 程序流程及实

13、训参考程序实训程序流程如图3-2所示。实训参考程序如表3-5所示。 开始(A)+散转地址(A)(20H)0字循环1字循环2字循环3字循环 存储地址机器码行号源程序注释20001ORG 2000H2000E5202MOV A,20H索引20029020103MOV DPTR,#KK转移指令表首地址2005234RL A2006735JMP A+DPTR20106ORG 2010H2010 7KK: AJMP A0转移指令表2012011E8AJMP A1201401249AJMP A22016012A10AJMP A320187520C011A0: MOV 20H,#0C0H“0”字形码201B

14、02203012LJMP BB201E7520F913A1: MOV 20H,#0F9H“1”字形码202102203014LJMP BB20247520A415A2: MOV 20H,#0A4H“2”字形码202702203016LJMP BB202A7520B017A3: MOV 20H,#0B0H“3”字形码 202D02203018LJMP BB2030E52019BB: MOV A,20H2032782220MOV R0,#22H8155字位口地址2034792121MOV R1,#21H8155字形口地址2036F222MOVX R0,A2037740123MOV A,#01H位置

15、号2039F324BB1:MOVX R1,A203A12205025LCALL DELY延时203D2326RL A203E80F927SJMP BB1 205028ORG 2050H20507D0429DELY:MOV R5,#4延时子程序20527EFA30L3: MOV R6,#25020547F6431L2: MOV R7,#10020560032L1: NOP20570033 NOP20580034 NOP2059 35 DJNZ R7,L1205BDEF736 DJNZ R6,L2205DDDF337 DJNZ R5,L3205F2238 RET39 END336 实训步骤(1)理

16、解程序,弄清程序执行过程。(2)将机器码送入单片机系统中,并检查是否正确。(3)运行程序前,将00H03H四个数中任意一个数送入20H单元中。(4)单步执行程序,逐条分析指令,看转移指令的条件是否满足,判断是否转移或不转。(5)观察数字在LED显示器上的移动方向,说明是程序中哪条指令控制转移的方向。337 思考与讨论1第4行指令 RL A 的作用是什么?它和哪一条指令相关联?2设单片机晶振频率为6MHz,试计算延时子程序的延时时间。修改延时时间对数字显示会有什么影响?3第7行指令 AJMP A0的转移范围是多少?将其翻译成机器码。4将程序修改成十个分支程序,在显示器上分别显示09十个数字。5分

17、析第25行指令 LCALL DELY 的堆栈使用情况。6第35行指令 DJNZ R7,L1的转移条件是什么?将其翻译成机器码。提示: 执行本程序,应仔细分析每一条指令的执行过程。 结合共阴极型和共阳极型LED七段显示器,分析字形码形成过程。 3 .4 实训11 循环程序设计训练341 实训目的 通过本节实训,主要学习下面内容:循环程序的结构。循环程序设计的编程方法。循环结构程序的调试方法。固定次数循环和非固定次数循环程序的实现。 342 实训要求1编制将片内RAM从30H开始的五十个单元置数据88H的程序。2编制数组排序程序:将片内RAM50H单元开始的十个单元内数据从小到大排序。343 实训

18、预习 进行循环程序设计,要掌握循环程序的结构。其结构一般包括以下四个部分:1循环的初始化: 这是循环的准备部分。用于循环过程的工作单元,在这一部分设置初始值。2循环的工作体: 它是完成处理任务的核心部分。随具体问题而定。3循环的修改部分: 每进行一次循环,循环的工作体部分都要作相应的修改。为使循环的操作对象按要求改变,应对每次循环的控制变量进行必要修改,以便为下次循环处理做好准备。4循环的控制部分: 这一部分判别和控制循环的结束与否。344 实训器材 MCS-51单片机开发系统345 实训参考程序1将片内RAM30H开始的五十个单元置数据88H程序见表3-6所示。 存储地址机器码行号源程序 注

19、释 1ORG 2000H20007F322MOV R7,#50200278303MOV R0,#30H200474884MOV A,#88H2006F65A1 : MOV R0,A2007086INC R02008DFFC7DJNZ R7,A18END 2将片内RAM50H单元开始的十个单元内数据从小到大排序。实训程序见表3-7所示。存储地址机器码行号源程序 注释 1ORG 3000H3000C2D52STA: CLR F030027B093MOV R3,#9300478504MOV R0,#50H3006E65MOV A,R03007086A1: INC R03008F97MOV R1,A

20、3009968SUBB A,R0300AE99MOV A,R1300B400610JC A2300DD2D511SETB F0300FC612XCH A,R030101813DEC R03011C614XCH A,R030120815INC R03013E616A2: MOV A,R03014DBF117DJNZ R3,A1301620D5E718JB F0,STA3019011919AJMP $20END 346 实训步骤(1)对于表3-6实训程序给每条指令加注释,填入实训表中。根据程序画出程序流程图。将程序修改成对片内RAM从30H开始的三个单元置数操作,用单步执行命令仔细检查每步运行结果

21、,各寄存器及地址变化情况。将程序还原,用连续执行命令执行程序,检查结果。 (2)对于表3-7实训程序给每条指令加注释,填入实训表中。根据程序画出程序流程图。用单步执行命令仔细检查每步运行结果,各寄存器及地址变化情况。填入表3-8中。用连续执行命令执行程序,检查结果。在50H59H中任意给出一组数据,执行程序进行排序,并检查结果。 运行前运行后地址内容地址内容地址内容地址内容50H2AH55H68H50H55H51H11H56H20H51H56H52H57H57H97H52H57H53H83H58H55H53H58H54H29H59H13H54H59H 347 思考与讨论1编写将片外RAM 50

22、00H开始的200个单元清零程序。2将上例数组排序程序改为从大到小排列。提示:通过对表3-6实训程序的学习可知,对于固定次数的循环,可以预先设置循环计数初始值,存放在一个工作寄存器中,作为计数器,然后用减1非零转移指令DJNZ实现循环。 对于表3-7实训程序,属于无固定次数的循环。这是一个双重循环,在内层循环中,虽然知道十个数要循环比较九次,但不知道所给数组的数据排列情况,外层循环预先不知道要循环多少遍。可采用设置标志位的办法。如本程序使用PSW的用户标志位F0,开始清“0”F0,若有数据互相换位,则置位F0,当最后数组顺序已排好后,重新执行一遍程序,则不会出现数据换位现象,F0仍然为0,序已

23、排好,程序结束。3 .5 实训12 子程序设计训练351 实训目的 通过本节实训,主要学习下面内容:子程序的结构。子程序设计的编程方法。子结构程序的调试方法。主程序调用子程序及子程序返回主程序的过程。 352 实训要求 将片内RAM30H存放的压缩BCD码转换成ASCII码,存放到50H起始的内存单元(50H为高位)。试编程实现。353 实训预习 子程序是程序设计的重要方法之一。在程序设计中经常遇到重复出现的程序段,如果每次都把这种程序段抄写一遍,不仅会使程序冗长,也不易阅读和调试。这时候可采用子程序的设计方法。 1子程序相关指令: (1)调用指令:该指令放在主程序中,用于主程序调用子程序。

24、LCALL addr16:长调用。调用时,将本指令下一条指令的地址推入堆栈保护起来,然后将子程序的入口地址送入程序计数器PC中。该指令可在64KB程序存储器范围内任意调用。 ACALL addr11:短调用。功能与长调用指令类似,只是调用范围在一页(2KB)范围内。 (2)返回指令:该指令放在子程序最后,用于子程序返回子程序。 RET:返回指令。将堆栈中保护的调用指令下条指令的地址弹到程序计数器PC中。以返回断点出继续执行主程序。 2子程序设计步骤(1)确定子程序的名称(即入口处的标号)。(2)确定子程序的入口参数及出口参数。(3)确定所使用的寄存器和存储单元及其使用目的。(4)确定子程序的算

25、法,编写源程序。354 实训器材单片机开发系统355 实训参考程序主程序及子程序实训参考程序见表3-9所示。 存储地址机器码行号源程序注释00301 BCD EQU 30H00502 ASCII EQU 50H20003 ORG 2000H2000E5304START: MOV A,BCD主程序2002C45 SWAP A2003C0E06 PUSH ACC20051220127 LCALL A1 2008D0508 POP ASCII200AC0309 PUSH BCD200C 10 ACALL A1200ED05111 POP ASCII+1201080FE12 SJMP $2012158

26、113A1: DEC SP子程序2014158114 DEC SP2016D0E015 POP ACC2018540F16 ANL A,#0FH201A90202517 MOV DPTR,#ASCTAB201D9318 MOVC A,A+DPTR201EC0E019 PUSH ACC2020058120 INC SP2022058121 INC SP20242222 RET2025302C312C23ASCTAB: DB 0,1,2,3,4 2029322C332C202D34202E352C362C24 DB 5,6,7,8,92032372C382C20363925 END 356 实训步

27、骤(1)给每条指令加注释,填入实训表中。(2)根据程序画出程序流程图。(3)检查长调用指令LCALL执行之前堆栈的使用情况。(4)检查调用指令执行之后堆栈的使用情况。(5)计算短调用指令ACALL的机器码,并填入实训程序表中。 (6)检查返回指令RET执行之前堆栈的使用情况。(7)检查返回指令RET执行之后堆栈的使用情况。提示: 在编制主程序和子程序的程序设计中,要考虑参数传递。所谓参数传递,即主程序先把有关参数放在某些约定的位置,如工作寄存器R0、R7中、特殊功能寄存器或堆栈中,子程序运行时可以从这些约定位置得到相应的入口参数。子程序结束运行前,也要把运算结果送到约定位置,以便返回主程序后,主程序能够从这些地

温馨提示

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

评论

0/150

提交评论