51单片机内部功能模块及其应用单片机_第1页
51单片机内部功能模块及其应用单片机_第2页
51单片机内部功能模块及其应用单片机_第3页
51单片机内部功能模块及其应用单片机_第4页
51单片机内部功能模块及其应用单片机_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

1、第 4 章 51系列单片机的功能模块及其应用 本章介绍51内部接口的应用。51系列单片机内部集成了:l CPU111条指令l ROM0K4K/8K(可扩为64KB)l 内RAM128/256 B(可扩外部64KB)l 定时/计数器接口2个/3个16位定时/计数器T0、T1、T2l 全双工异步串行通信接口l 并行接口提供4个8位并行端口振荡器CPU总线控制器并行接口串行接口内ROM内RAM定时计数器中断控制器l 中断控制器可以管理5个/6个中断源接口电路(Interface) 简称“接口”,是连接CPU总线和外设的桥梁。接口卡=适配器(Adapter)复杂接口电路,仅仅一片IC还不够,需要以某种

2、核心IC芯片搭配外围元器件构造成一个电路板。比如:网卡、声卡、显卡、数据采集卡、图像采集卡等。端口(Port)简称“口”,是指接口电路中的寄存器,硬件连线决定了每个寄存器的I/O地址,对接口电路的编程实质是对接口寄存器的编程。CPU控制外设的实质就是控制接口电路,控制接口电路的实质就是控制接口寄存器。4.0 中断系统(教材第2章第5节)4.0.1 中断概念中断是针对“条件I/O”的外设而设置的一种I/O工作方式(另一种方式是查询)。与查询方式相比,中断方式减少了CPU的负担,是计算机系统中重要概念和必不可少的内容。举例:把人看成CPU,手表和电话看成是外设,访问这两个外设就是两种I/O类型:手

3、表无条件I/O的典型,随时可以访问,自然也不涉及查询和中断方式的选择。电话条件I/O的典型,可以设计成查询方式,也可以设计成中断方式。显然,查询方式用在这里很“愚蠢”!而采用中断方式就很自如。实现中断工作方式的几个条件:l 外设能够产生中断申请信号;l CPU支持中断工作方式CPU能够接受外设的中断申请并做出响应;l 有一个独立于CPU的中断控制电路能够区分多路中断源,进行中断允许和优先权设置。正确使用中断需要搞清:中断屏蔽、优先权、响应过程、激活方法、中服调用和返回等。4.0.2 51单片机的中断系统51单片机内部集成了一个中断接口电路(中断控制电路)。1. 中断源51子系列的中断接口电路可

4、以连接5路中断信号(中断源),分别为:INT0、INT1、定时器0、定时器1、串口。前2个是用户可以随意安排使用的,后3个已经固定连接到内部接口电路。图中凡是开关就是控制环节,每个控制环节的通过控制寄存器的设置来实现。52子系列的中断系统:比51子系列多了1个中断源T2。外部中断源INT0、INT1内部中断源3个定时器中断TF0、TF1、TF2+EXF2、1个串口中断RI+TI2. 中断控制寄存器 51单片机的中断控制寄存器有2个(IE和IP),以及TCON的低4位。l 中断允许寄存器IE(A8H): 1允0禁EA×ET2ESET1EX1ET0EX0EA:总允许位,EA0禁止一切中断

5、,EA1总体允许;ET2:定时器2中断允许位,EX11允许,EX10禁止;ES: 串行口中断允许位, ES1允许, ES0禁止;ET1:定时器1中断允许位,ET11允许,ET10禁止;EX1:外部中断1允许位, EX11允许,EX10禁止;ET0:定时器0中断允许位,ET01允许,ET00禁止;EX0:外部中断0允许位, EX01允许,EX00禁止。l 中断优先级寄存器IP(B8H):1高0低××PT2PSPT1PX1PT0PX0中断源有一个固定的查询顺序,称为内部辅助优先级(同级隐含优先级)。(见上图)l 定时器电路有一个TCON中的寄存器,其高4位是关于定时器的控制,而

6、低4位则是关于外部中断INT1和INT0的控制。(后面具体介绍!)TF1 TR1 TF0 TR0IE1IT1IE0IT03. 中断优先级的作用:两个中断同时申请,高优先级的中断申请先被响应;高优先级的申请可以中断低级的响应(中断嵌套),同级不可中断;内部辅助优先级:同级中断同时申请,由内部固定的查询顺序决定响应顺序;中断受阻三情况:同级或高级中断正在服务; 当前执行的指令没有结束; 正执行RETI指令,则返回后至少再执行一条指令才响应中断。 4. 中断响应过程(单片机在每个机器周期的S5P2期间对5个中断源检测一次,所以任何中断申请都可以在1个机器周期内被CPU发现)l 中断源发出中断申请,单

