片机原理及应用_第1页
片机原理及应用_第2页
片机原理及应用_第3页
片机原理及应用_第4页
片机原理及应用_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

1、单片机原理及应用2,51单片机并口及并口应用 51单片机晶振和复位 51单片机指令集 编者:康戈文,51单片机的并行接口,51单片机I/O具有4组,每组8位,共32位并行接口,按“第二功能”不同,结构也稍有不同。 P0口:并口/数据地址总线 P1口:并行接口 P2口:并口/地址高8位 P3口:并口,每个引脚还有不同功能:RXD;TXD;INT0;INT1;T0;T1;WR;RD,标准并行接口电路框图,51单片机P1口,引脚,51单片机P0口,读引脚,51单片机P2口,51单片机P3口,51单片机并口应用小结,并口基本功能:只要写“1”到锁存器,就可以读取引脚数据。 并口第二功能随指令变化: 使

2、用MOVX/MOVC指令时,P0/P2口自动切换到“地址、数据”方式 P3口第二功能是“直通”的,可以直接输出:WR、RD、TXD,直接输入:INT0、INT1、T0、T1、RXD。由程序和电路直接相应(预先设定功能,采用相应指令),并口输出应用举例,单片机连接光耦合器件,89C51晶振电路,电容:2033pf(常:30pf) 晶体:1.216MHZ(常:12M),指令时序,时序要点:,一个指令周期1,2或者4个机器周期 一个机器周期12个晶振周期 一个机器周期输出两个ALE脉冲 即: ALE的输出频率fALE(1/6)fOSC 如果使用晶振频率为12MHZ,则fALE 2MHZ,指令执行时间

3、1,2,4微秒。,复位电路,上电复位时序,复位后寄存器状态,PC0000 程序从0000开始执行,ROM的这个地址也称为“复位地址” PSW=0 其中RS1,RS1=0,默认主程序使用寄存器组0 SP=07 堆栈从RAM的07地址开始,一般需要更改堆栈栈底值 P0P3=FFH 引脚输出高电平 IE=0X000000B 所有中断被关闭 IP=0X000000B 所有中断无优先级 TMOD=00 定时器T0,T1模式0 TCON=00 定时器不工作. SCON=00 串行口默认使用方式0 PCON=0XXX0000B 无电源管理,无波特率2倍设置 其他如ACC;DPTR;TH0;TL0;TH1;T

4、L1;SBUF等可以不关心。,地址数据扩展电路,A8A15,A8A15,A8A15,A0A7,A0A7,A0A7,扩展后的地址数据时序,P0,ALE,P2,373出,74LS373 是一种“透明”的8D锁存器,当LE引脚为“高”时,输出输入。低电平时锁定数据。 Intel 8282 类似,但引脚不一样。 不能用其它锁存器代替。,51单片机(汇编)指令集,任何CPU的指令都使用“二进制”机器码! 用数字(代码)表达需要CPU执行的功能显然是极不方便的! 采用“助记符”表达“二进制机器码”,便于编写程序。 “助记符”也称为“助记符指令”。 用“助记符”编写的程序,称为“汇编语言程序” “助记符二进

5、制机器码”过程称为“汇编” “二进制机器码 助记符”过程称为“反汇编” 常用的指令表达方式为: 标号:助记符 操作对象1(结果),操作对象2,寻址方式,Addressing 地址(动名词),翻译为“寻址” 一般意义:可以访问的所有地址空间的“地址表达式” 指令中的意义:“地址”的表达形式: 直接用“地址码”表达称为“直接寻址” 用“寄存器内容”表达称为“寄存器间接寻址” 寄存器作为访问对象称为“寄存器寻址” 直接使用常数(立即数)称为“立即寻址” 固定地址偏移称为“变址寻址”,也称:基址变址 当前程序地址相对偏移相对寻址 操作数是位寄存器或者位变量位寻址 不同CPU还有其它表达方式(寻址方式)

