单片机原理与应用及实验报告_第1页
单片机原理与应用及实验报告_第2页
单片机原理与应用及实验报告_第3页
单片机原理与应用及实验报告_第4页
单片机原理与应用及实验报告_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、单片机原理与应用(二)第三章 单片机的指令系统及程序设计单片机的应用可归纳为是对单片机的内、外存储器进行“存取”的操作,而“输入输出”的操作是对p0、p1、p2、p3这四个与芯片外部引脚相连的专用存储器的“存取”。 “存取”操作是在存储器之间进行的,可以直接用存储器的地址,如18、35h也可以用专用的或自定义的变量名,如 a,r1, p3, addr1,x1,on。3.1 mcs-51单片机指令系统概述共有111条指令。指令长度:单字节有49条,双字节有45条,三字节有17条。执行时间:单周期指令有57条,双周期指令有52条,四周期指令有2条。有7种寻址方式,42种助记符,33种功能。指令可分

2、为三大类:1数据传送指令:mov、movc、movx2运算指令: addc、subb、rlc、anl、setb、clr3转移控制指令:ljmp、jb、jnb、jz、cjne、djnz、lcall、ret指令格式:标号: 功能助记符 (目标操作数),(源操作数) ;注释 例 start: mov r1,#25h ; 常数25h送给寄存器r1 mov a,45h ; 地址45h单元中的内容送给寄存器a功能助记符也叫操作码。3.2 mcs-51单片机指令系统的寻址方式 立即(常数)寻址:mov a,#18 ; 等价于c语言的a=18 表示为:aß18mov a,#3ch ; 等价于c语言的

3、a=0x3c aß3ch mov dptr,#25d8h 直接寻址: mov a,18 ; 等价于c语言的a=数组名18 aß(18)mov a,5bh ; 等价于c语言的a=数组名5bh aß(5bh) mov dph,62h anl 40h,#50hljmp 1234h 寄存器寻址: mov a,r1 ; 等价于c语言的a=r1 aßr1mov 27h,sp 寄存器间接寻址:mov a,r1 ; 等价于c语言的a=数组名r1 aß(r1)movx a,r1 movx a,dptr ; 等价于c语言的a=数组名dptr aß(dpt

4、r)mov r0,#56h ; 等价于c语言的数组名r0=0x56 (r0)ß56h 相对(pc)寻址: sjmp 0e4h ; 等价于c语言的 goto 标号;jz -115 ; 等价于c语言的 if (a=0) goto 标号; 变址寻址:movc a,a+dptr ; 等价于c语言的a=数组名a+dptr aß(a+dptr)movc a,a+pc 位寻址: mov c,25h cß(25h) mov 25h,c (25h)ßc setb p1.0 p1.0ß1 clr p2.5 p2.5ß0 setb 37h (37h)

5、23;1 应表示为:(26h).7ß1 更确切。 因为: mov 37h, #1 也表示为:(37h)ß1 3.3 mcs-51单片机指令系统的使用要点 3.3.1 会影响标志位的指令psw中的 c:进位 ac:半进位 ov:溢出 p:奇偶例:(-104)+(-117)= (10011000) + (10001011) 补码运算执行 mov a, #98h 10011000 add a, #8bh 10001011 之后 a=23h=35, c=1, ac=1, ov=1, p=1 100100011关于溢出:指令进行算术运算时,是以补码进行的。 值的范围:-128+127

6、,当运算的结果超出此范围时,ov=1 。例:(-5)+(-6)= (11111011) + (11111010)执行 mov a, #0fbh 11111011add a, #0fah +11111010之后 a=f5h= -11, c=1, ac=1, ov=0, p=0 111110101 3.3.2 伪指令:提供汇编的控制信息。1. org 16位地址 ;指明下一条的地址 例1:org100h ;指明下一条指令的地址是100hljmpmain1 ;这条指令从程序存储器地址的100h开始存放2. 标号: db 单字节数据项表 ;针对程序存储器 例2: org 2000h ma:db 68h

