690 likes | 848 Views
项目二、单片机硬件及指令系统应用. 项目二、单片机硬件及指令系统应用— 任务1. 二极管点亮. 能力目标 1.能用 Proteus 构建单片机最小系统 2.能运用并行 I/O 接口 3.能学会程序编写的基本方法并用 Keil C 进行调试 4.能进行灯亮控制电路综合调试 学习内容 1.了解指令的概念 2.掌握寻找方式 3.掌握传送、位操作等指令 4.了解并行 I/O 接口. 一、任务要求 用单片机来实现对一个发光二极管实现点亮的功能。 二、任务分析 1.一个普通二极管被点亮的条件 R1 在此电路中的选择范围为330 Ω~1KΩ.
E N D
项目二、单片机硬件及指令系统应用— 任务1. 二极管点亮 能力目标 1.能用Proteus构建单片机最小系统 2.能运用并行I/O接口 3.能学会程序编写的基本方法并用Keil C进行调试 4.能进行灯亮控制电路综合调试 学习内容 1.了解指令的概念 2.掌握寻找方式 3.掌握传送、位操作等指令 4.了解并行I/O接口
一、任务要求 用单片机来实现对一个发光二极管实现点亮的功能。 二、任务分析 1.一个普通二极管被点亮的条件 R1在此电路中的选择范围为330Ω~1KΩ
2.用单片机的I/O口的其中一位来控制二极管的 点亮问题 给P1.0送一低电平,则二极管就可以被点亮,送一高电平,则二极管就熄灭。
三、学习知识 (一)了解指令的概念 1、指令的表示法:由操作码和操作数两大部分组成 MCS-51指令格式: [标号:]操作助记符[操作数1][,操作数2][,操作数3] 其中操作码助记符一般由2~5个英文字母组成。 51系列单片机共有111条指令。
2、指令的分类: 按指令在存储器中所占用的存储单元分: 单字节 NOP 双字节 ADD A,#05H 三字节 LJMP 8000H 按指令功能分: 数据传送类 MOV A,#04 算术运算类 ADD A,#05H 逻辑运算类 ANL A,#05H 控制类 LJMP 8000H 位操作类 SETB 90H
3、指令中操作数的描述 Rn ——工作寄存器R0~R7。 Ri ——间接寻址寄存器R0、R1。 Direct ——直接地址,包括内部128B RAM单元地址、21个SFR地址。 #data —— 8位常数。 #data 16 —— 16位常数。 addr 16 —— 16位目标地址。 addr 11 —— 11位目标地址。 rel —— 8位带符号的偏移地址。 DPTR —— 16位外部数据指针寄存器。 bit ——可直接位寻址的位。
A ——累加器。 B ——寄存器B。 C ——进、借位标志位,或位累加器。 @ —— 间接寄存器或基址寄存器的前缀。 / —— 指定位求反。 (x)—— x中的内容。 ((x))—— x中的地址中的内容。 $ —— 当前指令存放的地址。 A B ——累加器A和B寄存器组成的寄存器对,常出现在乘除法指令中。
(二)掌握寻找方式 1、立即数寻址 MOV A,#40H 2、直接寻址 MOV A,40H 3、寄存器寻址 MOV A,R2 4、寄存器间接寻址 MOV A,@R0
(1)采用R0或R1作为寄存器间接寻址,可寻址的片内片外的RAM的低256字节的存储空间。(1)采用R0或R1作为寄存器间接寻址,可寻址的片内片外的RAM的低256字节的存储空间。 (2)采用DPTR作寄存器间接寻址,可寻址的片外的数据存储器的整个64KB的空间。 5、变址寻址 操作数地址=变地址+基地址 如MOVC A,@A+DPTR
例:累加器A的内容为20H,DPTR的值为2000H,程序存储器2020H单元内容为47H,则执行该指令后累加器A的值为47H。例:累加器A的内容为20H,DPTR的值为2000H,程序存储器2020H单元内容为47H,则执行该指令后累加器A的值为47H。 MOVC A,@A+DPTR 6、相对寻址 如JC 60H;设(PC)=2000H为基址,相对偏移量为60H; 则当C=1时,转移的目的地址=2000H+2+60H
7、位寻址 位寻址是指指令的操作数为8位二进制数的某一位,指令中给出的是操作数的位地址。可用于位寻址的区域是片内RAM20H~2FH单元和部分特殊功能寄存器。 (1)可直接使用位地址。 (2)对特殊寄存器也可进行位寻址。
片内外程序存储器 ROM EPROM MOVX MOVC 特殊功能寄存器 片外 数据 存储器 RAM MOV PUSH POP XCH XCHD 片内RAM128字节 (三)掌握传送、位操作等指令 1、片内数据传送指令 单片机在逻辑上分为三个空间,分别是程序空间、片内数据存储器空间、片外数据存储器空间。
指令 指令代码 操作 MOV A,Rn 11101rrr A←(Rn) MOV A,direct 11100101 direct A←(direct) MOV A,@Ri 1110011i A←((Ri)) MOV A,#data 1101000 A←data (1)以A为目标地址的传送指令
指令 指令代码 操作 MOV direct ,A 11110101 direct direct←(A) MOV direct ,Rn 10001rrr direct direct←(Rn) MOV direct ,@Ri 1000111 direct direct←((Ri)) MOV direct,#data 01110101 direct data direct←data MOV direct1,direct2 10000101 direct2 ,direct1 direct1←(direct2) (2)以直接地址为目标地址的传送指令
指令 指令代码 操作 MOV Rn,A 11111rrr Rn←(A) MOV Rn,#data 01111rrr Rn←data MOV Rn,direct 10101rrr Rn←(direct) (3)以Rn为目标地址的传送指令
指令 指令代码 操作 MOV @Ri,A 1111011i ((Ri))←(A) MOV @Ri,#data 0111011i ((Ri))←data MOV @Ri,direct 1010011i ((Ri))←(direct) (4)以间接地址为目标地址的传送指令
指令 指令代码 操作 MOV DPTR,#data16 10010000dataH8dataL8 (DPTR)←data16 (5)十六位数传送(以DPTR为目标地址)传送指令
2、累加器A与片外RAM之间传送指令MOVX(4条) MOVX A,@DPTR;A←(DPTR) MOVX @DPTR,A;(DPTR)←A MOVX A,@Ri;A←(Ri) MOVX @Ri,A;(Ri)←A 1、3两条指令完成了将外部数据读入单片机,此时单片机的RD为低电平 2、4两条指令完成了将单片机数据写入外部设备,此时单片机的WR为低电平
3、程序存储器向累加器A传送指令MOVC(2条) MOVC A,@A+PC MOVC A,@A+DPTR 这种指令可用来实现查表程序,不同之处在于: 第一条指令只能在256位中查表, 第二条指令可在64KB范围中查表。
例:试编写一程序,实现将片外RAM的0FAH单元中的内容传送到外RAM的04FFH单元中。例:试编写一程序,实现将片外RAM的0FAH单元中的内容传送到外RAM的04FFH单元中。 分析:根据图2-6可以看到,外部存储单元之间是不能相互传递的,所以只有将外部数据通过传向片内,再将片内的数据传向片外来进行操作。具体在操作过程中要考虑如下事宜: ①定义起始地址、目标地址。 ②源操作数→A。 ③A→目标操作方式。
ORG 1000H MOV R0,#0FAH;定义源操作数地址 MOV DPTR,#04FFH;定义目标地址 MOVX A,@R0;源操作数先送至A MOVX @ DPTR,A;A→目标地址 END
4、位操作指令 (1)位传送指令(2条) MOV C,bit MOV bit,C (2)位修正指令(6条) CLR C CLR bit CPL C CPL bit SETB C SETB bit
四、任务实施 (一)用Proteus构建单片机最小系统硬件 图2-7 单片机控制的二极管点亮电路
ORG 0000H ;从程序空间地址0000H开始 L: MOV P1,#0FEH ;点亮二极管 SJMP L ;在此处踏步等待 END ;结束 (二)编写程序并进行调试 在任务分析中得知,给P1.0赋个低电平,发光二极管就被点亮。 程序如下:
(三)进行二极管点亮电路仿真调试 图2-8 单片机控制的二极管点亮仿真电路
五、总结与提高 完成了二极管点亮的任务,大家考虑一下: 1、能否用两个按钮来控制二极管的点亮与熄灭,一个按钮定义为点亮功能,另一个按钮定义为熄灭。 2、能否采用一个按钮来实现二极管的点亮与熄灭,按一下按钮,二极管被点亮,再按一下后,熄灭,再按下点亮,再按下熄灭…。
项目二、单片机硬件及指令系统应用— 任务2. 单灯闪烁 能力目标 1.能编写和用Keil C调试简单的延时子程序 2.能用Keil C进行单步,连续调试 3.能进行单灯闪烁电路综合调试 学习内容 1.学习转移指令的运用 2.掌握子程序的编写方法
一、任务要求 要求二极管亮灭闪烁的时间为200ms,控制端口仍然采用P1.0口。 二、任务分析 在任务一中我们已成功将二极管点亮,本任务与任务一所不同的是要由P1.0产生的时序信号如图2-9所示。
200ms 图2-9 单灯闪烁控制时序 三、学习知识 (一)主程序和子程序的概念 所谓主程序就是根据设计者的要求完成主要功 能的程序。 子程序的概念:主程序中反复用到的一些重复的功能模块程序,如果都放在主程序中,会让主程序显得冗长,所以常将这种需要频繁使用的基本操作设计成相对独立的程序段。
1、子程序的调用与返回 子程序的调用: 短调用指令ACALL addr11, 长调用指令LCALL addr16, 不同的是前者跳转的范围为2K后者跳转的范围为64K。 返回指令:RET从子程序返回到主程序,RETI从中断服务程序返回到主程序
2、子程序设计 (1)每个子程序都有一个唯一的入口(唯一的名称),并以标号作为标识,以便主程序的正确调用,子程序通常以RET指令作为结束。 (2)为了使子程序具有通用性,子程序的操作对象通常采用寄存器或寄存器间址等寻址方式。
(3)为了使子程序不论存放在存储器的任何区域都能被正确执行,在子程序中如有转移指令,应使用相对转移指令而不能用绝对转移指令。(3)为了使子程序不论存放在存储器的任何区域都能被正确执行,在子程序中如有转移指令,应使用相对转移指令而不能用绝对转移指令。 (4)进入子程序时,应对那些主程序中使用并在子程序中继续需要使用的寄存器的内容进行保护(即保护主程序现场),在返回主程序时应恢复它们的原来的状态。
子程序设计的基本步骤如下: (1)确定子程序的名称(入口标号)。 (2)确定子程序的入口参数及出口参数。 (3)确定所使用的寄存器和存储单元机器使用目的。 (4)确定子程序的算法,编写源程序。
例、设内部RAM20H、21H单元中有两个数a和b,编程求c=a2+b2,并把c送入内存单元22H中。例、设内部RAM20H、21H单元中有两个数a和b,编程求c=a2+b2,并把c送入内存单元22H中。 该程序由两部分组成:主程序和子程序。 主程序通过累加器A传送入口参数a和b,子程序用于求平方并将结果通过累加器A传送给主程序,主程序再求两平方和。
主 程 序 ORG 0100H MOV A,20H ;a→A ACALL SQR ;求a2 MOV R0,A ;a2 →R0 MOV A,21H ;b →A ACALL SQR ;求b2 ADD A,R0 ;a2+b2→A MOV 22H,A ;存入22H单元 END 以下为子程序 ORG 1000H SQR: ADD A,#01H ; MOVC A,@A+PC RET TAB: DB 00H,01H,04H,09H,16H, DB 25H,36H,49H,64H,81H
(二)循环转移指令 DJNZ Rn,rel;( Rn)←(Rn)—1 若(Rn)≠0,则PC+2+ rel,跳转至目标地址 若(Rn)=0, PC+2跳转到本指令的下一条指令去执行 DJNZ direct,rel;(direct)←(direct)—1 若(direct)≠0,则PC+2+ rel,跳转至目标 地址 若(direct)=0, PC+2跳转到本指令 的下一条指令去执行
DJNZ指令主要用来实现计数功能,一旦计数完毕,DJNZ指令主要用来实现计数功能,一旦计数完毕, 立即退出循环体,否则继续在循环体中循环。 例:将8031内部的RAM40H~4FH单元置为#00H。 解:
ORG 0000h MOV R0,#40H ;置首址 MOV R2,#10H ;置长度 LOOP: MOV @R0,A INC R0 ;修改指针 DJNZ R2,LOOP ;判断长度 END
(三)延时子程序的设计 1、机器周期 当振荡脉冲频率为12MHZ,一个机器周期为1us。 当振荡脉冲频率为6MHZ,一个机器周期为2us。 2、指令周期 执行一条指令所需的时间叫指令周期,一般指令需1、2、4个机器周期。 3、单循环程序运用
考虑在此单循环程序外再嵌套一层循环,见下方第2~7部分,以内部(3~6行)产生延时时间为5ms为重复操作对象,重复操作的次数由外循环来进行参数设置,由外部循环中R7设定为20,这样重复20次1ms的操作后延时约为100ms,考虑到晶振会带来点误差。考虑在此单循环程序外再嵌套一层循环,见下方第2~7部分,以内部(3~6行)产生延时时间为5ms为重复操作对象,重复操作的次数由外循环来进行参数设置,由外部循环中R7设定为20,这样重复20次1ms的操作后延时约为100ms,考虑到晶振会带来点误差。 图2-11 延时子程序(102ms)
ORG 0000H L1: MOV P1,#0FEH ;点亮二极管 LCALL DELAY2 ;延时200ms MOV P1,#0FFH ;关闭二极管 LCALL DELAY2 ;延时200ms LJMP L1 ;返回到首址 ORG 0100H 四、任务实施 (一)硬件电路同任务一。 (二)100ms延时子程序的调试。 这已在延时子程序的设计中完成。 (三)编写完整的主程序和子程序。
DELAY2: MOV R7,#20 ;延时200ms子程序 D1: MOV R6,#00H D2: NOP NOP DJNZ R6,D2 DJNZ R7,D1 RET ;返回 END
(四)进行单灯闪烁综合调试。 将上述生成的单灯闪烁.hex文件加载到用Proteus绘制的硬件电路CPU后台,点击运行,可以观察到二极管以200ms闪烁的结果 图2-12 单灯闪烁电路仿真
五、总结与提高 1、纯粹的硬件电路设计: 硬件定时不占CPU时间,但需通过改变电路的元件参数来调节定时时间,在使用上不方便。 2、延时子程序:像本次任务中,CPU大量的时间停留在延时程序中增加了开销,所以软件定时时间不宜过长。 3、可编程定时器:通过对系统时钟脉冲的计数来实现,计数值通过改变计数值程序设定。可以不占用CPU的开销。
项目二、单片机硬件及指令系统应用— 任务3. 跑马灯 能力目标 1.能通过程序的编写使灯从上依次向下轮流点亮,或从下往上依次轮流点亮。 2.能用Keil C进行单步,连续调试 3.能进行跑马灯电路综合调试 学习内容 1.学习向左或向右转指令的运用 2.状态计数器的设计 3.程序流程图的画法
一、任务要求 P1口的8位分别接着二极管,通过编程依次实现P1口8个二极管由低位到高位依次点亮和熄灭,依次点亮的时间为100ms。 二、任务分析 通过任务要求分析,需要在P1口产生如下时序:见图2-13所示。
P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 700ms 100ms P1.0 2 3 4 5 6 图2-13 跑马灯要求P1口产生的时序
通过任务分析,要解决如下问题: (1)100ms的延时子程序,前面任务二中已会运用,更可以直接拿来运用。 (2)状态转移的实现。 (3)一个时序周期中8个状态的记忆问题。