《基于单片机的多功能数据采集系统的设计-毕业设计(共35页).doc》由会员分享,可在线阅读,更多相关《基于单片机的多功能数据采集系统的设计-毕业设计(共35页).doc(37页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上1 引言数据采集,是利用一种装置,从系统外部采集数据并输入到系统内部的一个接口。被采集数据是已被转换为电讯号的各种物理量,如温度、水位、风速、压力等。采集一般是采样方式,即隔一定时间(称采样周期)对同一点数据重复采集。采集的数据大多是瞬时值,也可是某段时间内的一个特征值。准确的数据量测是数据采集的基础。数据量测方法有接触式和非接触式,检测元件多种多样。不论哪种方法和元件,均以不影响被测对象状态和测量环境为前提,以保证数据的正确性。在互联网行业快速发展的今天,数据采集已经被广泛应用于互联网及分布式领域,数据采集领域已经发生了重要的变化。国内外各种数据采集器先后问世,将数
2、据采集带入了一个全新的时代。 数据采集系统根据不同的应用需求有不同的定义,这就使得多功能数据采集系统的发展显得尤为重要。多功能数据采集系统的任务就是根据不同的需要对信号进行采集,如实现采集初始时刻的任意性,采集频率的多样性。然后转换成单片机能够识别的数字信号,送入单片机进行相应的计算和处理,得出所需数据,并将其进行显示或加以通信,以便实现对某些量的实时控制和处理。在生产生活的各个方面,数据采集系统几乎无处不在,凡是有自动监控系统的地方都有数据采集系统的出现,随着工业生产生活的需要,对数据采集系统的要求也越来越高,尤其是根据不同的需要实现以不同的方式采集数据。因此,对本课题的研究有及其广阔发展前
3、景和巨大的经济价值。2 多功能数据采集系统总述2.1 系统简介数据采集系统起始于20世纪50年代,由于数据采集系统具有高速性和一定的灵活性,可以满足众多传统方法不能完成的数据采集和通信任务,因而得到初步的认可。由于集成电路制造技术的不断提高,数据采集技术已经在军事、航空电子设备及宇航技术、工业等领域被广泛应用。本系统主要包括数据采集模块、数据存储模块、CPU模块、人机交互模块、通信模块。系统电路原理图见附录A,PCB图见附录B。其中数据采集模块采用8255A芯片扩口接AD1380转换器主要实现对不同形式信号的实时采集;CPU模块负责对采集到的信号进行分析、变换等操作;人机交互模块是实现采集频率
4、控制及显示数据等功能。针对目前数据采集系统在工业控制中的实际使用情况,本系统相比一些其它的数据采集系统,在满足基本要求的同时,成本更低、操作也简单。本系统解决的一个关键问题是,在数据采集的过程中,保证了通过实现从任意时刻开始采集数据和以不同的频率采集数据来满足不同的工作需要。2.2 系统总体框图本设计拟采用单片机作为程序的主控芯片,利用A/D转换技术,实现数据的实时转换,利用键盘控制采样频率的改变,通过外加存储器扩展存储空间,通过显示器显示数据并进行通信。系统总体框图如图所示:通信模块数据采集模块数据存储模块CPU模 块人机交互模块图2.1 系统总体框图3 CPU模块3.1 89C51单片机的
5、基本组成本设计采用89C51作为系统的主控芯片,芯片结构框图如下: 外部时钟源 外部事件计数2x16位定时器/计数器数据存储器256B RAM/SFR RAM/SFRRAM/SFR程序存储器4KB ROM振荡器和时序OSC89C51 CPU64KB总线扩展控制器可编程I/O口可编程全双工串行口 内中断图3.1 89C51单片机结构框图89C51单片机包含:(1)一个8位的80C51微处理器(2)片内256字节数据存储器RAM/SFR,用以存放可以读写的数据,如运算的中间结果,最终结果以及欲显示的数据等(3)片内4KB程序存储器FLASH ROM,用以存放程序、一些原始数据和表格(4)4个8位并
6、行I/O端口P0-P3,每个端口既可用作输入也可用作输出(5)两个16位的定时器/计数器,每个定时器/计数器都可设置成计数方式,用以对外部事件进行计数,也可以设置成定时方式(6)具有5个中断源、两个中断优先级和中断控制系统(7)一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与PC机之间的串行通信(8)片内振荡器和时钟产生电路,但石英晶体和微调电容需要外接,最高允许振荡频率为24MHz(9)89C51单片机与8051相比,具有节电工作方式,即休闲方式及掉电方式13.2 管脚及说明图3.2 89C51单片机引脚图VCC:供电电压。 GND:接地。 P0口:P0口
7、为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲
8、器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电
9、平,P3口将输出电流(ILL)这是由于上拉的缘故。 P3口也可作为AT89C51的一些特殊功能口,如下表所示:表3.1 P3口特殊功能P3.0 RXD(串行输入口)P3.1TXD(串行输出口)P3.2/INT0(外部中断0)P3.3/INT1(外部中断1)P3.4T0(记时器0外部输入)P3.5T1(记时器1外部输入)P3.6/WR(外部数据存储器写选通)P3.7/RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的
10、地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。 /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。 /EA/VP
11、P:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出1,2。 3.3 主要特性.与MCS-51 兼容 .4K字节可编程闪烁存储器,寿命:1000写/擦循环,数据保留时间:10年 .全静态工作:0Hz-24MHz .三级程序存储器锁定 .128*8位内部RAM .32可编程I/O线 .两个16位定时
12、器/计数器 .5个中断源 .可编程串行通道 .低功耗的闲置和掉电模式 .片内振荡器和时钟电路1,3 4 人机交互模块4.1 键盘4.1.1 键盘简介1.键盘输入的特点键盘:一组按键开关的集合。2.按键的确认检测行线电平,便可确认按键按下与否。高电平:断开;低电平:闭合。3.如何消除按键的抖动常用软件来消除按键抖动。基本思想:检测到有键按下,键对应的行线为低,软件延时10ms后,行线如仍为低,则确认该行有键按下。 当键松开时,行线变高,软件延时10ms后,行线仍为高,说明按键已松开。采取以上措施,躲开了两个抖动期的影响。4.1.2 键盘接口的工作原理本设计采用行列式(矩阵式)键盘接口,矩阵式键盘
13、用于按键数目较多的场合,由行线和列线组成,按键位于行、列的交叉点上。如图所示: 图4.1 矩阵式键盘结构按键数目较多的场合,行列式键盘与独立式键盘相比,要节省很多的I/O口线。(1)行列式键盘工作原理如果没有键按下,该行线为高电平,当有键按下时,行线电平有列线的电平来决定。由于行、列线为多键共用,各按键彼此将相互发生影响,必须将行、列线信号配合起来并作适当的处理,才能确定闭合键的位置。(2)按键的识别方法a.扫描法图4-1(b)中3号键被按下为例,来说明此键时如何被识别出来的。识别键盘有无键被按下的方法,分两步进行:第1步:识别键盘有无键按下;第2步:如有键被按下,识别出具体的按键。把所有列线
14、置0,检查各行线电平是否有变化,如有变化,说明有键按下,如无变化,则无键按下。上述方法称为扫描法,即先把某一列置低电平,其余各列为高电平,检查各行线电平的变化,如果某行线电平为低,可确定此行列交叉点处的按键被按下。b.线反转法 只需两步便能获得此按键所在的行列值。第1步:列线输出为全低电平,则行线中电平由高变低的所在行为按键所在行。第2步:行线输出为全低电平,则列线中电平由高变低所在列为按键所在列。结合上述两步,可确定按键所在行和列。(3)键盘的编码根据实际需要灵活编码4,5。4.2 LED数码显示4.2.17段LED数码管简介7段LED数码管,是在一定形状的绝缘材料上,利用单只LED组合排列
15、成“8”字型的数码管,分别引出它们的电极,点亮相应的点划来显示出0-f的数字。LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。下图是共阴和共阳极数码管的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已。将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。以共阴式为例,如把阴极接地,在相应段的阳极接上正电源,该段即会发光。当然,LED的电流通常较小,一般均需在回路中接上限流电阻。假如我们将b和c段接上正电源,其它端接地或悬空,那么b和c段发光,此
16、时,数码管显示将显示数字“1”。而将a、b、d、e和g段都接上正电源,其它引脚悬空,此时数码管将显示“2”。其它字符的显示原理类同6。图4.2 数码管共阴极、共阳极接法两种接法显示译码如下表:表4.1 数码显示译码表显示字符共阴极段码共阳极段码显示字符共阴极段码共阳极段码03FHC0H87FH80H106HF9H96FH90H25BHA4HA77H88H34FHB0Hb7CH83H466H99Hc39HC6H56DH92Hd5EHA1H67DH82HE79H86H707HF8HF71H8EH4.2.2LED显示器工作原理N个LED显示块有N位位选线和8N根段码线。 段码线控制显示的字型,位选线
17、控制该显示位的亮或暗。静态显示和动态显示两种显示方式。1.静态显示方式各位的公共端连接在一起(接地或+5V)。 每位的段码线分别与一个8位的锁存器输出相连。显示字符一确定,相应锁存器的段码输出将维持不变,直到送入另一个段码为止。显示的亮度高。下图: 4位静态LED显示器电路。该电路各位可独立显示。图4.3 4位静态LED显示器电路2.动态显示方式 所有位的段码线相应段并在一起,由一个8位I/O口控制,形成段码线的多路复用,各位的公共端分别由相应的I/O线控制,形成各位的分时选通。下图:4位8段LED动态显示电路。其中段码线占用一个8位I/O口,而位选线占用一个4位I/O口7。图4.4 4位动态
18、LED显示电路本设计中采用动态显示模式。4.3 人机接口模块电路 本设计中由于采用89c51单片机,I/O口不够用,所以扩展了一片8255A,来连接键盘和显示器。编程时,先片选到本片8255A,设置其以方式0工作,A、B输出,C输入,数码显示为共阴极接法,PA口接数码管的段选线,共阴极公共端由PB0、PB1分别控制。键盘的行线接PB口的高四位,列线接PC口低四位,接口电路如下:图4.5 键盘显示器接口电路5 数据采集模块5.1 数据采集主要芯片A/D转换器本系统采用AD1380作为数据采集模块的主要芯片。AD1380是一种完整的低功耗16位逐次逼近型A/D转换器,为美国模拟器件公司(Analo
19、g Devices)产品。该产品采用表面镀铜技32脚双列直插式标准陶瓷封装,将D/A转换电路,参考电压,时钟脉冲,比较器,逐次逼近寄存器及采样/保持放大器集成在一个芯片上,可并行或串行输出,所有数字输入和输出与TTL或5V CMOS兼容,转换时间最大为14uS,非线性误差小于0.003%FSR,电源供给为15V和5V。由于AD1380的数据输出不是三态控制输出,因此在硬件接口设计时必须外界数据缓冲寄存器8,9。一、AD1380的引脚功能和应用特性AD1380的主要特性总结如下:分辨率:16位二进制转换时间:14uS非线性度: 。无误码:AD1380JD为13位(0+70); AD1380KD为
20、14位(0+70)。最大功耗:900mW输出形式:16位负逻辑并行或串行输出(单极性输入时数据输出是互补二进制码,双极性输入时数据输出是互补偏移二进制码)模拟输入电压:-2.5V+2.5V,-5V+5V,-10V+10V,0V+5V,0V+10V工作电源电压:模拟电源电压为 数字电源电压为AD1380的引脚如图所示:图5.1 AD1380引脚图引脚功能如下:1脚:-15V模拟电源供电2脚:+15V模拟电源供电3脚GA:增益调节引脚4脚BIP:双极性调节,与7脚和32脚的不同链接可适应不同的模拟电压输入范围,关系如下表:表5.1 AD1380模拟输入范围引脚编程表输入信号范围输出代码连4脚到连7
21、脚到连输入信号到连32脚到COB532317COB5开断316COB553160V+5VCSBAGND53160V+10VCSBAGND开断3165脚COMP:比较器输入6脚10VSP:10V量程模拟电压控制7脚20VSP:20V量程模拟电压控制8脚AGND:模拟地,整个系统AGND与DGND最后只能有一点相连924脚B16B1:并行16位数字输出,B1为最高位(MSB)25脚SO:串行数据输出,每位保持一个时钟周期26脚CLKO:时钟输出27脚BUSY:转换状态引脚,当START变为低电平,启动A/D转换开始时,BUSY变为高 电平。当转换结束后,BUSY变为低电平,可用于判断转换是否结束,
22、也可用 作中断请求信号。28脚START:转换启动信号引脚,其下降沿复位所有内部逻辑,并将B1置为低电平,其余位置为高电平,BUSY为高电平,启动A/D转换29引脚:+5V逻辑电源引脚30脚DGND:数字地31脚SHI:采样/保持器输入,接模拟电压信号输入32脚SHO:采样/保持器输出10二、AD1380的工作时序:图5.2 AD1380的工作时序三、AD1380的地线布置和去耦AD1380有两个内部互不相连的地线,即模拟地(8脚)和数字地(30脚),这两个地又必须在芯片上就近一点相连,由于电流流过的地线上的回路电阻及干扰的影响,在系统接地点和AD1380芯片地之间可能会有几百毫伏的电压,由于
23、电源电流和逻辑门电流不安同一路径进入回路,因此将使模拟信号的转换处理出现测量误差。为克服这类由于地线及回路引起的测量误差,一个大容量的电容(1uF)并联一个0.1uF的电容是非常有效的。电容并联在逻辑电源和数字地之间及正负模拟电源与模拟地之间,电源端的去耦电容应尽可能靠近芯片布置。由于芯片的金属表面已在内部接地,注意不要在外部再将金属表面接地11。5.2 AD1380与89C51单片机接口电路由于AD1380的转换速度较快,而微处理器的时钟较慢,这时用CPU控制AD1380的A/D转换就有可能丢失数据。另外,要实现CPU对数据采集频率的预置,且AD1380的数据输出没有三态缓冲数据输出,所以在
24、与89C51单片机接口时,较好的方法是将16位的A/D转换结果先缓冲锁存在寄存器里,然后再进行数据读入或其他处理。本设计中AD1380采用查询方式完成A/D转换,缓冲锁存寄存器采用可编程并行接口芯片8255A,利用其方式1即选通I/O方式的锁存功能实现对A/D转换数据输出的单向锁存。本片8255A的片选信号/CS由74LS138的Y2端提供,口地址选择线A0和A1由89C51的P0.0和P0.1提供。A口和B口分别为A/D转换后数据的高8位和低8位数据输入口,PC4控制A口选通输入操作,PC2口控制B口选通输入操作。当PC4或PC2 为低电平时,A口或B口数据线上的数据打入端口锁存器,将数据锁
25、存,直到CPU读取A口或B口数据时,端口锁存器空,才允许将下一个数据通过PC4或PC2的下降沿锁存、读取。接口电路如下:图5.3 AD1380与89C51单片机接口电路6 数据存储模块6.1 EEPROM简介电可擦除可编程序的ROM (Electronic Erasible Programmable ROM),保留信息长达20年,不存在EPROM在日光下信息缓慢丢失的问题。电可擦除可编程序的 ROM 也称为 EEPROM 即 E2PROM 。它的工作原理与 EPROM 类似,当浮动栅上没有电荷时,管子的漏极和源极之间不导电,若设法使浮动栅带上电荷,则管子就导通。 在 E2PROM 中,使浮动栅
26、带上电荷和消去电荷的方法与 EPROM 中是不同的。在 E2PROM 中,漏极上面增加了一个隧道二极管,它在第二栅与漏极之间的电压 VG 的作用下,可以使电荷通过它流向浮动栅(即起编程作用);若 VG 的极性相反也可以使电荷从浮动栅流向漏极(起擦除作用),而编程与擦除所用的电流是极小的,可用极普通的电源就可供给 VG 。E2PROM 的另一个优点是:擦除可以按字节分别进行(不像 EPROM ,擦除时把整个芯片的内容全变成“ 1 ”)。由于字节的编程和擦除都只需要 10ms ,并且不需特殊装置,因此可以进行在线的编程写入。常用的典型芯片有 2816/2817/2864 等。在芯片的引脚设计上,2
27、KB的E2PROM 2816与相同容量的EPROM 2716和静态RAM 6116兼容,8KB的E2PROM 2864A与同容量的EPROM 2764和静态RAM 6264也是兼容的。本设计采用的是2864A12。2864A是电擦除可编程的只读存储器芯片。单一+5V供电,最大工作电流为160mA,维持电流为60mA。读出时间最大为250ns,写入时间约为16ms,由此可见2864A的读写速度是较慢的。由于片内设有编程所需高压脉冲电路,因而无需外加编程电压与写入脉冲即可工作。2864A的容量为8K8位,因此该芯片有8根数据线与13根地址线。2864A的读操作与普通EPROM的读出相同,所不同的是
28、可以在线进行字节的写入。2864A在写一个字节的指令或数据之前,自动将要写入单元进行擦除,因而无需专门的擦除操作。可见使用2864A就如同使用RAM一样方便13。6.2 89C51扩展E2PROM的方法89C51外扩2864A接口电路见下图。先片选中2864A,线选法决定了2864A对应的地址空间, 8K字节的2864A作为数据存储器使用,掉电后数据不丢失。(1)数据线的连接89C51的P0.0P0.7与2864A的IO0IO7直接连接。(2)地址线的连接89C51的P0.0P0.7经过74LS373锁存器与2864A地址线的低8位A0A7连接。89C51的P2.0P2.4与2864A地址线的
29、高5位A8A12直接连接。(3)控制线的连接2864A的片选信号/CE与74LS138的Y0连接,读信号/OE由89C51的/RD连接,写信号/WE由89C51的/WR连接。扩展电路图为:图6.1 2864A与89C51接口电路 7 通信模块7.1 MAX232简介MAX232芯片是MAXIM公司生产的包含两路接收器和驱动器的IC芯片,适用于各种EIA-232C和V.28/V.24的通信接口。其内部有一个电源电压变换器,可以把输入的+5V电源电压变换成RS-232C输出电平所需的10V电压。MAX232芯片引脚结构如图所示:图7.1 MAX232引脚图内部结构基本可分三个部分: 第一部分是电荷
30、泵电路。由1、2、3、4、5、6脚和4只电容构成。功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。 第二部分是数据转换通道。由7、8、9、10、11、12、13、14脚构成两个数据通道。 其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。 8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。 TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后
31、从R1OUT、R2OUT输出。 第三部分是供电。15脚GND、16脚VCC(+5v)14。7.2 通信模块电路本系统采用异步串行通信,约定双方的通信协议如下:波特率:1200b/s;信息格式:8位数据,1位停止位,无奇偶校验位传送方式:PC机采用查询方式接收数据,89C51采用查询方式发送数据校验方式:累加和校验握手信号:软件握手。发送方在发送之前先发一联络信号“?”,收到后“.”应答,然后发字节数,数据,校验和。相同回“0”,不同回“F”1,15。 通信模块电路如下:图7.2 串行通信电路图8 软件设计8.1 流程图开始初始化89C51串口,初始化两片8255A调用键盘扫描子程序有键按下?数
32、字键? 键值#0BH?调用数据采集子程序 键值#0CH?键值#0DH?键值#0EH?调用数据显示子程序调用数据存储子程序调用数据发送子程序结束图8.1 本系统工作流程图8.2 程序主程序:ORG 0000HAJMP MAINORG 0100HMAIN: MOV SP,#60H MOV SCON,#50H ; 串口初始化 MOV TMOD,#20H ; 定时器1工作于模式2 MOV TH1,#0F3H MOV TL1,#0F3H MOV PCON,#00H ; 设置波特率 SETB TR1 CLR P2.7 SETB P2.6 CLR P2.5 MOV DPTR,#5FFFH ; 初始化8255
33、A(U4),以方式1工作,A、B输入,PC4,PC2为控制位 MOV A,#0BFH MOVX DPTR,A CLR P2.7 CLR P2.6 SETB P2.5 MOV DPTR,#3FFFH ; 初始化8255A(U3),以方式0工作,A、B输出,C输入 MOV A,#89H MOVX DPTR,AKKK: LCALL KEY ;调用键盘扫描子程序KEYADR:CJNE A,#0AH,KYARD1 AJMP DATA0KYARD1:JC DATA0AAA: CJNE A,#0BH,BBB JMP KKK ;键值为#0BH,转键盘扫描子程序BBB: CJNE A,#0CH,CCC LCAL
34、L DIS ;键值为#0CH,转数据显示子程序CCC: CJNE A,#0DH,DDD LCALL WR1 ;键值#0DH,转数据存储子程序DDD: CJNE A,#0EH,EEE LCALL SEND ;键值#0EH,转数据发送子程序EEE: END ;键值#0FH,结束键盘扫描子程序:KEY: MOV DPTR,#3FFDH MOV A,#0FH MOVX DPTR,A ;令键盘所有行为低电平 MOV R7,#0FFHKEY1: DJNZ R7,KEY1 ;延时 MOV DPTR,#3FFEH MOV A,DPTR ;读取键盘列值 CPL A ANL A,#0FH ;判别有无键值按下 JZ
35、 KEY1 ;无键按下时退出 LCALL DEL20ms ;延时20ms去抖SKEY: MOV A,#00 ;进行行行扫描 MOV R0,A ;R0作为行计数器 MOV R1,A ;R1作为列计数器 MOV R3,7FHSKEY2: MOV A,R3MOV DPTR,#3FFDHMOVX DPTR,ANOPNOPNOPMOV DPTR,#3FFFHMOVX A,DPTR ;读列值CPL AANL A,#0FHMOV R1,A ;存列值S123: JNZ SKEY3 ;有键按下转SKEY3,无键按下进行下一行扫描INC R0SETB CMOV A,R3 RRC A ;R3带进位右移,形成下一行扫
36、描字MOV R3,AMOV A,R0CJNE A,#04,SKEY1 ;行扫描结束否RETSKEY3: MOV A,R1 JB ACC.0,SKY5 JB ACC.1,SKY6JB ACC.2,SKY7JB ACC.3,SKY8AJMP EKEYSKY5: MOV A,#00H MOV R2,A ;存0列号 AJMP DKEYSKY6: MOV A,#01H MOV R2,A ;存1列号 AJMP DKEYSKY7: MOV A,#02H MOV R2,A ;存2列号 AJMP DKEYSKY8: MOV A,#03 MOV R2,A ;存3列号 AJMP DKEYDKEY: MOV A,R0
37、 ;取行号 ACALL DECODE AJMP EKEYDECODE:MOV A,R0 MOV B,#04H MUL AB ADD A,R2 ;求取键值 RETDEL20ms:MOV R7,#20HTS1: MOV R6,#0FAHTS2: DJNZ R6,TS2 DJNZ R7,TS1 RET数据采集子程序:DATA0: CLR P2.7 SETB P2.6 CLR P2.5MOV R0,A CLR A MOV 40H,A MOV 41H,A ;清零数据存放区CLR P1.3 SETB P1.3 ;启动A/D转换 JB P1.0 CLR P1.1 CLR P1.2;锁存数据使A、B口满 MO
38、V A,R0 JZ DATA1 MOV R0,A ;将读取的键值作为循环次数TS3: MOV R2,#64H ;100ms延时TS4: MOV R1,#0FAHTS5: DJNZ R1,TS5 DJNZ R2,TS4 DJNZ R0,TS3DATA1: SETB P1.1 SETB P1.2 ;保证CPU读数后不再锁存 MOV DPTR,#5FFCH ;读高8位PA口 MOV A,DPTR MOV 40H,A MOV DPTR,#5FFDH ;读低8位PB口 MOVX A,DPTR MOV 41H,A LJMP KKK RET数据显示子程序:DIS: CLR P2.7 CLR P2.6 SET
39、B P2.5MOV R0,40H DIS1: MOV R2,#0FDH MOV A,R2 MOV DPTR,#3FFDH MOVX DPTR,A MOV A,R0 ANL A,#0FH ;先显示低4位 MOV DPTR,#TAB MOVC A,A+DPTR ;取显示数据 MOV DPTR,#3FFCH MOVX DPTR,A LCALL DEL20ms MOV R2,#0FEH MOV A,R2 MOV DPTR,#3FFDH MOVX DPTR,A MOV A,R0 SWAP A ;半字节交换 ANL A,#0FH ;显示高四位 MOV DPTR,#TAB MOVC A,A+DPTR MOV DPTR ,#3FFCH MOVX DPTR,A LCALL DEL20msDIS2; MOV R0,41H LCALL DIS1 LJMP KKK RETTAB: DB 3FH,06H,5BH,4FH,66H,60H DB 7DH,07H,7FH,6FH,77H,7CH DB 39H,5EH,79H,71H数据存储子程序:WR1: CLR P2.7 CLR P2.6 CLR P2.5MOV DPTR,#0000H MOV A,40H MOVX DPTR,A INC D