6、,51单片机指令通用符号,Rn 代表R0,R1R7中任意一个,即:n=0,17 Ri 代表R0或R1,即:i=0.1 #data 代表8位立即数(常数) #data16 代表16位立即数(常数) Direct 代表直接地址:8位地址码(变量名)或寄存器 名:寄存器除A,Rn外) rel 带符号的8位相对偏移地址 Addr 11 addr16 11位或者16位地址 Ri 用Ri的内容表达地址(8位地址) DPTR 用DPTR的内容表达地址(16位地址) LABEL 程序入口的名称 BIT 位变量、位寄存器,如:P1.0, C, ACC.7等,51单片机寻址表达式1,直接寻址:操作对象是地址、变量

7、名、SFR中的寄存器名。例如: MOV 20H,A MOV SP,#30H PUSH ACC (寄存器)间接寻址:通过寄存器指出访问地址,寄存器只能使用R0,R1或DPTR,在寄存器前面冠以符号。例如: MOV R1,A MOVX DPTR,A 此表达方法可以方便地用于循环程序,51单片机寻址表达式2,寄存器寻址:对寄存器操作。寄存器指:Rn和A,其余“寄存器”不算。例如: MOV R4,A INC R7 立即寻址:操作数是常数(立即数)。常数前冠以符号#,例如: MOV A,#30 MOV 20H,#30H 位寻址:操作数是位寄存器或者位变量,例如: MOV P1.0,C SETB P1.1

8、,51单片机寻址表达式3,变址寻址:基本地址偏移量。基本地址用DPTR表达,偏移量用A表达,在寄存器前面冠以符号。例如: MOVC A,A+DPTR MOVC A,A+PC JMP A+DPTR 相对寻址:当前程序地址(相对偏移)即PC+rel,相对偏移是一个8位符号数rel,其范围128127之间,表达为另一个程序入口的label,此label的距离不能太远,汇编器自动计算出相对偏移。主要用于“条件转移”指令,例如: DJNZ R7,label JNC label,51单片机指令内部传送指令,立即寻址 MOV A,#DATA MOV Rn,#DATA MOV Ri,#DATA MOV Dir

9、ect,#DATA 直接寻址: MOV A,Direct MOV Direct,A MOV Direct,Rn MOV Ri,Direct MOV Direct1, Direct2,51单片机指令内部传送指令,间接寻址 MOV A,Ri MOV Ri,A MOV Direct1, Ri 寄存器寻址 MOV A,Rn MOV Rn,A MOV Direct1,Rn,51单片机指令外部传送指令,MOVX DPTR,A MOVX Ri,A MOVX A,DPTR MOVX A,Ri MOVC A,A+DPTR 查表指令 MOVC A,A+PC 补充:MOV DPTR,#data16 唯一16位传送,

10、51单片机指令堆栈操作指令,PUSH Direct 存储器内容存入堆栈 POP Direct 堆栈内容回存到存储器 注意,累加器A出入栈时,写为: PUSH ACC 和 POP ACC 堆栈指令只对“直接地址”有效!对A、Rn无效,51单片机指令数据交换指令,XCH A,Rn XCH A,direct XCH A,Rn 半字节交换指令: XCHD A,Ri 只交换低四位 SWAP A 累加器A的高4位和低4位交换,相当于字节循环移位4次,字节拆分程序举例,MOV MEM,#0 MOV MEM+1,#0;对MEM的连续两个存储器清零 MOV R0,#MEM;用R0表达MEM地址 MOV A,HE

11、X;读取待拆数据,假定为“0ABH” XCHD A,R0 ;MEM中为“0BH”,A中为“A0H” INC R0 SWAP A;A中高低4位互换,“A0H”变“0AH” MOV R0,A;存“0AH”到MEM+1 此程序常用作显示前的处理,一个数码管只能显示1个16进制数据,1字节数据要用2个数码管才能显示。,51单片机指令算术运算指令,加法: 带进位加法: ADD A,Rn ADDC A,Rn ADD A,direct ADDC A,direct ADD A,Rn ADDC A,Rn ADD A,#data ADDC A,#data 后者吧“C”作为最低位连同数据一起进行相加,常用于16位加

