当前位置:首页 > 单片机 > 单片机
[导读]1. 扩展键盘电路AT89C2051是美国ATMEL公司采用CMOS工艺生产的20脚八位单片机。它带有2k字节flash ROM和128字节的片内RAM,15根I/O线,2个16位定时/计数器,5个两级中断源,一个全双工串行口。另外还带有精确的模拟比

1. 扩展键盘电路

AT89C2051是美国ATMEL公司采用CMOS工艺生产的20脚八位单片机。它带有2k字节flash ROM和128字节的片内RAM,15根I/O线,2个16位定时/计数器,5个两级中断源,一个全双工串行口。另外还带有精确的模拟比较器、片内振荡器和时钟电路。其指令集和输出管脚与工业标准的MCS-51系列器件兼容,是当前性/价比较高的一种八位单片机。

虽然采用8279/8155 等芯片扩展键盘较为方便,但在某些场合,特别是电路要求较为紧凑、印刷电路板较小的情况下,AT89C2051扩展键盘较为合适。其优点是体积小、成本低,同时在合理安排15根I/O口线的情况下,可以获得与8279/8155相同数量甚至更高的键盘数。其难点在于,在软件中必须妥善解决键盘扫描、去抖动、双键同时按下、与上位机通讯等问题。

图1所示为采用AT89C2051构成的键盘扩展电路。AT89C2051的串行口作为上位机的通讯口,以减轻多机通讯时上位机的串行负担,P1.0口线向上位机申请中断。为提高电路工作的可靠性,可以采用MAX705/706、MAX813L等看门狗电路,负责对CPU进行监视。本文采用MAX706复位/看门狗电路,并采用P3.7口线对其定时刷新,即“喂狗”。采用74LS138扩展行扫线,使用 P1.1、P1.2、P1.3对其进行控制,使行扫线依次改变状态。采用这种方法,行扫线最多为八根。由于本文键盘仅为20键,因此采用P1.4、 P1.5、P1.6、P1.7作为列扫线已经足够。对于所需键盘数更多的情况,可以补充P3.5、P3.4、P3.3、P3.2等口线作为列扫线。在此情况下,可以扩展的键盘数为64键。如不存在多机通讯的要求,可以继续补充P1.0口线作为列扫线。在此情况下,可扩展的键盘数为72个。如以P1.0扩展行扫线,采用两片74LS138或其它4-16译码器,则可扩展的键盘数最多可达128个。本电路中采用AT89C52作为上位机。

2. 软件结构

2.1 软件去抖动处理

按键的触点在闭合和断开时均会产生抖动,这时触点的逻辑电平是不稳定的,如不妥善处理,将会引起按键命令的错误执行或重复执行。本文采用软件延时的方法来避开抖动阶段,在延时开始和结束时读取列扫线状态,如果一致,则判断有键按下。延时时间为10ms。

2.2 按键连击的处理

连击是指操作者按下某一键但没有释放该键,则该键对应的功能将反复被执行,好象操作者在连续操作该键一样。由于单片机的速度较快,这种情况很容易发生。连击在很多情况下是不允许的,它使操作者很难准确地进行操作。

解决连击的关键是一次按键只让它响应一次,该键不释放就不执行第二次。

2.3 键盘扫描

本文采用的键盘为20键的小键盘,其扫描码较为简单,可参见图1,在此不作专门介绍。

2.4 与上位机通讯本文提出的方法是采用串行口进行通讯的。采用定时/计数器1为波特率发生器,具体数值为1200bps。AT89C2051采用串行中断方式与上位机进行通讯;而上位机的键盘响应与处理则安排在外中断1服务程序中。上位机在INT1中断服务程序中首先应向键盘发送相应的地址,然后再进入接收状态。在上位机的中断服务程序中,还可以设置接收键值的时间范围,超时则认为此键值作废。

2.5 MAX706的复位

AT89C2051对MAX706的复位安排在定时/计数器0的中断服务程序中。而上位机对MAX706等监控电路的复位可以自由安排,但必须在1.6s之内完成。

 

