1 / 39

第 7 章 MCS-51 与键盘、显示器的接口

单片机. 第 7 章 MCS-51 与键盘、显示器的接口. 7.1 MCS-51 单片机与键盘接口 7.2 MCS-51 单片机与 LED 显示器接口 7.3 MCS-51 单片机与行程开关、晶闸 管、继电器的接口. “ 断开 ”. “ 断开 ”. P1.1. VCC. “ 闭合 ”. 抖动时间 < 10ms. < 10ms. P1.1. K. GND. 开关动作时间 > 100ms. ( a ). ( b ). 7.1 MCS-51 单片机与键盘接口. 7.1.1 键盘的工作原理.

makana
Download Presentation

第 7 章 MCS-51 与键盘、显示器的接口

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 单片机 第7章 MCS-51与键盘、显示器的接口 • 7.1 MCS-51单片机与键盘接口 • 7.2 MCS-51单片机与LED显示器接口 • 7.3 MCS-51单片机与行程开关、晶闸 • 管、继电器的接口

  2. “ 断开 ” “ 断开 ” P1.1 VCC “ 闭合 ” 抖动时间 <10ms <10ms P1.1 K GND 开关动作时间 >100ms ( a ) ( b ) 7.1 MCS-51单片机与键盘接口 7.1.1 键盘的工作原理 键盘实际上是一组按键开关的集合,平时按键开关总是处于断开状态,当按下键时它才闭合。它的结构和产生的波形如图所示。

  3. +5v I/O 接 口 单 片 机 & +5v 开关 消除抖动电路 & 键盘的处理主要涉及三个方面: 1.按键的识别 2.抖动的消除 消除按键盘抖动通常有两种方法:硬件消抖和软件消抖。 硬件消抖是通过在按键输出电路上加一定的硬件线路来消除抖动,一般采用R-S触发器或单稳态电路。 软件消抖是利用延时来跳过抖动过程。

  4. F E D C 88 84 82 81 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 B A 9 8 48 44 42 41 7 6 5 4 第1行 28 24 22 21 3 2 1 0 18 14 12 11 第0行 +5V 第1列 第0列 逐列输出0以检查行线 ( b ) ( a ) 3.键位的编码 通常有两种方法编码。 (1)用连接键盘的I/O线的二进制组合进行编码。如(a)图。 (2)顺序排列编码。如(b)图。 处理方法如下:编码值=行首编码值X+列号Y。

  5. VCC VCC P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 8051 8051 GND GND 与 INT0 ( a )中断方式工作的 独立式键盘的结构形式 ( b )查询方式工作的 独立式键盘的结构形式 7.1.2 独立式键盘与单片机的接口 键盘的结构形式一般有两种:独立式键盘与矩阵式键盘。 独立式键盘就是各按键相互独立,每个按键各接一根I/O口线,每根I/O口线上的按键都不会影响其它的I/O口线。

  6. 下面是针对图7.4(b)图查询方式的汇编语言形式的键盘程序。总共有8个键位,KEY0~KEY7为8个键的功能程序。下面是针对图7.4(b)图查询方式的汇编语言形式的键盘程序。总共有8个键位,KEY0~KEY7为8个键的功能程序。 START:MOV A,#0FFH; MOV P1,A ;置P1口为输入状态 MOV A,P1 ;键状态输入 CPL A JZ START ;没有键按下,则转开始 JB ACC.0,K0 ;检测0号键是否按下,按下转 JB ACC.1,K1 ;检测1号键是否按下,按下转 JB ACC.2,K2 ;检测2号键是否按下,按下转 JB ACC.3,K3 ;检测3号键是否按下,按下转 JB ACC.4,K4 ;检测4号键是否按下,按下转 JB ACC.5,K5 ;检测5号键是否按下,按下转 JB ACC.6,K6 ;检测6号键是否按下,按下转 JB ACC.7,K7 ;检测7号键是否按下,按下转 JMP START ;无键按下返回,再顺次检测

  7. K0:AJMP KEY0 K1:AJMP KEY1 …… K7:AJIMP KEY7 KEY0:…… ;0号键功能程序 JMP START ;0号键功能程序执行完返回 KEY1:…… ;1号键功能程序 JMP START ;1号键功能程序执行完返回 …… KEY7:…… ;7号键功能程序 JMP START ;7号键功能程序执行完返回

  8. 7.1.3 矩阵键盘与单片机的接口 矩阵式键盘又叫行列式键盘。用I/O口线组成行、列结构,键位设置在行列的交点上。例如4×4的行、列结构可组成16个键的键盘,比一个键位用一根I/O口线的独立式键盘少了一半的I/O口线。 矩阵键盘的连接方法有多种: 可直接连接于单片机的I/O口线; 可利用扩展的并行I/O口(8255、8155等)连接; 也可利用可编程的键盘、显示专用接口芯片 (8279等)进行连接等等。 其中,利用扩展的并行I/O口连接方便灵活,在单片机应用系统中比较常用。

  9. PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0 CS 键码=行首键号+列号 (键号必须依次是从左至右书写) 或键码=列首键号+行号 (键号必须依次是从上至下书写) P2.7 WR WR RD RD 74LS373 ALE A1 A0 P0.0~P0.7 D0~D7 5.1K4 0 1 2 3 4 5 6 7 8051 PC0 PC1 PC2 PC3 8 9 10 11 12 13 14 15 20F 16 17 18 19 20 21 22 23 RESET +5V 24 25 26 27 28 29 30 31 1K 8255 +5V 编码值=行首编码值X+列号Y 下图就是通过8255A芯片扩展的并行I/O口连接48的矩阵键盘。 P2.7=0: A口地址为:7F00H; C口地址为:7F02H。 扫描法:列线输出,行线输入。 列线逐列输出0,某行有按键,行线输入就为0; 若无按键,行线输入全部为1。

  10. 一.矩阵键盘的工作过程 对矩阵键盘的工作过程可分两步: 第一步是CPU首先检测键盘上是否有键按下; 第二步是再识别是哪一个键按下。 1.检测键盘上是否有键按下处理方法是:将列线送入全扫描字,读入行线的状态来判别。其具体过程如下:PA口输出00H,即所有列线置成低电平,然后将行线电平状态读入累加器A中。如果有键按下,总会有一根行线电平被拉至低电平,从而使行输入状态不全为"1"。 2.识别键盘中哪一个键按下处理方法是:将列线逐列置低电平,检查行输入状态,称为逐列扫描。其具体过程如下:从PA0开始,依次输出“0”,置对应的列线为低电平,然后从PC口读入行线状态,如果全为“1”,则按下的键不在此列;如果不全为“1”,则按下的键必在此列,而且是该列与“0”电平行线相交的交点上的那个键。为求取编码,在逐列扫描时,可用计数器记录下当前扫描列的列号,检测到第几行有键按下,就用该行的首键码加列号得到当前按键的编码。

  11. 开始 有键按下否? 是 否 调用6ms延时子程序 调用12ms延时子程序 否 有键按下否? 是 判闭合键,编码入栈保护 否 闭合键释放否? 是 编码A 返回 二.矩阵键盘的工作方式 1.查询工作方式 这种方式是直接在主程序中插入键盘检测子程序,主程序每执行一次则键盘检测子程序被执行一次,对键盘进行检测一次,如果没有键按下,则跳过键识别,直接执行主程序;如果有键按下,则通过键盘扫描子程序识别按键,得到按键的编码值,然后根据编码值进行相应的处理,处理完后再回到主程序执行。键盘扫描子程序流程如图 。

  12. 键盘扫描子程序如下:(硬件线路如图7.4,8255A的A口、B口、C口和控制口地址分别为7F00H、7F01H、7F02H、7F03H,设8255A已在主程序中初始化。已设定为A口方式0输出,C口的低4位方式0输入。)键盘扫描子程序如下:(硬件线路如图7.4,8255A的A口、B口、C口和控制口地址分别为7F00H、7F01H、7F02H、7F03H,设8255A已在主程序中初始化。已设定为A口方式0输出,C口的低4位方式0输入。) KEY1:ACALL KS1 ;调用判断有无键按下子程序 JNZ LK1 ;有键按下时,(A)≠0转消抖延时 KEY2:ACALL TM6ms AJMP KEY1 ;无键按下返回 LK1: ACALL TM12ms ;调12 ms延时子程序 ACALL KS1 ;查有无键按下,若有则真有键按下 JNZ LK2 ;键(A)≠ 0逐列扫描 AJMP KEY2 ;不是真有键按下,返回 LK2: MOV R2,#0FEH ;初始列扫描字(0列)送入R2 MOV R4,#00H ;初始列(0列)号送入R4 LK4: MOV DPTR,#7F00H ;DPTR指向8255PA口 MOV A,R2 ;列扫描字送至8255PA口 MOVX @DPTR,A INC DPTR ;DPTR指向8255PC口 INC DPTR

  13. MOVX A,@DPTR ;从8255 PC口读入行状态 JB ACC.0,LONE ;查第0行无键按下,转查第1行 MOV A,#00H ;第0行有键按下,行首键码#00H→A AJMP LKP ;转求键码 LONE: JB ACC.1,LTWO ;查第1行无键按下,转查第2行 MOV A,#08H ;第1行有键按下,行首键码#08H→A AJMP LKP ;转求键码 LTWO:JB ACC.2,LTHR ;查第2行无键按下,转查第3行 MOV A,#10H ;第2行有键按下,行首键码#10H→A AJMP LKP ;转求键码 LTHR: JB ACC.3,NEXT ;查第3行无键按下,转该查下一列 MOV A,#18H ;第3行有键按下,行首键码#18H→A LKP: ADD A,R4 ;求键码,键码=行首键码+列号 PUSH ACC ;键码进栈保护 LK3: ACALL KS1 ;等待键释放 JNZ LK3 ;键未释放,等待 POP ACC ;键释放,键码→A RET ;键扫描结束,出口状态(A)=键码

  14. NEXT:INC R4 ;准备扫描下一列,列号加1 MOV A,R2 ;取列扫描字送累加器A JNB ACC.7,KEND ;判断8列扫描否?扫描完返回 RL A ;扫描字左移一位,变为下一列扫描字 MOV R2,A ;扫描字送入R2保存 AJMP LK4 ;转下一列扫描 KEND: AJMP KEY1 KS1:MOV DPTR,#7F00H ;DPTR指向8255的PA口 MOV A,#00H ;全扫描字→A MOVX @DPTR,A ;全扫描字送往8255的PA口 INC DPTR ;DPTR指向8255的PC口 INC DPTR MOVX A,@DPTR ;读入PC口行状态 CPL A;变正逻辑,以高电平表示有键按下 ANL A,#0FH ;屏蔽高4位,只保留低4位行线值 RET ;出口状态:(A)≠0时有键按下 执行KS1子程序的结果是:有闭合键则(A)≠ 0; 无闭合键则(A)= 0。 CPL A;负逻辑不直观,常采取行列线加反相器或 软件求反的方法把键盘改成正逻辑。

  15. TM12ms:MOV R7,#18H ;延时12ms子程序 TM: MOV R6,#0FFH TM6: DJNZ R6,TM6 DJNZ R7,TM RET TM6ms: MOV R7,#0CH ;延时6ms子程序 TM2: MOV R6,#0FFH TM62: DJNZ R6,TM6 DJNZ R7,TM RET C语言键盘扫描子程序:略 2.定时扫描工作方式 3.中断处理方式

  16. D7 D6 D5 D4 D3 D2 D1 D0 h g f e d c b a g f com a b a a b b 10 9 8 7 6 a c c d d f b g e e e c f f d dp g g 1 2 3 4 5 dp dp 代码位 e d com c dp com com 显示段 ( a )共阴极结构 ( b )共阳极结构 (c )管脚图 7.2 MCS-51单片机与LED显示器接口 7.2.1 LED显示器的结构与原理 在单片机应用系统中通常使用的是8段式LED数码管显示器,它有共阴极和共阳极两种,如图所示。 LED(Light Emiting Diode)

  17. 其中:(a)为共阴极结构。(b)为共阳极结构。(c)图为管脚图,从a~g管脚输入不同的8位二进制编码,可显示不同的数字或字符。共阴极和共阳极的字段码互为反码

  18. VCR 11 地址 译码 和字 段码 ROM 阵列 a 12 A 5 4 锁 存 器 13 b 14 c B 6 15 d C 9 1 e 2 f D 10 3 g 4 LE 7 h+i 8 16 Vss VDD 7.2.2 LED数码管显示器的译码方式 译码方式是指由显示字符转换得到对应的字段码的方式 。 一.硬件译码方式 硬件译码方式是指利用专门的硬件电路来实现显示字符到字段码的转换,这样的硬件电路有很多,比如MOTORLA公司生产的MC14495芯片就是其中的一种,MC14495是共阴极一位十六进制数——字段码转换芯片,能够输出用四位二进制表示形式的一位十六进制数的七位字段码,不带小数点。它的内部结构如图。 二.软件译码方式 软件译码方式就是通过编写软件译码程序,通过译码程序来得到要显示的字符的字段码。

  19. a b h a b h a b h a f b g e c d h COM COM COM 对应字位线: D0 D1 D2 D3 D4 D5 7.2.3 LED数码管的显示方式 静态显示 显示多位数据的 两种电路: 静态显示; 动态显示。 动态显示 段控和位控

  20. I/O(1) I/O(2) a b c d e f g dp a b c d e f g dp 一、LED静态显示 LED静态显示时,其公共端直接接地(共阴极)或接电源(共阳极),各段选线分别与I/O口线相连。要显示字符,直接在I/O线送相应的字段码。 多位LED共用一个8位字段口(共阴极或共阳极), 各位LED公共端用字位口控制,扫描输出显示不同字形。 显示缓冲区与多位LED对应关系: 每个LED需要一个8位并行口。 特点:显示亮度大,硬件和软件都较简单,应用广泛。

  21. “0” 静态显示电路 显示80C51片内RAM中以30H为首地址的8位 字形数的程序: 例:

  22. 程序: • DIR:PUSH ACC ;保护现场 • PUSH DPH • PUSH DPL • MOV R2,#08H ;显示8个数 • MOV R0,#30H ;显示缓冲区地址送入R0 • DL0:MOV A,@R0 ;取要显示的数作查表偏移量 • MOV DPTR,#TAB ;指向字形码表首 • MOVC A,@A+DPTR ;查表得字形码 • MOV SBUF,A ;发送显示 • DL1:JNB TI,DL1 ;等待发送完一桢数据 • CLR TI ;清标志,准备继续发送 • INC R0 ;更新显示单元 • DJNZ R2,DL0 ;重复显示所有数码管 • POP DPL ;恢复现场 • POP DPH • POP ACC • RET • TAB:DB 0C0H,0F9H,0A4H,0B0H,99H ;0,1,2,3,4 • DB 92H,82H,0F8H,80H,90H,88H ;5,6,7,8,9,A • DB 83H,0C6H,0A1H,86H,8EH ;B,C,D,E,F

  23. I/O(1) D3 D2 D1 D0 I/O(2) 二、LED动态显示方式 LED动态显示是将所有的数码管的段选线并接在一起,用一个I/O口控制,公共端不是直接接地(共阴极)或电源(共阳极),而是通过相应的I/O口线控制。 分时轮流选通数码管的公共端,使得各数码管轮流导通,在选通相应LED后,即在显示字段上得到显示字形码。 特点:提高数码管的发光效率,可简化硬件线路。

  24. 设数码管为共阳极,它的工作过程为:第一步使右边第一个数码管的公共端D0为1,其余的数码管的公共端为0,同时在I/O(1)上送右边第一个数码管的字段码,这时,只有右边第一个数码管显示,其余不显示;第二步使右边第二个数码管的公共端D1为1,其余的数码管的公共端为0,同时在I/O(1)上送右边第二个数码管的字段码,这时,只有右边第二个数码管显示,其余不显示,依此类推,直到最后一个,这样四个数码管轮流显示相应的信息,一个循环完后,下一循环又这样轮流显示,从计算机的角度看是一个一个的显示,但由于人的视觉滞留,只要循环的周期足够快,看起来所有的数码管都是一起显示的了。这就是动态显示的原理。而这个循环周期对于计算机来说很容易实现。所以在单片机中经常用到动态显示。

  25. 三、LCD显示 • LCD(Liquid Crystal Display): • 它是一种被动式的显示器,即液晶本身并不发光,而是利用液晶经过处理后能改变光线通过方向的特性,而达到白底黑字或黑底白字显示的目的。 • LCD只能工作在静态显示方式。 • 并要求加上专门的驱动芯片4056。 • 原理与LED类似!!

  26. 输出2位显示,即1字节。 串行口控制的静态LCD显示(2位)

  27. 程序: • #include<reg51.h> • #define uchar unsigned char • uchar byte=0x59; • void display(uchar x) • { • SBUF=x; /*由串行口输出*/ • while(TI= =0); /*等待8位发送结束*/ • TI=0; • } • void main(void) • { • display(byte); • } 因4056是BCD的LCD驱动芯片,故byte中包含的BCD码可直接输出显示。

  28. 7.2.4 LED显示器与单片机的接口 P1.0 P1.1 P1.2 P1.3 A B C D A B C D LE MC14495 LE MC14495 a b c d e f g a b c d e f g a b c d e f g a b c d e f g 8051 P1.4 P1.5 LED显示器从译码方式上有硬件译码方式和软件译码方式。从显示方式上有静态显示方式和动态显示方式。在使用时可以把它们组合起来。在实际应用时,如果数码管个数较少,通常用硬件译码静态显示,在数码管个数较多时,则通常用软件译码动态显示。 一.硬件译码静态显示 下图是一个两位数码管硬件译码静态显示的接口电路图。

  29. 二.软件译码动态显示 下图是一个8位软件译码动态显示的接口电路图。图中用8255A扩展并行I/O口接数码管,数码管采用动态显示方式,8位数码管的段选线并联与8255A的A口通过74LS373相连,8位数码管的公共端通过74LS373分别与8255A的B口相连。也即8255A的B口输出位选码选择要显示的数码管,8255A的A口输出字段码使数码管显示相应的字符,8255A的A口和B口都工作于方式0输出。A口、B口、C口和控制口的地址分别为7F00H、7F01H、7F02H和7F03H。

  30. 74LS373 CS P2.7 PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 D0 D1 D2 D3 D4 D5 D6 D7 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 WR WR RD RD 74LS373 A1 G A1 ALE A0 A0 G OE P0.0~P0.7 D0~D7 VCC … 8051 8255 …… D7 D0 D1 D2 74LS373 PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 D0 D1 D2 D3 D4 D5 D6 D7 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 地址: A口: 7F00H B口: 7F01H C口: 7F02H 控制口:7F03H G OE VCC 共阴极

  31. 软件译码动态显示汇编语言程序为: (设8个数码管的显示缓冲区为片内RAM的57H~50H单元) DISPLAY:MOV A,#10000000B ;8255初始化 MOV DPTR,#7F03H ;使DPTR指向8255控制寄存器端口 MOVX @DPTR,A MOV R0,#57H ;动态显示初始化,使R0指向缓冲区首址 MOV R3,#7FH ;首位位选字送R3 MOV A,R3 LD0: MOV DPTR,#7F01H ;使DPTR指向PB口 MOVX @DPTR,A ;选通显示器高位(最右端一位) DEC DPTR ;使DPTR指向PA口 MOV A,@R0 ;读要显示数 ADD A,#0DH ;调整距段选码表首的偏移量 MOVC A,@A+PC ;查表取得段选码 MOVX @DPTR,A ;段选码从PA口输出 ACALL DL1 ;调用1ms延时子程序 DEC R0 ;指向缓冲区下一单元 MOV A,R3 ;位选码送累加器A

  32. JNB ACC.0,LD1 ;判断8位是否显示完毕,显示完返回 RR A ;未显示完,把位选字变为下一位选字 MOV R3,A ;修改后的位选字送R3 AJMP LD0 ;循环实现按位序依次显示 LD1: RET TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;共阴极字段码表 DB: 7FH,6FH,77H,7CH,39H,5EH,79H,71H DL1:MOV R7,#02H ;延时子程序 DL: MOV R6,#0FFH DL0:DJNZ R6,DL0 DJNZ R7,DL RET

  33. 软件译码动态显示C语言程序为: #include <reg51.h> #include <absacc.h> //定义绝对地址访问 #define uchar unsigned char #define uint unsigned int void delay(uint); //声明延时函数 void display(void); //声明显示函数 uchar disbuffer[8]={0,1,2,3,4,5,6,7}; //定义显示缓冲区 void main(void) { XBYTE[0x7f03]=0x80; //8255A初始化 while(1) {display(); //设显示函数 } } //************延时函数************ void delay(uint i) //延时函数 {uint j; for (j=0;j<i;j++){ } }

  34. //***********显示函数************ void display(void) //定义显示函数 {uchar codevalue[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0~F的共阴极字段码表 uchar chocode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位选码表 uchar i,p,temp; for (i=0;i<8;i++) { p=disbuffer[i]; //取当前显示的字符 temp=codevalue[p]; //查得显示字符的字段码 XBYTE[0x7f00]=temp; //送出字段码(PA口) temp=chocode[i]; //取当前的位选码 XBYTE[0x7f01]=temp; //送出位选码(PB口) delay(20); //延时1ms } }

  35. 开关 S E2 E1 光电耦合器件 单片机的I/O引脚 10F 10K 10K 10K 7.3 MCS-51单片机与行程开关、晶闸管、继电器的接口 7.3.1 行程开关、继电器与MCS-51单片机的接口 行程开关和继电器常开触点与单片机的接口如图所示。

  36. 6 5 4 5V 91 Rs 1 2 ~220V 100 7407 Cs 0.1F P1.0 4N40 10K 180 大功率 晶闸管 及负载 5V 8051 6 4 1 2 7407 P1.1 过零 电路 MOC3041 7.3.2 晶闸管与MCS-51单片机的接口

  37. VCC +5V +5V VCC R VD2 S1 8051 R 8051 VD1 S1 R1 V1 P1.1 V1 P1.1 7406 VD1 7406 4N25 R2 7.3.3 继电器与MCS-51单片机的接口

  38. PB2130 UP002A +5V 8051 8051 R1 PB2130 UP002A V1 P1.0 P1.0 R2 +5V 7406 7.3.4 蜂鸣器与MCS-51单片机的接口

More Related