12、法的高8位相加。C是真正意义上的“进位”低8位相加后的进位。,51单片机指令算术运算指令,减法,必须带上“借位” SUBB A,Rn SUBB A,direct SUBB A,Rn SUBB A,#data 一般使用时,先要使C=0即: CLR C,16位减法时,高8位运算不要清除C,51单片机指令加1减1指令,INC A DEC A INC Rn DEC Rn INC direct DEC direct INC Ri DEC Ri 它们的操作不影响状态标志PSW,即:FFH+1=0 或 0-1=FFH,不会产生进位或者借位标志,51单片机指令乘除法指令等,乘除法指令: MUL AB A*B=

13、BA 结果:高8位在B,低8位在A DIV AB A/B=AB 结果:商在A,余数在B 十进制调整指令 DA A BCD码加减之后,将结果又恢复成BCD码 数据指针加1指令 INC DPTR 16位数据指针只能加1,不能减1,1字节16进制数转换成3字节BCD数举例,设HEX中存放着一个16进制(2进制)数,如果要将它送到数码管进行显示,首先要将其转换成3字节的BCD数,每字节的值=09。假定转换结果存放到BUFF的连续3个单元中,依次为:百位;十位和个位。 数据转换程序如下: CHDBCD: MOV R0,#BUFF MOV A,HEX MOV B,#100 DIV AB MOV R0,A

14、;存百位,INC R0 MOV A,B ;余数再除 MOV B,#10 DIV AB MOV R0,A ;存十位 INC R0 MOV R0,B ;存个位 RET 显然,BCD数(键盘输入的数)要转换成2进制或者16进制数,用乘法就可以了! 只是这里举例的数都小于255。 对“大于255”的数,需要用16位乘除法子程序处理。,51单片机指令逻辑运算指令,与 ANL A,Rn ANL A,direct ANL A,Ri ANL A,#data ANL direct,A ANL direct,#data,或 ORL A,Rn ORL A,direct ORL A,Ri ORL A,#data OR

15、L direct,A ORL direct,#data,指令的最后一个字符“L”意义为“逻辑”,51单片机指令逻辑运算指令,异或 XRL A,Rn XRL A,direct XRL A,Ri XRL A,#data XRL direct,A XRL direct,#data,异或:两者的对应8位,各位相同时,结果为0,不同为1。 前面讨论的“与”、“或”、“异或”,都是字节中对应位进行运算。,51单片机指令累加器指令,累加器清零 CLR A 结果等于: MOV A,#00H 累加器取反 CPL A 结果:A的各位变反,例如: MOV A,#01110000B CPL A 结果:A=100011

16、11B,51单片机指令移位指令,只能对累加器A操作 全部都是“旋转”而不是“移位”!(Rotate)因此指令全都带有“R”开头 分为:不含“进位”和“带进位”两种操作方式;又分为向左和向右两种逻辑方式,共4条指令,51单片机指令移位指令,RL A RR A RLC A RRC A SWAP A,高低4位互换,等效于执行4次“RR A”或者执行4次“RL A”指令,51单片机指令无条件转移指令,LJMP addr16 长转移,可转到64KB范围的任意地址。PC=addr16。3字节指令。 AJMP addr11 绝对转移,当前PC地址保留高5位,其余11位被addr11替换。范围2KB,但不对称

17、。2字节指令 SJMP rel 短转移,采用相对地址,范围相对当前PC值的128127字节之间。单字节指令。 以上addr16,addr11和rel在编程时使用“标号label” JMP A+DPTR 散转。DPTR内存放“散转表”起始地址,A是散转序号表间隔。“散转表”是由若干转移指令组成的数据表。,散转表举例,间隔2字节举例: MOV DPTR,#JTAB1 MOV A,FUNC_NO CLR C RLC A ;乘间隔2 JMP A+DPTR JTAB1: AJMP FUNC0 AJMP FUNC1 AJMP FUNC2 AJMP FUNC3 ,间隔4字节举例: MOV DPTR,#JTA