7、片机检测到某个中断请求,等待当前指令执行完毕(可能是1、2、4个机器周期的指令),从下一个机器周期的S1开始响应中断;l 优先级激活触发器置位,阻断同级和低级中断,清除中断请求标志;l 硬件实现当前PC值入栈(为中断返回做准备);l 5个特定中断入口地址(中断矢量)之一近入PC,(PSW不会自动入栈);l 中服结尾RETI(优先级激活触发器清0,栈顶2字节弹给PC)。5. 中断请求的撤除一个中断申请信号在中断被响应之后应该立即撤消,否则会引起重复中断。内部定时器的T0、T1的中断(TF1、TF0)可以自动撤除;内部定时器的T2中断(TF2和EXF2)不会自动撤除,需要程序撤除;串行通信的中断(

8、TI、RI)不会自动撤除,需要编程时软件撤除,由于这些中断信号都是内部寄存器的某一位,只需在中服中增加对该位的清零指令就可以撤除该项中断申请; 外中断在沿触发时也是自动撤除(本来就维持不住,IEx是自动撤除的);只有外中断采用电平触发时需要自己从硬件上考虑撤除方案。6. 外部中断响应时间毫不受阻的情况下,从提出申请到被响应需要3个机器周期。如果受阻,除了正在执行高级或同级中断服务程序时间无法确定以外,另外两种受阻的最长等待时间为5个机器周期,合计8个机器周期。4.0.3 外部中断触发方式选择1. 外部中断两种激活方式中断请求信号必须有一定形式,51单片的三个内部中断都是在控制寄存器中有相应的中

9、断位(TR1、TR0、TI、RI),事件出现则置位,可以看出是属于电平触发方式。内部中断触发信号(3个定时器和串口)是设计单片机的时候统一设计的,所以信号固定、可靠。对于两个外部中断INT1和INT0,是由用户连接某种外部端口产生的中断申请,中断申请信号的形式不确定,当然不外乎电平信号或脉冲信号。为此51单片机设计成对两种外部中断信号的形式都会识别。寄存器TCON的低4位就是与外部中断触发方式有关。TF1 TR1 TF0 TR0IE1IT1IE0IT0IE1:如果外中断1连接的是脉冲信号而不是电平信号(这叫沿触发,确切说是下降沿触发),用此位实现中断挂号,来一个中断脉冲(在下降沿时)此位自动置

10、位,响应中断后自动清除。IT1:外中断1的触发方式设置,IT1=0是低电平触发,IT1=1是下降沿触发。注意这种设置是被动的,取决于外设中断触发信号的类型。如果中断源是脉冲信号,则必须设为下降沿触发。如果中断源是电平信号,就应该设成电平触发。IE0:外中断0为下降沿触发时的中断挂号。IT0:外中断0的触发方式设置。采用什么触发方式,取决于外设的性质。沿触发时,由于信号无法持久,所以用IEx协助记录触发(挂号),或者说沿触发通过IEx转化为电平。电平触发要求电平一直保持到中断被响应,一旦响应要在响应结束前撤除触发电平,否则会引起第二次中断。4.0.4 中断的应用51单片机系统中是否启用中断由编程

11、决定。编程两个内容:主程序中进行中断允许、中断优先级的设置(中断初始化);编写相应的中断服务程序(包括入口地址的设置)。例如:一个51单片机系统,需要启用INT0中断和T1中断,并且T1中断为高优先级,INT0中断为低优先级而且是沿触发。程序相关指令和结构如下:ORG 0000HLJMP STARTORG0003H ;这2句是INT0的中服入口设置LJMPINT_W0 ORG001BH ;这2句是T1的中服入口设置LJMPINT_T1ORG 0100HSTART: MOVIE,#10001001B ;设置总允许和INT0允许、T1允许(可以用位操作实现)MOVIP,#00001000B ;设置

12、T1位高优先级(可以用位操作) SETBIT0 ;设置INT0为沿触发(下降沿触发)SETB EASETB EX0 等效于MOV IE, #89HSETB ET1SETB PT1 等效于 MOV IP, #08H两种指令的效果区别:位操作只改变指定位,不影响其他位。这在程序中间进行某个中断的变化时比较常用。字节操作影响全部中断,初始化的时候常用。 ;中断服务程序INT_W0: RETIINT_T1: RETI END仿照这个例题,考虑5个中断都启用的程序写法。4.1 51内部的并行端口及其应用51系列单片机内部集成了一个并行接口芯片,使用户得到了4个8位的并行I/O端口,记作P0、P1、P2和