7、,0f5h,128 ;ma2000h,(2000h)=68h,(2001h)=128 若执行指令 mov dptr,#ma ;等价于 mov dptr,#2000h clr a ; aß0movc a,a+dptr ;aß(a+dptr)=(0+2000h)=68h3. 标号: dw 双字节数据项表 ; 例3: org0f00h ma: dw68f5h,0234h4. 名字 equ 表达式 ;给表达式的值或字符串取名这里的“名字”等同于高级语言中的变量名。高级语言中注重“变量”,而汇编语言注重“地址”。 例4:abcequ58h ; abc58h dianhuoequp1.

8、4 ; dianhuop1.4指令 mova,abc ; 等价于 mov a,58h ;aß(58h)指令 mova,#abc ; 等价于 mov a,#58h ;aß58h 指令 setbdianhuo ; 等价于 setb p1.45. 名字 data 直接字节地址 ;给内存ram单元取名 6. 名字 wdata 直接字节地址 ;给外存ram单元取名7. 名字 bit 位地址 ;给可寻址的位单元取名例5: dianhuo equp1.4 ; dianhuop1.4(或 dianhuo bitp1.4 ; dianhuop1.4 ) 指令 setbdianhuo ; 等价

9、于 setb p1.4bit、data、wdata是equ的特例。8. 标号: end ;9. 标号: ds 表达式 ;空出若干个存储单元 3.3.3 指令系统的分类:共111条,可分为五大类。1. 数据传送指令:不影响c、ac、ov ,影响p。1). 内部数据存储器ram的传输指令 汇编指令 机器指令 mov a,r5 11101r r r mov a,65h 11100101 01100101 mov a,#65h 11100100 01100101 mov a,r1 1110011 i mov r6,a (书上有错) mov r3,82h 10101r r r 10000010 mov

10、r0,#7dh 01111r r r 01111101 mov 15h,a ; (15h)ßa mov 38h,r5 ; (38h)ßr5 mov 6eh,r1 ; (6eh)ß(r1) mov 53h,#8eh ; (53h)ß8eh例: k3equ 38h ; 请注意格式的对齐 mov k3,r5 ; (k3)ßr5 mov 0e3h,2ah mov r0,a mov r1,75h mov r0,#3bh mov dptr,#15a3h ; dptrß15a3h push 67h ; spßsp+1 , (sp)

11、3;(67h) pop psw ; pswß(sp), spßsp1 xch a,r3 ; 字节交换 ar3 xch a,27h ; a(27h) xch a,r1 ; a(r1) xchda,r0 ; 字节的低4位交换,高4位不变 swapa ; a的高4位和低4位交换2). 累加器a与外部数据存储器ram的传送指令 movx a,dptr ; aß(dptr) movx dptr,a movx a,r1 ;aß(p2r1) movx r0,a ;(p2r0) ßa3). 查表指令(对程序存储器rom) movc a,a+pc movc a,

12、a+dptr ; aß(dptr+a)例:对内部ram:mov a,r0 ; r0的内容为表格中存放数据的地址。对外部ram:movx a,r0 ; p2,r0 为存放数据的地址movx a,dptr ; 对程序rom:movc a,a+dptr ;一般a=0,dptr作为增量。 表中取出的值与指定的值(如字符b)比较、判别: cjne a, b, l1或 cjne a,#42h,l1 ; 若 a42h 则转移到l1执行。2. 算术操作指令1). 加法指令 :、会影响c、ac、ov 、p。 不带进位的加法运算 add a,r3 ; aßa+r3 带进位的加法运算 addc

13、a,r3 ; aßa+r3+c 增量指令 inc a inc r4 ; r4ßr4+1 inc r1 ; (r1)ß(r1)+1 十进制调整指令 da a ; 当a的高四位(低四位)的c=1(ac=1)或者大于9,则进行加6调整。例: mov a,#59h add a,#69h ; aß59h+69h=c2h, c=0, ac=1 必须保证两个操作数均为bcd码 da a ; aßc2h+66h=28h,c=12). 减法指令 :会影响c、ac、ov 、p。 带借位减法指令 subb a,r5 subba,63h ; aßa(63h)