18、B1 MOV A,FUNC_NO CLR C RLC A RLC A ;乘间隔4 JMP A+DPTR JTAB1: NOP LJMP FUNC0 NOP LJMP FUNC1 NOP LJMP FUNC2 ,51单片机指令条件转移指令,条件转移指令全部使用相对转移,其转移的目的地不能太远(128127之间)。 当目的地较远时,可以设置两次跳转(加一个“跳板”) 此处我们连同“位条件”一起作讲解 符号“rel”表示相对寻址,编程时使用“label”,51单片机指令条件转移指令,对累加器判零转移。指令中看不见“A” JZ rel JNZ rel 比较,不相等转移。唯一使用两个逗号的指令 CJNE

19、 A,#data,rel CJNE A,direct,rel CJNE Rn,#data,rel CJNE Ri,#data,rel 两数相减只改变标志,不保留结果。可以再判“借位C”从而判大小。,51单片机指令条件转移指令,减1后,不为零转 DJNZ Rn,rel DJNZ direct,rel 常用于循环计数。 注意关键字:JZ,JNZ,CJNE,DJNZ J=Jump;Z=Zero;C=Compare E=Equal;N=Not,51单片机指令位条件转移指令,对进位C JC relJNC rel 对“位”状态 JB BIT,rel JNB BIT,rel 指令里的“B”字表示BIT=“1

20、”,NB表示BIT=“0”,下面意义相同 JBC BIT,rel 当BIT=1时转移,并顺便将BIT清除使BIT=0,循环延时程序举例,查指令表,DJNZ Rn,rel指令执行时间为2个机器周期,如果使用12M频率的晶振,则执行一次“DJNZ”指令需要2uS时间。如果此指令执行200次,可以延时0.4mS. 可以设计延时30mS的程序,DJNZ应当执行:30000uS/2uS=15000=150*100次(或者25060)。程序如下: DELAY30MS: MOV R7,#100 (#60) DELAY: MOV R6,#150 (#250) DJNZ R6,$ DJNZ R7,DELAY R

21、ET 这里符号“$”表示转移到本行前。 凑15000时,注意每个数不能超过255(1字节) 通常内循环取较大的数,外循环取较小的数,这样延时误差可以减小些,判数据大小举例,假定A中有一个数,不知道大小,当其data时转到label1,当其data转到label2,当其data时转到label3,程序如下: CJNE A,#data,label0 LJMP label3 Label0: JC label2 LJMP label1,51单片机指令调用和返回指令,调用指令 LCALL addr16子程序可在64KB中任意地址,PC=addr16 ACALL addr11绝对调用,当前PC地址保留高5

22、位,其余11位被addr11替换。范围2KB,但不对称。 调用指令针对子程序,编程时使用子程序入口的标号(label) 子程序结束时有“返回”指令,可以回到调用前的下一条指令处。 “当前PC值”指:读取调用指令后,PC自动指向“下一条指令”,因此当前PC值就是下一条指令地址。,51单片机指令调用和返回指令,返回指令 子程序返回:RET 中断返回: RETI 子程序(含中断服务)调用过程: 发生“调用”时,CPU自动把当前PC值送入堆栈保存,根据指令不同用addr16或者addr11更新PC值,从而读取子程序指令并执行。当读到“返回RET;RETI”指令时,CPU从堆栈中取回原来的PC值,读取调

23、用前的“下一条指令”,从而返回“断点”处。 RETI指令还能清除中断响应时所置位的优先级状态触发器。,51单片机指令布尔操作指令,位传送 MOV C,bit MOV bit,c 清0和置1 CLR bitCLR C SETB bitSETB C,51单片机指令布尔操作指令,逻辑运算“与”、“或”、“非” 与 ANL C,bitANL C,/bit 或 ORL C,bitORL C,/bit 非 CPL CCPL bit 注: /bit=bit 位控制转移前面已经讲过,关键字如下: JCJNCJBJNB JBC,空操作指令,NOP 执行(耽误/延迟)一个机器周期,对标志有影响的指令,51单片机的