13、P3,共32条I/O口线,可以用这些口线连接输入设备(开关、按键、传感器等)或输出设备(LED、蜂鸣器、数码管、液晶屏等)。这4个并行口的内部分别对应一个寄存器,名称也是P0、P1、P2和P3,每个寄存器可以字节寻址也可以位寻址。讨论单片机系统硬件连接的时候,凡是说P1口连接XX、P2口连接YY,显然说的是口线,而在程序中表示向口输出、从P2口输入则是针对寄存器。P0、P1、P2和P3这4个并行口除了最本职的I/O功能以外,多数兼有第2功能,这就导致了这些口线在电路结构和功能特性上是基本相同的,但又各具特点,使用方法也略有差异。并口寄存器P0、P1、P2、P3属于SFR,只能直接寻址(程序中使

14、用P0、P1、P2、P3仅仅是用代号表达了直接地址,实际等效于直接使用80H、90H、A0H、B0。教材P.31)。几个概念:任何用于输出的端口(Port)都应该具有锁存功能端口能够记住总线的瞬间数据;任何用于输入的端口(Port)应该具有缓冲功能外来的输入不能随便进入总线;51单片机的四个并行I/O端口(P0、P1、P2和P3)都是8位双向口(可入可出),所以电路必需同时具有输入缓冲和输出锁存的功能。这就导致了每根口线电路结构的复杂性。单纯完成I/O功能所需要的电路结构:(这是1根口线的电路)输出锁存器输出驱动器输入缓冲器注意上图左侧的4条水平引线的文字说明:内部总线通向CPU,无论是输出还

15、是输入,数据都要经过内部总线;读锁存器、写锁存器、读引脚是3个控制信号,用于控制数据的3个走向。在对I/O口进行输入输出操作的时候,根据命令的不同将产生不同的控制信号,从而决定数据的传输方向。 输出数据用MOV指令向并口输出字节,指令译码的结果是写锁存器信号有效,数据从内部总线传输到D触发器的D端(锁存),同时D触发器的/Q端输出一个相反的值控制驱动FET。如果D=1则/Q=0,FET截止,引脚=1;如果D=0则/Q=1,FET饱和导通,引脚=0。 读引脚(输入)用MOV指令读并口的字节,指令译码的结果是读引脚信号有效,打开了引脚缓冲三态门,引脚数据经三态门进入内部总线。需要注意的是,读引脚的

16、时候FET必须处于截止状态,才能读到引脚的正确电平。如果FET处于饱和导通状态,相当于引脚接地,就不能读到正确的结果。所以,读引脚之前,要先向锁存器写1。 读锁存器有一些对并口操作的指令,不是单纯的读或者写,而是先读入当前状态、进行修改、再写出修改后的结果(简称:读-修改-写指令),这类指令译码的结果是读锁存器信号有效,把Q端的值从内部总线读入,处理之后再写出到D触发器的D端。三类操作指令举例列表:类别指令举例指令功能操作输出指令MOV P1, A向P1口输出A中8位数据经内部总线写入P1口8个锁存器读引脚指令MOV A, P2从P2口读入P2口8个引脚的状态经过内部总线进入A读-修改-写指令

17、ANL P1, A对P1口与操作以并口为目的数的指令,只要操作与并口的原值相关,就是读-修改-写指令。ORL P3, A对P1口或操作XRL P0, A对P1口异或INC P2P2加1操作DEC P1P1减1操作DJNZ P3, xxxP3减1不为0跳CPL P1.0P1.0求反位操作指令中,凡是改变并口某一位值的操作,都是先把并口8位整个读入,修改某一位之后,再写出。SETB P3.3P3.3置1CLR P2.6P2.6清0JBC P1.7, xxxP1.7为1则清0跳MOV P2.2, CP2.2赋值51并行口I/O功能的用法:图4-2:P1口的低4位接4只LED,高4位接了4个开关。要求

18、编程实现:读取开关状态,送LED显示。例4.1 用字节操作指令实现。KLA:MOVA, P1SWAPAORLA, #0F0HMOVP1, ARET例4.2 用位操作指令实现。 KLB:MOVC, P1.4MOVP1.0, CMOVC, P1.5MOVP1.1, CMOVC, P1.6MOVP1.2, CMOVC, P1.7MOVP1.3, CRET补充题:8只LED显示按键次数P3.3接开关,人工控制产生输入脉冲,P1口LED按2进制显示开关次数。 算法:不断检查开关状态并输出A值,用标志控制A是否加1。人工按键一次的时间单位是几十毫秒甚至几百毫秒,而程序读取一次端口的时间是几个微秒,所以程序

19、中如果没有避免重复加1的措施,每次按键程序会读成上千次。这是本算法的要点。没有考虑重复加1的程序解决了重复加1的程序ORG 0000H LJMP START ORG 0200HSTART: MOV A,#0FFH SETB P3.3 LOOP: MOV P1,A MOV C,P3.3JC NOADDDEC ANOADD: LJMP LOOP ENDORG 0000H LJMP START ORG 0200HSTART: MOV A,#0FFH SETB P3.3 LOOP: MOV P1,A MOV C,P3.3JC NOADDJB F0,NEXTDEC ASETB F0LJMP NEXT N

