1.02k likes | 1.26k Views
单片机原理及其应用. (Principle and Application of Single Chip Microcomputer). 第 1 章 概述 第 2 章 MCS-51 单片机硬件结构 第 3 章 MCS-51 寻址方式和指令系统 第 4 章 MCS-51 汇编程序设计 第 5 章 中断系统 第 6 章 定时器 / 计数器及串行口 第 7 章 存储器扩展 第 8 章 接口电路扩展 第 9 章 应用举例. 8.1 显示器及其接口 8.2 键盘及其接口 8.3 D/A 转换器及其接口 8.4 A/D 转换器及其接口
E N D
单片机原理及其应用 (Principle and Application of Single Chip Microcomputer)
第1章 概述 第2章 MCS-51单片机硬件结构 第3章 MCS-51寻址方式和指令系统 第4章 MCS-51汇编程序设计 第5章 中断系统 第6章 定时器/计数器及串行口 第7章 存储器扩展 第8章 接口电路扩展 第9章 应用举例
8.1 显示器及其接口 8.2 键盘及其接口 8.3 D/A转换器及其接口 8.4 A/D转换器及其接口 8.5 打印机接口* 8.6 拨码盘及语音接口* 第8章接口电路设计
8.1.1 LED显示器 8.1.2 显示器接口实例 8.1.3 伟福实验系统LED显示器编程 8.1 显示器及其接口
1.LED显示器结构与原理 LED显示块是由发光二极管来显示字段的显示器件。 在单片机应用系统中通常使用的是八段LED, 有共阴极与共阳极两种,如图8-1所示。八段显示块与单片机接口非常容易。字符显示码(段码)如表8-1所示。 图8-1 八段LED显示块 8.1.1 LED显示器
图8-2 N位LED显示器 2.LED显示器与显示方式 在单片机应用系统中使用LED显示块构成N位LED显示器。图8-2是N位显示器的构成原理。 图8-2 N位LED显示器
图8-3 四位静态LED显示器电路 LED显示器有两种显示方式: (1)静态显示方式 (各个LED的段码来自不同I/O端口) 亮度高,无闪烁,编程简单,占用端口多。
图8-4 四位LED动态显示器电路 (2)动态显示方式 (各个LED的段码来自同一个I/O端口) 4个LED段线并联接到同一个I/O端口,LED的共阳极或 共阴极接到不同的I/O线。在某时刻只让一只LED的位选 线有效,配合这时的段码,该位LED显示相应的字符。 依次轮流让不同的LED显示字符,即为动态显示。
图8-5 八位LED动态显示过程和结果 占用端口少,编程较复杂,占用CPU时间多。
8.1.2 LED显示器接口实例 从LED显示器的原理可知,为了显示字母与数字, 必须最终转换成相应的段码。这种转换可以通过硬 件译码器或软件进行译码。 硬件译码器LED显示器接口 软件译码LED显示器接口
+5V +5V +5V 1. 硬件译码器LED显示器接口 图8-6 利用硬件译码器的八段LED接口电路
2. 软件译码LED显示器接口 位 段 PA口地址:7F01H PB口地址:7F02H 图8-7 通过8155扩展的8位LED动态显示接口
3. 动态显示程序设计 在内部RAM开辟6个单元作为 显示缓冲区:79H~7EH。 要显示的字符就分别放在显示 缓冲区中。 显示程序的工作是将显示缓冲 区的字符查出对应的段码依次送 到LED显示。 (1)程序流程图
DIR: MOV R0, #79H ; 显缓区指针初值 MOV R3, #01H ; 位选码初值(左边第一位LED) MOV A, R3 LD0: MOV DPTR, #7F01H ; A口地址 MOVX @DPTR, A INC DPTR ; B口地址 MOV A, @R0 ; 取要显示的字符 ADD A, #0DH ; 加偏移量 MOVC A, @A+PC ; 查段码表 DIR1: MOVX @DPTR, A ; 送B口 ACALL DL1ms ; 延时1ms INC R0 MOV A, R3 ; 准备调整位选码 (2)程序
JB ACC.5, LD1 ; 已到达最右边LED RL A ; 向右移一位LED MOV R3, A ;暂存位选码 AJMP LD0 LD1: RET DSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,6FH,77H DB 7CH,39H,5EH,79H,71H,73H,3EH,31H,6EH,1CH DB 23H,40H,03H,18H,00H DL1ms: MOV R7, #02H DL: MOV R6, #0FFH DL6: DJNZ R6, DL6 DJNZ R7, DL RET
1. LED硬件显示原理 ACC.0 ACC.0 数据位 (0FE06H) 时钟位 (0FE04H) 8.1.3 伟福实验系统LED显示器编程 D0 D5 位选通地址 (0FE02H) 向显示位选通地址输出高电平就可以点亮相应的显示位。 串行输入的数据位和时钟位由可编程器件CPLD(相当于74LS164)输出。写程序时,只要向数据位地址输出数据,然后向时钟位地址输出一高一低两个电平就可以将数据位送到74LS164中,并且实现移位。
段 位
D0 D0 段 位
否 是 否 是 2. 软件流程图
OUTBIT EQU 0FE02h ;位控制口 CLK164 EQU 0FE04h ;段控制口(接164时钟位) DAT164 EQU 0FE06h ;段控制口(接164数据位) LEDBuf EQU 60h ;显示缓冲区 ORG 0 LJMP Start Start: MOV SP, #40H MOV A, #1 ; 往显缓区填入1,2 MOV R0,#LEDBuf ; 3,4,5,6 FillBuf: MOV @R0,A INC A INC R0 CJNE R0, #LEDBuf+6, FillBuf DispAgain: LCALL Display ;调显示程序 LJMP DispAgain 3. 显示程序
Display: MOV R0, #LEDBuf ;显缓区指针 MOV R1, #6 ; 共6个八段管 MOV R2, #00100000B ;从左边开始显示 Loop: MOV DPTR, #OUTBIT ;位控制口地址 MOV A, #0 MOVX @DPTR, A ;关所有八段管 MOV A, @R0 ;取显示字符 MOV DPTR, #LEDMap ;段码表首址 MOVC A, @A+DPTR ;字符转换成显示码 MOV B, #8 ;送164(移位8次) DLP: RL A ;左移一位 MOV R3, A MOV DPTR, #DAT164 MOVX @DPTR, A ;输出一位数据
MOV DPTR, #CLK164 SETB ACC.0 ;时钟线高电平 MOVX @DPTR, A CLR ACC.0 ;时钟线低电平 MOVX @DPTR, A MOV A, R3 DJNZ B, DLP MOV DPTR, #OUTBIT MOV A, R2 MOVX @DPTR, A ;显示一位八段管 MOV R6, #1 ;延时初值 CALL Delay
MOV A, R2 ;显示下一位 RR A MOV R2, A INC R0 ;显缓区指针加一 DJNZ R1, Loop MOV DPTR, #OUTBIT MOV A, #0 MOVX @DPTR, A ;关所有八段管 RET LEDMAP: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H Delay: MOV R7, #0 ;延时子程序 DelayLoop: DJNZ R7, DelayLoop DJNZ R6, DelayLoop RET END
综合应用举例 单片机温度测量: 温度传感器:输入:0~100℃, 输出:0~5V 8位A/D转换器:输入:0~5V, 输出:0~255 已知A/D转换结果存放在30H, 要求将对应的温度 值BCD码存放在31H,32H,33H(高位在低地址)。 将温度值在LED上显示(右三位)。
主程序 OUTBIT EQU 0FE02h ;位控制口 CLK164 EQU 0FE04h ;段控制口(接164时钟位) DAT164 EQU 0FE06h ;段控制口(接164数据位) LEDBuf EQU 60h ;显示缓冲区 ORG 0 BEGIN: LJMP 30H ORG 30H ST: MOV R0, 30H ;取A/D数据 MOV R2, #64H MOV R1, #65H ;转换系数 ACALL CHENFA ;标度变换
CLR C ;舍入计算 MOV A, #81H SUBB A, R4 MOV A, R5 ADDC A, #0 MOV R5, A MOV R2, #0 ; 取结果转BCD MOV A, R5 MOV R3, A ; 00H ≤(R2R3) ≤64H ACALL BI2BCD MOV 31H, R5 ; 最后结果在R5R6中 MOV A, R6 ANL A, #0FH MOV 33H, A
MOV A, R6 SWAP A ANL A, #0FH MOV 32H, A MOV DPTR, #LEDBuf+3 MOV A, 31H MOVX @DPTR, A INC DPTR MOV A, 32H MOVX @DPTR, A INC DPTR MOV A, 33H MOVX @DPTR, A LCALL Display LJMP ST
8.2.1 独立式键盘接口 8.2.2 行列式键盘接口 8.2.3 典型键盘/显示器接口实例 8.2 键盘及其接口
在设计键盘接口时,要解决以 下几个问题: 开关状态的可靠输入——可硬件 电路去抖动或设计软件去抖动。 键盘状态的监测方法——中断方式还是查询方式。 键盘编码方法。 键盘控制程序的编制。 键盘的组成 键盘是由键盘矩阵行、列线之间的开关组成的。
1.独立式按键结构 独立式按键是指直接用I/O口线构成的单个按键电路。每根I/O口线上按键的工作状态不会影响其他I/O口线的工作状态。独立式按键电路如图8-8所示。 8.2.1 独立式键盘接口 图8-8 独立式按键电路
图8-9 使用8255扩展I/O的独立式键盘 2.独立式按键的软件编写 包括按键查询、消抖、键功能程序转移。
KEYIN:MOV P1, #0FFH ; MOV A, P1 ; 读键盘 CJNE A,#0FFH,QUDOU ;有键按下,消抖 AJMP BACK ;无键按下,返回 QUDOU: MOV R3, A ;暂存键状态, 下面比较用 LCALL DELY10 ;10ms消抖 MOV A, P1 ;再读键盘 CJNE A, R3, BACK ;两次读键不同,返回 KEY0:JB P1.0,KEY1 ;不是‘s0’键 LJMP PKEY0 ; ‘s0’键处理 KEY1: JB P1.1,KEY2 ; 不是‘s1’键 LJMP PKEY1 ; ‘s1’键处理 KEY2: JB P1.2,KEY3 ; 不是‘s2’键 LJMP PKEY2 ; ‘s2’键处理 ┆ KEY7: JB P1.7,BACK ; 不是‘s7’键 LJMP PKEY7 ; ‘s7’键处理 BACK: RET
1.键盘工作原理 按键设置在行列的交点上,行列线分别连接到按键开关的两端。 行线通过上拉电阻接+5伏,无键按下被钳位在高电平状态。有键按下,电平由列线决定。 8.2.2 行列式(矩阵式)键盘 图8-10 行列式键盘原理电路
2.按键按下的判别 (1) 扫描法 首先由列线送入低电平、读入行线状态来判断有无键按下。 若有一根行线是低电平说明有键按下了。 键盘中哪一个键按下可由列线逐列置低电平,检查行输入状态来判断。 若某行电平变低,按下的键就在这一行。行列相交确定按下键的键值。 图8-11 行列式键盘原理电路
(a)线反转法第一步 图8-12 线反转法原理 (2) 线反转法:只要经过两个步骤就可获得键值。 第一步,让行线为输出线,列线为输入线。 令行线输出全为低电平,若列线中某线为低电平,该线上有键按下了。 现在已知某列有键按下,但在哪一行未知。下一步将行列输出输入关系互换。
(b)线反转法第二步 图8-13 线反转法原理 3 0 7 4 8 11 12 15 第二步,让行线为输入线,列线为输出线。 令列线输出全为低电平或前一步得到的列值,则行线中为低电平的线上有键按下了。 结合前一步确定的列与现在确定的行,就能准确知道是什么键按下了。 (3) 键盘的编码 行列式键盘,每个键的位置由行值和列值惟一确定。通过行列值可以给每一个键规定一个键值,键值对应上键盘的排列就可确定键号。
3.键盘工作方式 单片机应用系统中,键盘扫描仅是一个任务。为了能尽快响应键盘,又不占用CPU太多时间,一般有三种键盘工作方式: 编程扫描方式、定时扫描方式、中断扫描方式。 1) 编程扫描方式 在CPU空闲时,不断调用键盘扫描程序,获取用户从键盘上输入的数据或命令。
端口地址:PA口:7F00H, PC口:7F02H, 控制口:7F03H PA口工作于方式0输出,PC口低四位工作于方式0输入。 工作过程 : (1) 判有无键按下。A口输出全0,读C口。 图8-14 8255A扩展组成的矩阵式键盘
若PC0~PC3全1,无键按下;否则,有键按下。 (2) 调软件延时10ms消除键抖动。 (3) 逐列置0扫描,确定按键位置。 (4) 等待键释放后,进行按键功能处理。 图8-14 8255A扩展组成的矩阵式键盘
单片机每隔一定的时间对键盘进行扫描,在有键按下单片机每隔一定的时间对键盘进行扫描,在有键按下 时识别该键,并进行处理。 消抖 已处理 键处理 2) 定时扫描方式 KM:去抖动标志 KP:处理标志 图8-15 定时扫描方式程序框图
只有在键盘按下时,发出中断请求,CPU扫描键盘。只有在键盘按下时,发出中断请求,CPU扫描键盘。 3) 中断扫描方式 图8-16 中断方式键盘接口
第一层:监视键盘输入,三种扫描方式。 第二层:识别键号,扫描法,线反转法。 第三层:按键功能处理。 4)键盘的工作层次
0 行 1 行 2 行 3 行 7列 0列 8.2.3 键盘/显示器接口实例 1. 8155键盘/显示器接口 1)接口电路 PA口输出,PC口输入 PA口地址:7F01H PC口地址:7F03H
程序功能: (1)判有无键闭合 列线全置低电平(PA口输出全0),查行线电平(PC口)。行线全为高电平,无键闭合。否则有键闭合。 (2)去除键盘机械抖动 延时后再判键盘状态,若先前查出的键仍闭合,确认有效。 (3)确定闭合键的位置:逐列扫描 用扫描码定出列值,用行状态定出行值,根据行值和列值给每一个键一个惟一的键值,然后用键值给每个键分配键号。 2)键盘程序
确定键号(键值) 键号的分配如硬件图标定, 第0行第0列交点处的键号为0… 第1行第0列交点处的键号为8… 任意键的键号=行首键值+列值 行首键值=该键键号,列值为列的编号 设PA口输出11111101B, 读出PC3~PC0为1101,说明第1行第1列交点处的键闭合。 键号=第1行行首键值+列值=8+1=9 (4)对闭合键仅处理一次:等键释放后再处理。
KS1 DIR DIR KS1 KS1
KEY1: ACALL KS1 ;调判有无键闭合子程序 JNZ LK1 ;有键压下,跳延时消抖 NI: ACALL DIR ;无键压下,调显示子程序 AJMP KEY1 LK1: ACALL DIR ;调显示子程序延时消抖 ACALL DIR ACALL KS1 ;再查键盘是否还有键压下 JNZ LK2 ;仍有键压下 AJMP NI ; 误动作 LK2: MOV R2, #0FEH ;列扫描码初值 MOV R4, #00H ;列值初值 LK4: MOV DPTR, #7F01H ;A口地址 MOV A, R2 ;取列扫描码 MOVX @DPTR, A ; 送到键盘列线
INC DPTR ;指向C口地址 INC DPTR MOVX A, @DPTR ;读行线状态 JB ACC.0, LONE ;第0行无键按下,查下一行 MOV A, #00 ;有键,置0行首键键值00H AJMP LKP LONE: JB ACC.1, LTW0 ;第1行无键按下,查下一行 MOV A, #08H ;有键,置1行首键键值08H AJMP LKP LTW0: JB ACC.2, LTHR ;第2行无键按下,查下一行 MOV A, #10H ;有键,置2行首键键值10H AJMP LKP LTHR: JB ACC.3, NEXT ;第3行无键按下,扫描下1列 MOV A, #18H ;有键,置3行首键键值18H LKP: ADD A, R4 ;计算键号=行首键值+列值
PUSH A ;保存键号 LK3: ACALL DIR ;延时6ms ACALL KS1 JNZ LK3 ;等待键释放 POP A ;取回键号 RET NEXT:INC R4 ;列值增一 MOV A, R2 ;取列扫描码 JNB ACC.7, KND ;已扫描最后一列,未找到键 RL A ;列扫描码左移移位 MOV R2, A ;保存列扫描码 AJMP LK4 ;重输出到列线 KND: AJMP KEY1