24、汇编语言(宏汇编),只有指令助记符还不能编写出好程序,需要增添一些“伪指令”。 伪指令用于控制汇编软件如何处理和按什么规则编译程序。 伪指令不会产生“机器码” 不同的汇编器(仿真器、仿真软件)具有一些不同的“伪指令”规定。 下面将介绍一些常用的伪指令,ASM51汇编语言格式,Label: 标号,冒号结尾,表示程序入口。字母开头,通常少于8个字符。 指令助记符:也可以是伪指令,后面如果有操作数的话必须有“空格”或“TAB键”将其与操作数分开 操作数1:既是操作对象又是操作结果 如果存在操作数2、3时,需要在前面用逗号隔开 注释:前面用分号开头 【】表示不一定存在,不是必须的,【label:】指令

25、助记符 【操作数1】【 ,操作数2】【,操作数3】 【;注释】,ASM51汇编保留字和特殊符号,保留字常指:指令;寄存器名;伪指令,以及运算符号如:/等,这些字符串不能用于作为标号、变量等,运算符不能用于标号、变量当中。 运算符可以用于操作数中,起到运算作用。例如:MOV MEM+3,A,意义为:将A的内容送到MEM之后的第三个存储单元。 符号“$”在转移指令中当作label使用时,表示转到$符号所在行的前面,例如: SJMP $ 表示在本行作“死循环”。等效于: ABC: SJMP ABC,ASM51汇编器通用伪指令,ORG 地址 定义程序/数据的起始地址 END 汇编到此结束,其后面的内容

26、将被忽略。同时也是程序结束的标志。 EQU 等值命令。定义变量地址或者常数名称。例如: ABC EQU 30H DB 定义8位数据段(表格类常数) DW 定义16位数据段(表格类常数) DS 预留一个数据段(单片机中不常用,因为只能在程序段中定义,而ROM不能修改) BIT 定义位变量地址,用法与EQU相同。 例如: fire bit p1.0,ASM51汇编伪指令ORG举例,ORG 0000H LJMP MAIN ORG 0003H LJMP INT0SAV;跳转到INT0服务程序 ORG 000BH LJMP T0SAV;跳转到T0服务程序 ORG 30H MAIN: 主程序 意义:主程序

27、从地址0000开始,实际又跳转到30H开始的主程序。INT0发生中断时,程序从0003H开始执行,并调转到INT0SAV程序执行。T0发生溢出中断时,从000BH开始执行。 这几个地址值是51单片机规定的固定地址,在“中断系统”中再详细讨论,ASM51汇编伪指令EQU/BIT,TEMPEQU 30H;定义变量TEMP地址为30H T_MODEQU 40H;定义定时器模式控制字常量40H EQU之前的字符串可以理解为变量名,也可以理解为常量名,只要应用时前面加上“#”就是常量了!例如: MOV TEMP,#TEMP 这条指令使30H地址内存入30H常数 SFLAG BIT P1.0;定义SFLA

28、G变量为P1.0引脚 SIGN EQU 00H;定义SIGN变量为位地址00H 有些编译器可以用EQU完全代替BIT来定义“位”,ASM51汇编伪指令DB/DW,TAB1:DB 0C0H,0F9H,0A4H,0B0H,099H DB TAB2:DW 0C0F9H,0A4B0H,09992H DW 两个表格都定义了同样的内容共阳LED数码管显示代码表(段码表),它们分别依次代表:“0”;“1”;“2”;“3”;的显示代码。通过查表指令可以找出相应的显示代码。,汇编语言程序的一般结构,程序的一般结构按照下面顺序组成: 用EQU/BIT定义变量、常量、端口 用ORG指令和LJMP/AJMP定义中断向量表 主程序:初始化堆栈、内存、端口、中断系统、允许中断,然后进入一个扫描循环体。 独立模块区:子程序、中断服务程序等程序模块区。 用END作为程序结束。 程序用图示方式表达为下页,线性程序的全部结构,一般程序的一般结构,程序的局部可以设计成如下结构之一 顺序结构 循环结构 分支结

温馨提示

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

评论

0/150

提交评论