20、OADD: CLR F0NEXT: LJMP LOOP END下面介绍51并行口的整体功能:4.1.1 P1口对于51子系列,P1口最单纯,8位都只有单一的I/O功能,只能用于I/O。对于52子系列,P1口的最低2位兼了第二功能(用于定时/计数器T2),高6位还是单纯的I/O口。4.1.2 P3口双功能口,8条线均有第二功能:(第一功能是什么?)口线名称/第二功能名称第二功能P3.0/RXD串行接口电路的串行输入端P3.1/TXD串行接口电路的串行输出端P3.2/INT0外部中断0的中断申请输入端P3.3/INT1外部中断1的中断申请输入端P3.4/T0T0用于计数方式时,计数脉冲输入端P3.

21、5/T1T1用于计数方式时,计数脉冲输入端P3.6/WR读外部RAM时,读有效信号输出端P3.7/RD写外部RAM时,写有效信号输出端内部电路增加了一个与非门,解决作为第二功能的输出。作为第一功能使用的时候,性能与单纯I/O口无异。4.1.3 P2口外部扩展时,兼任地址总线高8位(负责输出高8位地址)。由于高8位地址不是来自内部总线,所以增加了单刀双掷开关进行切换。作为第一功能使用的时候,性能与单纯I/O口无异。(教材上电路有误!)4.1.4 P0口外部扩展时,兼任地址总线低8位并且兼任8位数据总线,地址/数据分时复用。P0口的任务最复杂,所以电路也变化最大。作为地址/数据都要传输的口线,需要

22、有高阻态(第三态),所以内部上拉电阻变成了FET。上通下止输出1,上止下通输出0,上下都止高阻(引脚浮空=引脚与内部电路的断开)。这就导致P0口在作为I/O使用的时候,不同于另外三个口,而是相当于一个没有内部上拉电阻的输出端OC门或漏极开路的门,必须在外部接一个10K上拉电阻,否则无法输出1,也无法输入1。补充内容:驱动的概念、拉电流输出、灌电流输出和OC门驱动=功率放大单片机输出的控制信号只能提供控制逻辑,没有带负载的能力,如果需要带负载,必须对单片机的逻辑信号进行放大(电压、电流),放大就是驱动。小功率负载的驱动可以用门电路实现小功率驱动,20mA以内可以使用普通的非门(反相器)、同相门等

23、,100mA以内可以用OC门或三极管进行放大。大功率负载的驱动多级放大:口线驱动门/三极管继电器与驱动紧密相关的一个概念隔离。(光耦、继电器等)单片机是5V直流电压的电路,如果用于控制直流12V、24V乃至交流220V、380V,就需要解决不同电压的电路的耦合方法=隔离方法。设计专门的元器件,使得信号可以在不同电压的电路中传递,但是电压互不影响。逻辑门的拉电流用法和灌电流用法驱动门的逻辑符号如上面图中所示(三角形符号),但是其内部还是用三极管一类元件构造,所以负载电流的方向不仅可以向三角形外,也可以向三角形内。TTL电路的OC门可以作为驱动的门电路有两种,一种是普通门(内部接有上拉电阻),另一

24、种是集电极开路(Open Collector)门(内部没有上拉电阻)。前者驱动能力较小(电流固定),后者驱动能力较大(自己外接上拉电阻任意控制电流)。(在CMOS电路中称为OD门Open Drain electrode)晶 体 管(Transistor):发射极(Emitter )、集电极(Collector)、基极(Base)场效应管(Field Effect Transistor):源极(Source Electrode)、漏极(Drain Electrode)、栅极(Grid Electrode)TTL电路(Transistor-Transistor Logic)晶体管构成的集成电路CM

25、OS电路(Complementary Metal-Oxide-Semiconductor)互补金属氧化物半导体构成的集成电路(基于场效应管构成的集成电路)4.1.5 并行口的I/O应用1蜂鸣器、可控硅的接口和编程1. 蜂鸣器接口在监控系统中,经常用到声、光双重报警,光报警通常用LED,声音报警常用蜂鸣器。一般说到发音器件都会想到扬声器。但是扬声器发音需要控制电路提供一定频率的振荡脉冲。当然,扬声器可以发出复杂的声音。如果仅仅需要一个简单的嘀、嘀一类的提示音,蜂鸣器则是最佳器件。蜂鸣器的特点是加上直流电就自己振动而产生声音,不用程序来产生振荡,这使得控制电路和控制程序都很简单,与点亮LED很相似