14、c subb a, r1 subb a,#4ah 减1指令 dec a dec r3 dec r1 dec 57h3). 乘法指令 mul ab ; aßa×b 结果的高8位在b, 低8位在a。4). 除法指令 div ab ; aßab 结果的商在a, 余数在b。3. 逻辑运算指令1). 单操作数逻辑运算指令 累加器清零 clr a 其余的寄存器或存储单元的清零,只能用 mov r3,#00h 累加器取反 cpl a 累加器左移 rl a rlc a ; 带进位c 累加器右移 rr a rrc a ; 带进位c2). 双操作数逻辑运算指令:注意操作数没有 anl

15、 35h,r2的形式。 逻辑与 anl 35h,a ; (35h)ß(35h)a 逻辑或 orl a,r1 ; aßa(r1) 逻辑异或 若 mov 6bh,#0c5h 11000101 xrl 6bh,#59h ;(6bh)ß(6bh) + 59h=9ch + 01011001主要用在判断两个字节内容是否相等。 10011100 相等时的结果为0。4. 控制转移指令 1). 无条件转移 ajmp 11位地址 ;(pc)ßpc的高5位后接11位地址 pc的高5位 地址段(2kb) 00000bbb xx 000007ff 00001bbb xx 0800

16、0fff 00010bbb xx 100017ff 00011bbb xx 18001fff | | 11110bbb xx f000f7ff 11111bbb xx f800ffff sjmp -128+127的偏移量 ;pcßpc+2+错误!链接无效。 ljmp 16位地址 ;pcß 16位地址 jmp a+dptr ;pcß(a+dptr)例: 应用jmp指令实现switch case转移功能。 start: mov dptr,#temp mov 35h,arl a add a,35h ;a=a*3 jmpa+dptr temp: ljmp cl0 ; 当a

17、=0 ljmp cl1 ;当a=1 ljmp cl2 ;当a=2 ljmp cl9 ;当a=92).条件转移 测试条件转移 jz -128+127的偏移量 ; 当(a)0时,(pc)ß(pc)+2+偏移量 jnz -128+127的偏移量 ; (a)0 jc -128+127的偏移量 ; (c)1 jnc -128+127的偏移量 ; (c)0 jb bit,-128+127的偏移量 ; (bit)1 ,(pc)ß(pc)+3+偏移量 jnb bit,-128+127的偏移量 ; (bit)0 jbc bit,-128+127的偏移量 ; (bit)1 ,同时(bit)&#

18、223;0 比较不相等转移cjne a,#69h,-128+127的偏移量 ;当(a)69h时,pcßpc+3+偏移量 ;当(a)<69h时, pcßpc+3 循环控制转移djnz r5,-128+127的偏移量 ;r5ßr51,;当r50时,pcßpc+2+偏移量djnz 37h,-128+127的偏移量 ;(37h)ß(37h)1,;当(37h)0时,pcßpc+3+偏移量3).调用和返回 调用 acall 11位地址 ; lcall 16位地址 ;spßsp+1,(sp)ßpc+2的低字节, ;sp&#

19、223;sp+1,(sp)ßpc+2的高字节, ;pcß16位地址。 返回 ret ;子程序返回 pc的高字节ß(sp),spßsp1,;pc的低字节ß(sp),spßsp1。 reti ;中断返回4).空操作 nop 5. 位操作指令1). 位传送mov c,27h mov 5dh,c2). 位修改(置位或清零) clr c ;cß0 clr p1.4 cpl c ; 求反 cpl 48h setb c ;cß1 setb 6dh3). 位逻辑与 anl c,45h ;cßc(45h) anl c,/4

