51单片机教程5_第1页
51单片机教程5_第2页
51单片机教程5_第3页
51单片机教程5_第4页
51单片机教程5_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

第五讲:接口与系统扩展( 2)一步一部教你学单片机 之 :四TEL展键盘接口四、 键盘接口 P.194键盘 单片机系统中完成控制参数输入及修改的 基本输入设备 ,是人工干预系统的重要手段。单片机与计算机在键盘规模 /键符设置等方面差别很大。键盘分类 按键值 编码方式 分 (硬件 )编码键盘 与 非 (硬件 )编码键盘 。 按键组 连接方式 分 独立连接键盘 与 矩阵连接键盘 。编码键盘 : 采用专用的编码 /译码 器件 ,被按下的键由该器件译码输出相应的 键码 /键值 。特点: 增加了硬件开销,编码因选用器件而异,编码固定,但编程简单。适用于规模大的键盘。非编码键盘 : 单片机系统多采用此类键盘 采用 软件 编 /译码的方式 ,通过扫描,对每个被按下的键判别输出相应的 键码 /键值 。特点: 不增加硬件开销,编码灵活,适用于小规模的键盘,特别是单片机系统。但编程较复杂 ,占 CPU时间,还须软件 “ 消颤 ” 。按键值编码方式 :编码键盘 与 非编码键盘按键组连接方式 :独立连接键盘 与 矩阵连接键盘独立连接键盘 : 每键相互独立,各自与一条 I/O线相连, CPU可直接读取该 I/O线的高 /低电平状态。特点: 占 I/O口线多,但判键速度快,多用于设置控制键、功能键。适用于键数少的场合。矩阵连接键盘 : 键按矩阵排列 ,各键处于矩阵行 /列的 结点 处 ,CPU通过对连在 行 (列 )的 I/O线送已知电平的信号 ,然后读取 列 (行 )线的状态信息。逐线扫描 ,得出键码。特点: 键多时 占用 I/O口线少 ,但判键速度慢 ,多用于设置数字键。适用于键数多的场合。独立连接式键盘 例 1:特点: 此子程序需 不断 (或 定时 )调用 ,否则可能漏判。 4个键的优先级由指令顺序决定。P1.0P1.1P1.2P1.3KEY: JNB P1.0,FUNC1 ;逐键判别JNB P1.1,FUNC2 JNB P1.2,FUNC3 JNB P1.3,FUNC4RET ;无任何键按下由此返回FUNC1: ;做 P1.0要求的 “ 功能 1”RETFUNC2: ;做 P1.1要求的 “ 功能 2”RETFUNC3: ;做 P1.2要求的 “ 功能 3”RETFUNC4: ;做 P1.3要求的 “ 功能 4”RETAT89C51独立连接式键盘 例 2特点: 此子程序采用 中断查询 不会漏判 ,省时。 键的优先级由指令顺序决定。 为防止一次按键多次中断,在功能子程序里应安排 “ 关 /开中断指令 ” 并 “ 延时 ”。P1.0P1.1P1.2P1.3ORG 0003HLJMP KEYKEY: JNB P1.0,FUNC1 ;逐键判别JNB P1.1,FUNC2 JNB P1.2,FUNC3 JNB P1.3,FUNC4RETI ;无任何键按下由此返回FUNC1: ;做 P1.0要求的 “ 功能 1”RETIFUNC2: ;做 P1.1要求的 “ 功能 2”RETIFUNC3: ;做 P1.2要求的 “ 功能 3”RETIFUNC4: ;做 P1.3要求的 “ 功能 4”RETIINT0查有无键闭合JNZ LK1 ;有键闭合转消颤LJMP LK8 ;无键闭合则退出LK1: LCALL DL6ms ;消颤 12msLCALL DL6msLCALL KS1 ;再查有无键闭合JNZ LK2 ;的确有,转 处理LJMP LK8 ;确实无,退 出去查有无键闭合的子程序 KS1:KS1: MOV DPTR, #0101H ;指向 A口MOV A, #00H ;8条行线都送 0MOVX, DPTR, A;送到行线上去INC DPTRINC DPTR ;指向 C口MOVX A, DPTR ;读列线的电平ANL A, #0FH ;保留 C口低 4位若确有键按下 ,则 Acc中必有“ 0” ORL A, #0F0H ;将 Acc高 4位赋 1CPL A ;Acc取反后,高 4位 =0;若有键按下 ,则低 4位中必有“ 1”RET检查的结果(出口) :若 (A)0, 则有键按下;若 (A) 0,则 无键按下。行线列线0列3列1列2列0行 1行 2行 3行 4行 5行 6行 7行0 4 8 12 16 20 24 281 5 9 13 17 21 25 292 6 10 14 18 22 26 303 7 11 15 19 23 26 31KEY1:LCALL KS1 ;查有无键闭合JNZ LK1 ;有键闭合转消颤LJMP LK8 ;无键闭合则退出LK1: LCALL DL6ms ;消颤 12msLCALL DL6msLCALL KS1 ;再查有无键闭合JNZ LK2 ;的确有,转 处理LJMP LK8 ;确实无,退 出去LK2: MOV R3, #00H ;(R3) 行号初值MOV R2, #0FEH;(R2) 行扫描初值LK3: MOV DPTR #0101H;指向 8155 A口MOV A, R2 ;取 行扫描值MOVX, DPTR, A ;送 到行线上去INC DPTRINC DPTR ;指向 8155 C口MOVX A, DPTR ;读 列线的电平ANL A, #0FH ;保留 C口低 4位MOV R4, A ;列值暂存进 R4CJNE A, #0FH,LK4;列值 全“ 1”表明 此次送 0的行 有键按下 ,转 LK4处理 ,若全 1,表明 此次送 0的行 无键按下。 行号 : 第 0行 第 7行 (R3)(0,1,2,3,4,5,6,7) 行扫描值: 0FEH (R2)(FE,FD,FB,F7,EF,DF,BF,7F)FEH = 1111 1110 B(首次扫描 )FDH = 1111 1101 B (2次扫描 )FBH = 1111 1011 B (3次扫描 )F7H = 1111 0111 B (4次扫描 )EFH = 1110 1111 B (5次扫描 )DFH = 1101 1111 B (6次扫描 )BFH = 1011 1111 B (7次扫描 )7FH = 0111 1111 B (8次扫描 ) 列值: (0F,0E,0D,0B,07)从 C口低 4位读进 (R4) 0F: 表示此行无键按下。0E07 : 此行的 03 列有键按下。KEY1:LCALL KS1 ;查有无键闭合JNZ LK1 ;有键闭合转消颤LJMP LK8 ;无键闭合则退出LK1: LCALL DL6ms ;消颤 12msLCALL DL6msLCALL KS1 ;再查有无键闭合JNZ LK2 ;的确有,转 处理LJMP LK8 ;确实无,退 出去LK2: MOV R3,#00H ;(R3) 行号初值MOV R2,#0FEH;(R2) 行扫描初值LK3: MOV DPTR #0101H;指向 8155 A口MOV A, R2 ;取 行扫描值MOVX, DPTR, A ;送到行线上去INC DPTRINC DPTR ;指向 8155 C口MOVX A, DPTR ;读列线的电平ANL A, #0FH ;保留 C口低 4位MOV R4, A ;列值暂存进 R4CJNE A,#0FH,LK4;列值 全“ 1”表明此次送 0的行有键按下 ,转 LK4处理, 若全 1,表明此次送 0的行无键按下。MOV A, R2 ;取出此次 行扫描值JNB ACC.7,LK8 ;若已扫过最后一行就 退出扫描 ,否则扫下一行。 RL A ;Acc中的 “ 0” 左移一位MOV R2,A ;新扫描值 仍存进 R2INC R3 ;行号加 1指向下一行SJMP LK3 ;转 LK3去扫描下一行 行号 : 第 0行 第 7行 (R3)(0,1,2,3,4,5,6,7) 行扫描值: 0FEH (R2)(FE,FD,FB,F7,EF,DF,BF,7F)FEH = 1111 1110 B(首次扫描 )BFH = 1011 1111 B (7次扫描 )7FH = 0111 1111 B (8次扫描 )注意:只有 第 8次 扫描值 最高位 = 0KEY1:LCALL KS1 ;查有无键闭合JNZ LK1 ;有键闭合转消颤LJMP LK8 ;无键闭合则退出LK1: LCALL DL6ms ;消颤 12msLCALL DL6msLCALL KS1 ;再查有无键闭合JNZ LK2 ;的确有,转 处理LJMP LK8 ;确实无,退 出去LK2: MOV R3,#00H ;(R3) 行号初值MOV R2,#0FEH;(R2) 行扫描初值LK3: MOV DPTR #0101H;指向 8155 A口MOV A, R2 ;取 行扫描值MOVX, DPTR, A ;送到行线上去INC DPTRINC DPTR ;指向 8155 C口MOVX A, DPTR ;读列线的电平ANL A, #0FH ;保留 C口低 4位MOV R4, A ;列值暂存进 R4CJNE A,#0FH,LK4;列值 全“ 1”表明此次送 0的行有键按下 ,转 LK4处理, 若全 1,表明此次送 0的行无键按下。MOV A, R2 ;取出此次 行扫描值JNB ACC.7,LK8 ;若已扫过最后一行就退出扫描 ,否则扫下一行。 RL A ;Acc中的 “ 0” 左移一位MOV R2,A ;新扫描值 仍存进 R2 INC R3 ;行号加 1指向下一行SJMP LK3 ;转 LK3去扫描下一行LK4: MOV A, R3 此行有按键 ,取行号ADD A, R3 ;行号乘 4MOV R5, A ;得 行首值ADD A, R5 ;即 :0,4,8,12MOV R5, A ;暂存进 R5KEY1:LCALL KS1 ;查有无键闭合JNZ LK1 ;有键闭合转消颤LJMP LK8 ;无键闭合则退出LK1: LCALL DL6ms ;消颤 12msLCALL DL6msLCALL KS1 ;再查有无键闭合JNZ LK2 ;的确有,转 处理LJMP LK8 ;确实无,退 出去LK2: MOV R3,#00H ;(R3) 行号初值MOV R2,#0FEH;(R2) 行扫描初值LK3: MOV DPTR #0101H;指向 8155 A口MOV A, R2 ;取 行扫描值MOVX, DPTR, A ;送到行线上去INC DPTRINC DPTR ;指向 8155 C口MOVX A, DPTR ;读列线的电平ANL A, #0FH ;保留 C口低 4位MOV R4, A ;列值暂存进 R4CJNE A,#0FH,LK4;列值 全“ 1”表明此次送 0的行有键按下 ,转 LK4处理, 若全 1,表明此次送 0的行无键按下。MOV A, R2 ;取出此次 行扫描值JNB ACC.7,LK8 ;若已扫过最后一行就退出扫描 ,否则扫下一行。 RL A ;Acc中的 “ 0” 左移一位MOV R2,A ;新扫描值 仍存进 R2 INC R3 ;行号加 1指向下一行SJMP LK3 ;转 LK3去扫描下一行LK4: MOV A, R3 此行有按键 ,取行号ADD A, R3 ;行号乘 4MOV R5, A ;得 行首值ADD A, R5 ;即 :0,4,8,12MOV R5, A ;暂存进 R5MOV A, R4 ;列值只可能#0F,#0E,#0D,#0B,#07HLK5: RRC A ;取列值的最低位到 CyJNC LK6 ;Cy=0就找到了 ,即 R5INC R5 ;否则行值增 1,即同行中的下一个键值SJMP LK5 ;再转 LK5判 C键值LK6: PUSH 05H ;将找到的键值压栈保存起来。KEY1:LCALL KS1 JNZ LK1 LJMP LK8 LK1: LCALL DL6ms LCALL DL6msLCALL KS1 JNZ LK2 LJMP LK8 LK2: MOV R3,#00HMOV R2,#0FEHLK3: MOV DPTR #0101HMOV A, R2 MOVX, DPTR, A INC DPTRINC DPTR MOVX A, DPTR ANL A, #0FH MOV R4, A CJNE A,#0FH,LK4MOV A, R2 JNB ACC.7,LK8RL A MOV R2,AINC R3 SJMP LK3LK4: MOV A, R3ADD A, R3 MOV R5, A ADD A, R5 MOV R5, A MOV A, R4 LK5: RRC A ;取列值的最低位到 CyJNC LK6 ;Cy=0就找到了 ,即 R5INC R5 ;否则行 值增 1,即同行中的下一个键值SJMP LK5 ;再转 LK5判 C键值LK6: PUSH 05H ;将找到的键值压栈保存起来。LK7: LCALL DL6ms;延 6msLCALL KS1;键 释放?JNZ LK7;未释放 ,等 LCALL DL6ms ;消颤LCALL DL6ms POP ACC ;键 值 ARND: RETLK8: MOV A, #0FFH;无键闭合标志 ARET 矩阵式键盘 线反转法 (P.202)AT89C51P1.0 P1.1 P1.2 P1.3P1.4 P1.5 P1.6 P1.7+5vP202图 6-280行1行2行3行0列1列2列3列原理 : 由 行线输出 全 “ 0” , 读入列线 ,判有无键按下。 若有键按下 ,再将读入的列线值由 列线输出 ,读进行线的值。 第一步读进的列线值与第二步读进的行线值 相加 ,从而得到代表此键的唯一的 特征值 。 线反转法因 输入与输出线反过来 用而得名。 优点 是判键速度 快 ,两次即可。矩阵式键盘 线反转法 图例AT89C51P1.0 P1.1 P1.2 P1.3P1.4 P1.5 P1.6 P1.7+5v MOV P1, #0F0H ;低位送全“ 0”MOV A, P1 ;读进 P1口电平ANL A, #0F0H ;保留高 4位CJNE A, #0F0H, MK3( );若有键按下则 P1.4P1.7 必有 “ 0” 位 ,跳转到 MK3去处理;若无键按下 则退出键扫描。0行1行2行3行0列1列2列3列设 :第 3行 /第 1列结点有键按下首先 : “1111 0000” P1然后读 P1: P1 “1101 xxxx” 只留高 4位 : A “1101 0000”因为有键按下 , A 11110000P202图 6-28AT89C51P1.0 P1.1 P1.2 P1.3P1.4 P1.5 P1.6 P1.7+5v MOV P1, #0F0H ;低位送全“ 0”MOV A, P1 ;读进 P1口电平ANL A, #0F0H ;保留高 4位CJNE A, #0F0H, MK3()0行1行2行3行0列1列2列3列此时: R2 “1101 0000”然后: A “1101 1111”返送 P1口 : “1101 1111” P1再读 P1口: P1 “xxxx 0111” 只留低 4位 : A “0000 0111”特征值 : A+R2= “1101 0111” MOV R2, A ;暂存回 R2ORL A, #0FH ;高 4位保留 ;低 4位充 “ 1”MOV P1, A ;新值返送 P1口MOV A, P1 ;再 读进 P1口电平ANL A, #0FH ;只留低 4位ADD A, R2 ;得到键特征值P202图 6-28矩阵式键盘 线反转法 图例D/A转换接口扩展五、 D/A转换器接口 ( P.209)D/A转换的一般工作原理 :常用 电阻分压 /分流 来实现 D/A转换。D/A转换器将数字信息转换成与数值成正比的电压 /电流。 有权电阻解码网络 与 T型解码网络 两种构建方法,又以 T型解码网络 最为常用。权电阻解码网络简单 。但随着 D/A转换的位数增加,权电阻值跨度增大,在集成电路中 难于实现 。T 型解码网络电阻 数量大 一倍。但电阻值归一化程度高 ,容易集成, 精度高 。应用最为普遍。权电阻解码网络+I IoutR0R1R2R3R4R5R6R7若: R0 = RR1 = R/2R2 = R/4R3 = R/8R7 = R/128从而 :I0 = Vref/RI1 = 2 Vref/RI2 = 4 Vref/RI3 = 8 Vref/RI7 =128Vref/R开关控制电路开关控制电路的作用:将 “ 0” 值 对应的开关打到 地,将 “ 1” 值 对应的开关接通Vref加法器电路简单 , 权电阻值跨度大,在集成电路中难于实现 D7D6D5D4D3D2D1D0Vref+ Iout2R2R2R2R2R2R2R2R每个 2R支路的电流均为上一支路的 1/2:I7 = (Vref/2R)I6 = (Vref/2R)/2I5 = (Vref/2R)/4I0 = (Vref/2R)/128开关控制电路开关控制电路 :“0” 值 将开关打到 地 ; “ 1” 值 将开关接通Vref加法器电路T 型解码网络2RRRRRRRR深度负反馈条件下 ,运放的 “ 虚短特性 ” :Vd 0 ,(因开环增益极大 ,输入端之间压差极小 )Ii 0 ,(因输入阻抗极大 ,输入电流极小 )从而 : 由节点 向下看 去阻值均为 2R由节点 向下向右看 去阻值均为 RVref“1”“0”I7I6I5I4I3I2I0I1电阻数量增大一倍 , 但阻值归一,集成容易,精度高D7D08位 CMOS数模转换芯片 DAC 0832: CS VCCWR1 ILEAGND WR2D3 XFERD2 D4D1 D5 D0 D6Vref D7Rfb Iout2DGND Iout1DAC083220 PIN DIP封装 8位 D/A, 分辨率 =Vref/256 CMOS低功耗器件, +5 +15V单电源供电 电流输出型器件 (需外接运放 ) 具有双缓冲控制输出 采用 T型电阻解码网络结构 参考电压源, -10 +10VDAC 0832 引脚定义 ( P.211)CS VCCWR1 ILEAGND WR2D3 XFERD2 D4D1 D5 D0 D6Vref D7Rfb Iout2DG

温馨提示

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

评论

0/150

提交评论