3. 软件程序清单

软件的流程框图如图2所示。具体的程序清单如下:
THIS_051  EQU #0AAH
NO_KEY   EQU  #0F0H
   ORG 0000H
   AJMP MAIN
   ORG 000BH
   AJMP INT_T0
   ORG 0023H
   AJMP INT_SERIES
   ORG 0030H
MAIN:
   MOV SP,#40H
   SETB P1.0
   SETB P1.1
   SETB P1.2
   SETB P1.3
CLR P3.7
    MOV TMOD,#21H
    MOV TL1,#0E6H
    MOV TH1,#0E6H
    MOV TL0,#00H
    MOV TH0,#80H
    CLR ET1
    SETB TR1
    SETB ET0
    SETB TR0
    MOV PCON,#80H
    MOV SCON,#0D0H
    SETB ES
    SETB EA
  READKEY:
    CLR P1.1
    CLR P1.2
    CLR P1.3
    MOV R1,#00H
    LCALL DELAY10US
    MOV A,P1
    ANL A,#0F0H
    CJNE A,NO_KEY,DEL_SHAKER1
    SJMP TEST_LINE2
  DEL_SHAKER1:
    LCALL DELAY10MS
    MOV A,P1
    ANL A,#0F0H
    CJNE A,NO_KEY,KEY_VALUE
  TEST桳INE2:
    SETB P1.1
    MOV R1,#01H
    LCALL DELAY10US
    MOV A,P1
    ANL A,#0F0H
    CJNE A,NO_KEY,DEL_SHAKER2
    SJMP TEST_LINE3
  DEL_SHAKER2:
    LCALL DELAY10MS
    MOV A,P1
    ANL A,#0F0H
    CJNE A,NO_KEY,KEY_CALUE
  TEST_LINE3:
    SETB P1.2
    CLR P1.1
    MOV R1,#02H  LCALL DELAY10US
    MOV A,P1
    ANL A,#0F0H
    CJNE A,NO_KEY,DEL_SHAKER3
    SJMP TEST_LINE4
  DEL_SHAKER3:
    LCALL DELAY10MS
    MOV A,P1
    ANL A,#0F0H
    CJNE A,NO_KEY,KEY_VALUE
  TEST_LINE4:
    SETB P1.1
    MOV R1,#03H
    LCALL DELAY10US
    MOV A,P1
    ANL A,#0F0H
    CJNE A,NO_KEY,DEL_SHAKER4
    SJMP TEST_LINE5
  DEL_SHAKER4:
    LCALL DELAY10MS
    MOV A,P1
    ANL A,#0F0H
    CJNE A,NO_KEY,KEY_VALUE
  TEST_LINE5:
    SETB P1.3
    CLR P1.1
    CLR P1.2
    MOV R1,#04H
    LCALL DELAY10US
    MOV A,P1
    ANL A,#0F0H
    CJNE A,NO_KEY,DEL_SHAKER5
    SJMP RET_READKEY
  DEL_SHAKER5:
    LCALL DELAY10MS
    MOV A,P1
    ANL A,#0F0H
    CJNE A,NO_KEY,KEY_VALUE
  RET_READKEY:
    AJMP READKEY
  KEY_VALUE:
    JNB ACC.7,FIRST_LINE
    JNB ACC.6,SECOND_LINE
    JNB ACC.5,THIRD_LINE
    JNB ACC.4,FOUTH_LINE
    AJMP READKEY
  FIRST_LINE:
    MOV R0,#03H
    SJMP SEND_KEY
  SECOND_LINE:
    MOV R0,#02H
    SJMP SEND_KEY
  THIRD_LINE:
    MOV R0,#01H
    SJMP SEND-KEY
  FOUTH_LINE:
    MOV R0,#00H
  SEND_KEY:
    MOV A,R0
    MOV B,#05H
    MUL AB
    ADD A,R1
    MOV DPTR,#KBTAB
    MOVC A,@A+DPTR
    MOV R3,A
    CLR P1.0
    LCALL DELAY10US
    SETB P1.0 KEY_LOOP:
    LCALL DELAY10US
     MOV A,P1
    ANL A,#0F0H
    CJNE A,NO_KEY,KEY_LOOP
    SETB P1.1
    SETB P1.2
    SETB P1.3
    AJMP READKEY
  INT桾0:
    MOV TL0,#00H
    MOV TH0,#80H
    CPL P3.7
    RETI
  INT_SERIES:
    PUSH ACC
    JNB RI,TRANSMISSION
    CLR RI
    MOV A,SBUF
    CJNE A,THIS?051,RETURN
    MOV A,R3
    MOV SBUF,A
    SJMP RETURN