26、。当然蜂鸣器的声音很单调,频率是器件固有的,不可变。我们通过编程可以控制的效果变化就是间歇发音(简单间歇、长短结合)。参见图4-4,用1根口线控制一个蜂鸣器。蜂鸣器工作电流远大于LED,所以一般驱动门不能胜任。因此外接一个三极管进行驱动,调整三极管基极和反馈电阻,使三极管工作在开关状态。如果使用PNP三极管,则口线输出0时,三极管导通,蜂鸣器响;口线输出1时,三极管截止,蜂鸣器不响。若使用NPN三极管,控制逻辑正相反。例题4.7 使蜂鸣器间歇响5次的子程序。 模拟演示蜂鸣器(两种接法) BEEP:MOVR7,#5BEEPL:CLRP1.0LCALLDEL5SETBP1.0LCALLDEL10D

27、JNZR7,BEEPLRETDEL5:MOVR6,#5LJMPDEL11DEL10:MOVR6,#20DEL11:MOVR5,#200HDEL12:MOVR4,#125HDJNZR4,$DJNZR5,DEL12DJNZR6,DEL11RET2. 可控硅接口这部分内容很有实用价值,需要认真思考才能充分理解。这部分包含了:光电隔离器件的运用不同电压的电路如何连接耦合! 可控硅器件的控制控制角、导通角、过零电路可控硅可控硅是一种大功率整流器件、又称晶闸管可以理解为可控二极管、可控PN结。阳极 A阴极 K控制极 G可控硅符号如下图。AK之间是否导通取决于控制极G的触发电流。显然,这样的性能用于直流电路

28、没有任何价值(AK如果通直流,则一旦导通就永远导通,没什么意思)。如果用于交流电路,控制极G的电流仅仅能使可控硅导通一个正半周,负半周的时候AK之间反相截止。再到正半周又需要触发才能再次导通。如果我们精确对触发时刻进行控制,就可以改变正半周导通的比例(控制角、导通角),实现电机调速、可控加热、调光台灯等产品的效果。上图表示的是单向可控硅,还有正负半周都可控导通的双向可控硅。光电隔离器件 = 光电耦合器件 = 光耦一个电路中用到几种不同的电压,甚至有交流有直流,不能直接耦合在一起。为此,专门有一类既能连通控制关系又能隔离不同电压的器件:继电器、干簧管、光耦、. 。继电器、干簧管利用电磁效应实现隔

29、离耦合:低压电路控制线圈的通断,线圈通电产生的电磁力吸和开关触点,开关触点连接高电压、大电流的电路。光耦利用光电效应实现隔离耦合:一个集成芯片内部有一个LED和一个光敏三极管,低压电路LED的亮灭,LED点亮时,光敏三极管导通,接通高电压、大电流的电路。过零检测如何实现在交流电每个正半周的准确位置发出触发脉冲(如何保证导通角的准确)。由于交流电的50Hz周期不稳定,所以触发脉冲不能依赖单片机自己的定时,必须检测交流电的正脉冲时间,特别是过零瞬间。例4.8 单片机P3.2连接过零检测电路,P1.0输出触发脉冲,检测到过零的负跳变到发出触发脉冲的时间间隔决定导通角,时间间隔用延时程序来实现,假设延

30、时程序的延时参数在30H、31H单元,可控硅控制程序如下:POIIU:JBP3.2, $LCALLCDELSETBP1.0NOPNOPNOPCLRP1.0JNBP3.2, $SJMPPOIIUCDEL:MOVR6, 30HCDEL1:MOVR5, 31HDJNZR5, $DJNZR6, CDEL1RET稍加思考就可以意识到,此程序只能是控制原理的示范,用于实际系统中根本无法保证控制的精度。因为实用的单片机系统不可能只管理这一个内容,如果系统中启用了某种中断,一旦出现中断,CPU就会执行中断服务程序,而离开了主程序,检测过零以及控制导通角的延时程序就会受影响。例题4.14有真正实用的方法用定时器

31、控制导通角的延时。4.1.6 并行口的I/O应用2拨码盘的接口和编程1. BCD拨码盘的构造向计算机输入数据的典型设备是键盘,但是如果数据输入量很少、很偶然,就不必兴师动众扩展键盘,拨码盘就是比较简单的数据输入器件。BCD拨码盘的构造:拨码盘是一个机械部件,不是电路,利用机械结构实现触点的不同接触。BCD码是4位2进制数,我们用一个转盘和5条线就可以制做一个拨码盘:一条线输入VCC,四条线输出BCD码,随着转盘的10个位置,四条输出线与输入VCC线有不同的10种接触组合,从而得到了10个不同的4位2进制数,这就是BCD码。参见表4-2。2. BCD拨码盘的接口和编程每个拨码盘可以输入1位10进