20、5h ;cßc(45h)4). 位逻辑或 orl c,5bh ;cßc(5bh) orl c,/5bh ;cßc(5bh) 各种指令操作码的含义:1. mov: 内部数据存储器传送 16. xch: 两字节交换 31. add:不带进位的加法2. movx:外部数据存储器传送 17. jbc:位变量为1则置0并转移 32. clr: 清0 3. setb: 位变量置1 18. inc: 加1 33. sjmp:相对于pc转移4. swap:acc的高低4位交换 19. movc:外部程序存储器传送 34. ajmp:短转移5. reti:中断返回 20. lcal

21、l:子程序长调用 35. rlc:带进位左移6. cjne:比较不相等则转移 21. djne:相减结果为0则转移 36. mul:乘法7. jz: acc的内容为0则转移 22. subb:带进位减法 37. da: 十进制调整8. addc:带进位的加法 23. pop: 出栈 38. xchd:低半字节交换9. anl:逻辑与 24. cpl: 位变量取反 39. jb: 位变量为1则转移 10. rrc:带进位右移 25. jnz:acc的内容不为0则转移 40. rl: 左移11. xrl:逻辑异或 26. orl: 逻辑或 41. jnc:进位位不为1则转移12. div:除法 2

22、7. jnb: 位变量为0则转移 42. ret:子程序返回13. ljmp:长转移 28. push:进栈 43. jmp:间接转移14. dec:减1 29. nop: 空指令 44. acall:子程序短调用15. rr: 右移 30. jc: 进位位为1则转移 45. 伪指令作业二:填空题:1. 通用寄存器r0r7在工作寄存器区中有四组,由程序状态字中的 位和 位来选择确定。2. mcs-51片内地址 范围内的数据存储器,既可以字节寻址又可以位寻址。3. 在mcs51单片机中,如果采用6mhz晶振,则1个机器周期的执行时间是 。4假定累加器a=49h,执行指令:201ah: movc

23、a,a+pc后,送入a的是程序存储器 单元的内容。5若dptr=5306h,a=49h,执行下列指令:movc a,a+dptr后,送入a的是程序存储器 单元的内容。6假定sp=45h,acc=46h,b=47h,执行下列指令:push accpush b后,sp= ,(46h)= ,(47h)= 。7假定sp=47h,(46h)=46h,(47h)=47h。执行下列指令:pop dphpop dpl后,dptr= ,sp= 。8若a=56h,r0=56h,(56h)=79h。执行指令:add a,r0后,a= ,cy= ,ac= ,ov= 。9若a=0ffh,r0=46h,(46h)=0ff

24、h,cy=1。执行指令: addc a,r0后,a= ,cy= ,ac= ,ov= 。10假定a=45h,b=67h。执行指令: mul ab后,寄存器b= ,累加器a= ,cy= ,ov= 。11假定a=0fch,b=35h。执行指令:div ab后,累加器a= ,寄存器b= ,cy= ,ov= 。3.4 汇编语言程序设计及实用程序举例关于结构化程序设计(面向过程) 自顶向下,逐步细化。细化的每个步骤应尽可能划分成大的部分:即能划分成三部分就不要划分成四部分,能划分成两部分就不要划分成三部分。直至不能再分解。对每个部分模块化,每个模块使用结构化方法设计。【补充:关于面向对象的程序设计(在结构

25、化程序设计的基础上面向数据)】顺序结构程序 双分支结构程序3.4.1 顺序结构程序3.4.2 分支结构程序 n s1=1 y l1 指令系列1 指令系列2 与框图对应的程序:(s1是位变量) l2单分支结构程序: 双分支结构程序:(其他指令) (其他指令) 单分支结构程序 jbs1,l1 jbs1,l1 指令系列 指令系列1 s1=1 yl1: (其他指令) sjmp l2 n l1:指令系列2 指令系列 l2:(其他指令) l1 3.4.3 循环结构程序 1.先循环后判别 2.先判别后循环r3为专用变量名 l1 l11.先循环后判别 (其他指令) 指令系列 r3=0 y l1: 指令系列 l