TRANSMISSION:
    CLR TI
  RETURN:
    POP ACC
    RETI
  DELAY10MS:
    MOV R6,#10
  DELAY1:MOV R5,#250
  DELAY2:DJNZ R5,DELAY2
    DJNZ R6,DELAY1
    RET
  DELAY1MS:
    MOV R5,#250
  DELAY4:DJNZ R5,DELAY4
    RET
  DELAY10US:
    MOV R5,#05H
  DELAY3:DJNZ R5,DELAY3
    RET
  KBTAB:DB′TG369CF258DP147SH0IR′
 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

学好电子技术基础知识,如电路基础、模拟电路、数字电路和微机原理。这几门课程都是弱电类专业的必修课程,学会这些后能保证你看懂单片机电路、知道电路的设计思路和工作原理;

关键字: 单片机 编程 电路设计

上位机串口通信是指在上位机(通常是计算机或微控制器)与外部设备之间通过串行通信协议进行数据传输和通信的过程。在串口通信中,数据以位为单位按顺序传送,通常使用一个或两个物理线路(通常是两条线)来实现数据的发送和接收。

关键字: 上位机 串口通信

单片机编程需要使用专门的软件工具,这些工具能够帮助程序员编写、调试和烧录程序到单片机中。以下是一些常用的单片机编程软件:

关键字: 单片机 编程 软件工具

Java语言和C语言是两种不同的编程语言,它们在语法、特性和应用领域上有许多差别。下面将详细介绍Java语言和C语言之间的差异以及它们各自的技术特点。

关键字: Java语言 C语言 编程

嵌入式系统是现代生活中无处不在的一部分。它们包括了我们的家电、汽车、智能手机、医疗设备等等。这些系统的工作必须高效、可靠,因为它们往往控制着生活中的关键方面。而C语言作为一种广泛用于嵌入式系统开发的编程语言,其质量和稳定...

关键字: 嵌入式系统 C语言 编程

在嵌入式系统开发领域中,C语言是使用最广泛的编程语言之一。它具有高效、灵活和可移植的特点,成为嵌入式系统设计师的首选语言。本文将介绍C语言编程的基本概念、特点以及在嵌入式系统开发中的应用。

关键字: 嵌入式系统 C语言 编程

在编程和计算中,运算符优先级是解释和计算表达式的一个关键因素。本文旨在阐述运算符优先级的概念、规则及其在表达式中的应用,以帮助读者更好地理解和运用运算符优先级。

关键字: 表达式 运算符 编程

南京2023年9月16日 /美通社/ -- 今日,由中国 "双一流"建设高校南京医科大学、全球基因测序和芯片技术的领导者因美纳与"Nature Research Custom Media&q...

关键字: IO BSP GO OV

2023年中国市场薪资增长率(不包含冻薪)为4.9%,预计2024年薪资增长率(不包含冻薪)为5.0%,在亚太地区处于中位水平。 2023年薪资增长水平最高的行业是高科技行业,为5.6%。生命科学行业2024年...

关键字: BSP CONTENT PS OV

(全球TMT2023年8月28日讯)激光雷达解决方案提供商Innovusion图达通与面向长途干线物流市场的智能驾驶领跑者千挂科技联合宣布,双方正式达成战略合作。未来,Innovusion的图像级超远距激光雷达将融入千...

关键字: 激光雷达 自动驾驶 OV IO
关闭
关闭