32、制数,需要与4条口线连通。两个拨码盘占用一个8位并行端口,如图4-8。4个拨码盘简单连接就需要占用16条口线,代价有点大。所以图4-9示范了4个拨码盘的一种节省口线的连接方法,只用8条口线即可。这里面体现了一种扫描的思想。例4.9 对图4-9的管理程序,要求把拨码盘数据读入内RAM的30H、31H单元。分析算法(与指令逐条对应)程序 根据题目要求,30H单元用于存放3#、2#拨码盘的数据,31H单元用于存放1#、0#拨码盘的数据。 根据电路,读哪个拨码盘就应该把该拨码盘的输入控制端清0,其它拨码盘的输入控制端置1。这样每个与非门的4条输入端有3个=1,另外1个输入端得值取决于对应拨码盘的状态。

33、 读取步骤:先向P1口输出一个高4位有1位为0的数据(低4位全1),选中一个拨码盘,然后读入P1口的值,低4位即所选拨码盘的值。利用字节交换等方法存储该值即可。R0指向30H单元选中3#拨码盘读入P1口的8位值把低4位交换到高4位存入30H单元选中2#拨码盘读入P1口的8位值A与30H低4位交换修改指针,R0指31H单元选中1#拨码盘读入P1口的8位值把低4位交换到高4位存入31H单元选中0#拨码盘读入P1口的8位值A与31H低4位交换完毕INBCD:MOVR0, #30H ;MOVP1, #7FH ;MOVA, P1 ;SWAPA ;MOVR0, A ;MOVP1, #0BFH;MOVA,

34、P1 ;XCHDA, R0 ;INCR0 ;MOVP1, #0DFH;MOVA, P1 ;SWAPA ;XCHA, R0 ;MOVP1, #0EFH;MOVA, P1 ;XCHDA, R0 ;RET ;作业一:1 参考教材画图:51单片机+ 晶振电路+ 上电复位电路。2 参考实验在上图基础上画图:P1口接8只LED(要求:拉电流方式带非门驱动),P0口接8只按键(要求:每键接上拉电阻,按下键得到低电平)。3 编程:对上题硬件电路,设计8种点亮LED的方式,要求程序依次显示这8种方式。4 编程:在上一步真正清楚的前提下,再完成:按几号键则以第几种方式重复显示,直到按另一个键才变换到另一种方式。5

35、 计算:已知LED压降2V,额定工作电流20mA,请说明电阻阻值如何计算以及计算结果。(练习很重要、很基本,请认真独立思考、彻底理解,才能真正掌握!)4.1.7 并行口的I/O应用3键盘接口和编程键盘就是按钮的组合,使用单个按钮的方法是一条口线接一个按钮(如转向灯和上面作业)。如果按键数量较多,仍然采用一个按键占用一条口线的方案不够经济,常用方法是组成键盘矩阵。1. 矩阵键盘的工作原理N条行线和M条列线不在同一平面,所以行列之间信号不通。按图示的口线状态,假设从P1口低4位输出0000,则4条列线都处于低电平状态,此时读入P1口高4位肯定都是高电平。如果在行列的每个交点上安装一个连接行线和列线

36、的按钮,当某个交点的按钮按下就能使该按钮所连接的行和列接通,列线的低电平就会使对应行线变为0。8条口线采用4行4列可以出现4*4=16个交点,可连接16个按键。2. 键盘状态的判断从行线/列线输出低电平,读取列线/行线,判断其中是否有低电平的位,有则表明有键按下,没有则表明没有键按下。举例:参考图4-10,假定列线输出、行线输入,判断有无按键的子程序如下:KEYS:MOVP1,#0F0H ;4条行线置1,4条列线输出0MOVA, P1CJNEA, #0F0H, KEYY ;行线非全1,说明有键,跳到标号KEYYSETBC ;无键,令C=1 (标志)RETKEYY: CLR C ;有键,令C=0

37、(标志)RET ;返回主程序,根据C值确定下一步的动作上图所示的键盘结构连接到单片机的P1口、P2口、P3口可行,连接到P0口则不行。P1口、P2口、P3口可行的原因是向口线输出1以后,只要口线不接地就可以读到1。P0口则不具备这样的性能,键盘连接到其它接口芯片的并口时,也存在P0口同样的问题。所以,通用的键盘结构应该自带上拉电阻。3. 闭合键的识别上面的程序可以判断是否有键按下,但是没有识别具体是哪个键。判断具体按键位置的程序算法有两种:扫描法首先由硬件连接方案决定以行为输入还是以列为输入,如图所示是以行为输入,列为输出。列为输出就称为列扫描方式。扫描的方法就是输出的列线值每次只有1列为0(

38、列号确定),这时读出行线值确定行号,行号列号可以定位一个键的位置。每次扫描需要让所有的列依次为0,如果有8列就要输出8次列值和读入8次行值并判断。如果这段指令总计100条,执行时间约150us左右,不到1ms。人按键的动作导致触点接触的时间至少是几十毫秒甚至几百毫秒,所以不用担心扫描过程中按键被漏过。反转法如果采用行列反转法进行键盘扫描,首先硬件连线要按右图:行线、列线都接上拉电阻,行线、列线都可以输入和输出。首先以行为输出列为输入,行线输出全0,列线读入以后如果某列为0,肯定有按键,但是无法确定行值。变列为输出行为输入,列线输出刚才读到的数据,行线读入以后可以确定按键所在的行。闭合键的位置表