26、2 n djnz r3,l1 n r3=0 指令系列 (其他指令) y l3djnz r3,l1 这一条指令执行的结果为: r3ßr31 如果 r30 则 转移到l1 否则 执行下一条指令。2.先判别后循环方法一: 方法二: 方法三: (其他指令) (其他指令) (其他指令)l1: djnz r3,l2 l1: mov a,r3 l1: mov a,r3 sjmp l3 jz l3 jnz l2l2: 指令系列 l2: 指令系列 sjmp l3 sjmp l1 sjmp l1 l2:指令系列l3: (其他指令) l3: (其他指令) sjmp l1 (其他指令)3.4.4 子程序设计

27、1. 子程序的结构例:软件延时3ms,设fosc=6mhz。delay3: movr5,#3 del0: movr4,#250 del1: djnzr4,del1 ;250×4s=1ms djnzr5,del0 ret 使用 lcall delay3 或 acall delay3 调用。软件延时程序流程图: 软件延时 r5ß3 r4ß250 r4ßr4-1n r4=0 y r5ßr5-1 n r5=0 y ret 2. 子程序的参数传递 1) 无参数 2) 用累加器a、寄存器r0r7 3) 通过操作数地址 4) 通过堆栈:见p49页的例3-49

28、 3. 现场保护和恢复现场:主要在中断子程序的进入。 4. 堆栈的设置:sp的初值为07h,应予再设置,如mov sp,#60h。 5. 子程序的嵌套:与堆栈的存储空间有关。3.4.5 单片机实用程序 1.【例3-44】求表中最小的数(查表)并保存。2.【例3-45】延时子程序3.【例3-47】两个8位二进制数相加4.【例3-50】双字节bcd转换成二进制数 (书上有遗漏指令,因其说明有误。) 5.【例3-51】8位二进制数转换成三位bcd码;6.【例3-52】二进制码转换成ascii码;7.【例3-53】ascii码转换为4位二进制数。8. 双字节bcd相加9. 双字节无符号数相加、相减;1

29、0. 双字节乘、除单字节(举例:模拟运行验证结果) 分析:设r5、r4为被乘数, r3为乘数,则 (r7、r6)ßr5*r3, (b、a)ßr4*r3, r5ßa, r6ßr6+b,r7ßr7+c,结果在r7、r6、r5中。 补充:单片机上的主程序大多如下所示:主程序led(扫描)显示输出键盘(扫描)输入键处理事件处理每一个实验作业都要写实验报告,报告中必须具有以下7项内容:( 全文必须做在实验作业纸上用水笔手写。)1. 题目 2. 硬件原理电路图以及电路原理说明 3. 软件方法 4. 实验步骤说明 5画出程序流程图 6写出实验后正确的程序并加

30、以注释7. 小结:实验过程中遇到的问题和解决的办法,完成实验的关键点、有何注意事项,心得体会等。 实验报告一(上机实验作业一)一、题目:信号灯控制。内容:1. 把一个发光led的正极经电阻接至p1.0口,led的负极接地;2. 把一个拨动开关的一端上拉并接至p1.1口,另一端接地;3. 编程实现控制,当开关闭合时指示灯闪亮,断开则熄灭。二、硬件原理:1.硬件逻辑电路图: 8051 led 灯 vcc +5v p1.0 ea xtal1 +5v xtal2 开关 rst p1.1 gnd 2.电路原理说明:开关闭合时,p1.1=0; 开关断开时,p1.1=1 。 p1.0=0时,led灯熄灭; p1.0=1时,led灯点亮。三、软件方法: 当检测到p1.1口位为低电平时,控制p1.0口位输出“1”,软件延时约200ms;然后输出“0”,软件再延时约200ms;再输出“1”,如此循环,直至检测到p1.1口位为高电平为止; 当检测到p1.1口位为高电平时,控制p1.0口位输出“0”,再重复检测p1.1口位的电平,如此循环。四、实验步骤:使用proteus仿真软件 1. 运行pc机上的pro

温馨提示

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

评论

0/150

提交评论