39、达有两种方法,一种是给出按键的序号(如图4-10所标示的015),另一种是给出按键的行值和列值。例4.10 利用反转法识别键号给出所按键的序号假设经过调用KEYS,返回的C=0,那么就可以接着调用键值计算子程序;-以下是键值计算子程序,首先获取键的位置(行列值),然后计算出键的序号 ;教材上KEYN那段与KEYS重复,这里就不用了!KEYN1:ANLA, #0F0H ;屏蔽列值(A的值来自KEYS)MOVB, A ;保留行值(在高4位)于B(低4位为0)XXXX0000ORLA, #0FH ;A的低4位置1(注意高4位是刚才读到的行值)MOVP1, A ;反转输出到P1(把读到的行值输出),列

40、线置1为了输入MOVA, P1 ;读入,这时低4位应该有为零的位ANLA, #0FH ;屏蔽高4位(低4位是列值)0000YYYYORLB, A ;至此,B中是键行列值(XXXXYYYY),以下程序确定序号MOVDPTR, #KTAB ;表中是16个按键对应的行列值的顺序排列MOVR3, #0 ;查表得初始偏移量KEYN2:MOVA, R3 ;A获得偏移量MOVCA, A+DPTR ;查表指令,查出一个行列值CJNEA, B,NEXT ;查表得到的数据不等于B中按键的行列值则继续查MOVA, R3 ;直到相等,则R3值(偏移量)就是按键序号(0-15)!RETNEXT:INCR3 ;修改偏移量

41、,继续查LJMPKEYN2 ;-以下是键行列值的列表,排列顺序很重要!KTAB:DB0EEH, 0EDH, 0EBH, 0E7H, 0DEH, 0DDH, 0DBH, 0D7HDB0BEH, 0BDH, 0BBH, 0B7H, 07EH, 07DH, 07BH, 77H4. 键盘抖动以及消抖方法按键是一个机械装置,每次按下键和松开键的时候触点会有似通似断的阶段,这称为抖动。抖动导致一次按键被程序误以为是几次甚至十几次,必须消除。消抖的方法两种:硬件消抖、软件消抖。硬件消抖每个按键接一个单稳触发器。代价较大,电路臃肿。软件消抖利用延时程序,发现按键不马上处理,延时10毫秒左右之后再处理。联想:为

42、什么各种电气开关、按钮都带有弹簧机构?(不仅仅是为了手感!)为什么大型电器开关都采用电磁铁等快速动作机构?考虑消抖的程序(对例4.10修改)只需修改KEY_CON子程序中有键判断那一段!(为了帮助了解程序整体结构关系、为了帮助完成实验预习程序,这里给出了主程序的结构框架以及键盘管理的全部程序,请思考理解,力争达到自己可以变形应用的程度!)MAIN: ;初始化指令LOOP: ;无限循环(重复执行)的内容 LCALL KEY_CON LJMP LOOP;-以下是键盘控制子程序,其中调用键盘扫描、键值计算子程序KEY_CON:LCALL KEYS ;调用键盘扫描,看看是否有键按下,C=0表示有键JC

43、 KEY_EXIT ;无键,退出子程序(返回主程序)LCALL DEL10MS ;延时10毫秒,为了消抖LCALL KEYS ;在此调用键盘扫描,看看是否按下键是否还存在JC KEY_EXIT ;消抖以后无键,表明是干扰,退出子程序(返回主程序)LCALL KEYN1 ; 消抖以后缓存在,调用计算键值子程序 ;根据键值进行某种操作的程序或子程序调用KEY_EXIT:RET;-以下是键盘扫描子程序,仅仅用于发现键盘是否有键按下,返回C值KEYS:MOVP1, #0F0H ;低4位全0输出,高4位输出1是为输入做准备(准双向口)MOVA, P1 ;读入8位,关心的是高4位CJNEA, #0F0H,

44、 KEYY ;行线(高4位)非全1,说明有键,转KEYYSETBC ;无键,令C=1,作为无键的标志,供主程序区别对待RETKEYY: CLR C ;有键,C=0RET;-以下是键值计算子程序,首先获取键的位置(行列值),然后计算出键的序号 ;教材上KEYN那段与KEYS重复,这里就不用了!KEYN1:ANLA, #0F0H ;屏蔽列值(A的值来自KEY_CHK)MOVB, A ;保留行值(在高4位)于B(低4位为0)XXXX0000ORLA, #0FH ;A的低4位置1(注意高4位是刚才读到的行值)MOVP1, A ;反转输出到P1(把读到的行值输出),列线置1为了输入MOVA, P1 ;读

45、入,这时低4位应该有为零的位ANLA, #0FH ;屏蔽高4位(低4位是列值)0000YYYYORLB, A ;至此,B中是键行列值(XXXXYYYY),以下程序确定序号MOVDPTR, #KTAB ;表中是16个按键对应的行列值的顺序排列MOVR3, #0 ;查表得初始偏移量KEYN2:MOVA, R3 ;A获得偏移量MOVCA, A+DPTR ;查表指令,查出一个行列值CJNEA, B,NEXT ;查表得到的数据不等于B中按键的行列值则继续查MOVA, R3 ;直到相等,则R3值(偏移量)就是按键序号(0-15)!RETNEXT:INCR3 ;修改偏移量,继续查LJMPKEYN2 ;-以下

46、是延时10ms子程序DEL10MS: MOVR5,#20 ;按照实验箱的主频,这是10毫秒,不需要很准DEL1:MOVR6,#125DJNZR6,$DJNZR5,DEL1RET ;-以下是键行列值的列表,排列顺序很重要!KTAB:DB0EEH, 0EDH, 0EBH, 0E7H, 0DEH, 0DDH, 0DBH, 0D7HDB0BEH, 0BDH, 0BBH, 0B7H, 07EH, 07DH, 07BH, 77HProteus 演示:用8只LED表示二进制数,显示按键次数(示范消抖与不消抖的表现)5. 补充:判断按键松开的必要性一次人工按键的接触时间最短也要50ms以上,51单片机程序执行

47、几百条指令仅仅用时1ms。如果仅仅发现按键就消抖然后处理,即便处理程序长达几千条,处理程序执行完毕,这次按键还没有松开,程序就会又当做一次按键处理,显然这是错误。(与前面“显示按键次数”补充题讲过的重复加1问题相同!)所以,一个完整的按键处理程序应该如下:有无按键有键、判断键号松开了吗?执行按键功能退出NYYN有无按键有键、判断键号松开了吗?执行按键功能退出NYYN按键松开再执行键功能先执行键功能然后等待按键松开再继续在消抖基础上,判断按键松开的程序:(只需修改KEY_CON子程序)MAIN: ;-以下是键盘控制子程序,其中调用键盘扫描、键值计算子程序KEY_CON:LCALL KEYS ;调

48、用键盘扫描,看看是否有键按下,C=0表示有键JC KEY_EXIT ;无键,退出子程序(返回主程序)LCALL DEL10MS ;延时10毫秒,为了消抖LCALL KEYS ;在此调用键盘扫描,看看是否按下键是否还存在JC KEY_EXIT ;消抖以后无键,表明是干扰,退出子程序(返回主程序)LCALL KEYN1 ; 消抖以后缓存在,调用计算键值子程序 ;根据键值进行某种操作的程序或子程序调用KEY_WAIT: LCALL KEYS ;调用键盘扫描,看看键是否松开,C=0表示没松开JC KEY_EXIT ;C=1键已松开,退出子程序(返回主程序)LJMP KEY_WAITKEY_EXIT:R

49、ET;-以下是键盘扫描子程序,仅仅用于发现键盘是否有键按下,返回C值KEYS: ;-以下是键值计算子程序,首先获取键的位置(行列值),然后计算出键的序号KEYN1: ;-以下是延时10ms子程序DEL10MS: ;-以下是键行列值的列表,排列顺序很重要!KTAB: 思考:PC机上的键盘输入字符时,快速按键(敲键)产生1个字符; 长时间按键则连续产生相同字符; 怎么实现? 手机按键、鼠标按键,都存在单击和双击产生不同功能, 怎么实现? 字符键、功能键是如何实现的?4.1.8 并行口的I/O应用4串行接口器件的接口和编程51单片机提供了扩展外围芯片的并行总线,可以扩展各种与CPU并行连接的接口器件,而且51的命令自动支持对并行总线的时序的支持,使用很简便。目前市场上出现了越来越多的串行连接的接口芯片,只占用2条口线或者3条口线就可以扩展1个接口芯片。虽然51单片机本身没有提供支持这类串行连接的接口芯片

温馨提示

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

评论

0/150

提交评论