吉林建筑大学 电气与电子信息工程学院
单片机原理与应用课程设计报告
设计题目: 模拟信号采集器设计 专业班级: 信工121 学生姓名: *** 学 号: ********* 指导教师: 许亮 张玉红 设计时间: 2015.03.09-2015.03.20
教师评语: 成绩 评阅教师 日期 摘 要
本次设计是建立一个多路模拟信号采集系统,能处理模拟信号,同时对信号进行循环采样并通过键盘控制输出。它主要由A/D转换模块、单片机、显示模块、键盘控制器模块组成。其中最主要的部分是单片机和A/D转换器,首先被测模拟信号通过A/D转换器转换成数字信号,然后通过单片机的处理,在显示器上不停的显示所采样的数据,通过键盘给一个控制信号,可以选择的任意一路信号在1602上面输出显示。
本设计将介绍一种以单片机为核心的数据采集系统,它能测量直流电压及光敏阻值,并且测量结果能通过1602显示器显示出来,从而具有一定的智能性。本设计将对硬件电路部分和软件程序部分分别作介绍。在硬件部分,本文就系统的各个组成模块的原理做了详细的介绍。在软件部分,详细阐述了各个模块电路的软件设计方法和设计中的细节。随着计算机技术的飞速发展和普及,数据采集系统在多个领域有着广泛的应用。本次的课程设计研究对以后生活及工业应用将会有主要的意义。 关键词:PCF8591 AT89C51 LCD1602显示屏
目 录
一、设计内容及要求 -------------------------------------------------------------------------------------------------- 1
1.1设计内容 ------------------------------------------------------------------------------------------------------ 1 1.2设计要求 ------------------------------------------------------------------------------------------------------ 1 二、系统总体设计方案 ---------------------------------------------------------------------------------------------- 1
2.1主控芯片设计 ----------------------------------------------------------------------------------------------- 1 2.2显示方案设计 ----------------------------------------------------------------------------------------------- 2 三、系统硬件设计 ----------------------------------------------------------------------------------------------------- 2
3.1单片机控制模块设计 -------------------------------------------------------------------------------------- 3
3.1.1主要性能参数 -------------------------------------------------------------------------------------- 3 3.1.2功能特性 -------------------------------------------------------------------------------------------- 4 3.1.3引脚功能说明 -------------------------------------------------------------------------------------- 4 3.1.4 AT89S51复位模式 -------------------------------------------------------------------------------- 6 3.2电源设计------------------------------------------------------------------------------------------------------ 7 3.3模拟与数字信号采集模块设计 ------------------------------------------------------------------------- 7 3.4键盘输入模块的设计 -------------------------------------------------------------------------------------- 9
3.4.1矩阵键盘工作原理 -------------------------------------------------------------------------------- 9 3.4.2单片机键盘扫描法 -------------------------------------------------------------------------------- 9 3.5 LCD显示模块的设计 ------------------------------------------------------------------------------------- 10 四、系统软件设计 ---------------------------------------------------------------------------------------------------- 11
4.1系统工作流程 ---------------------------------------------------------------------------------------------- 11 4.2编程软件(KEIL) ---------------------------------------------------------------------------------------- 11 4.3 A/D转换程序流程图 ------------------------------------------------------------------------------------- 12 五、焊接与调试 ------------------------------------------------------------------------------------------------------- 13
5.1调试方案----------------------------------------------------------------------------------------------------- 13 5.2调试条件与仪器 ------------------------------------------------------------------------------------------- 13 六、总结 ---------------------------------------------------------------------------------------------------------------- 14 七、参考文献 ---------------------------------------------------------------------------------------------------------- 15 附录1 -------------------------------------------------------------------------------------------------------------------- 16 附录2 -------------------------------------------------------------------------------------------------------------------- 17
模拟信号采集器设计
一、设计内容及要求 1.1设计内容
本课题要求以单片机为控制器,对多通道模拟信号作数据采集并进行8位转换,采集到的数据以中断方式接入内存加以显示,并送到显示模块进行处理。由于信号比较多,单片机不可能把这些信号同时接收,因此需要由多路开关进行通道转换,分时地把信号送到采样/保持器(S/H)、A/D转换器,把模拟量转换成数字量,然后通过显示器显示所选择的通道以及所采集的数据。
1.2设计要求
1)采集至少两路模拟信号,用数码管显示出来。
2)用键盘选择多路模拟信号的任意一路来进行数据的采集、显示与切换。 3)使用PROTUES仿真软件,完成上述题目要求。
二、系统总体设计方案 2.1主控芯片设计
方案一:选用专用电压转换芯片INC7107实现电压的测量和现实。缺点是精度比较低,且内部电压转换和控制部分不可控制,优点是价格低廉。
方案二:选用单片机AT89S52和A/D转换芯片PCF5891实现电压的转换和控制,用四位数码管显示出最后的转换电压结果。缺点是价格稍贵,优点是转换精度高,且转换的过程和控制、显示部分可以控制。
终上所述:方案二所需元件少、成本低且易于实现,可选此方案。系统方案图如下:
1
显示模块 A/D转模拟信号换模块 单片机控制器 图2.1系统方案图
2.2显示方案设计
方案一:选用4个单体的共阴数码管,将a—h全部连接起来,然后接到单片机口的I/O上进行控制。缺点是焊接时比较麻烦,容易出错,优点是价格比较便宜。 方案二:选用一个1602液晶显示器。LCD1602液晶显示容量:16×2个字符,芯片工作电压:4.5—5.5V,工作电流:2.0mA(5.0V),模块最佳工作电压:5.0V,字符尺寸:2.95×4.35(W×H)mm。1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。这个电路几乎没有缺点,优点是便于控制,且价格低廉,焊接简单。
终上所述:由于两个方案都可以实现同样的功能,但方案二设计简单、系统开销小、反应速度较快,因此选择此方案。
三、系统硬件设计
这个设计的核心我们采用的是STC89C52芯片,P0口作为数据总线和地址总线,首先,当模拟信号输入时,P0口作为数据总线对数据进行输入,其后在把数据传给8255时此时P0口作为一个地址总线。P2作为ADC0809的控制端口。P1作为流水灯控制口。如图3.1 所示:
2
图3.1单片机引脚图
3.1单片机控制模块设计
对于整个数据采集系统而言,起到控制和枢纽作用的单片机模块无疑是其中最为重要的部分。AT89S52是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含8k bytes的可反复擦写的只读程序存储器(PEROM)和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度,非易失存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89S52是此系统的最佳选择。单片机控制模块的作用是控制各单元电路的运行并完成数据的换算或处理,主要由单片机、时钟电路、复位电路组成。
3.1.1主要性能参数
·与MCS-51产品指令系统完全兼容 ·4k字节可重擦写Flash闪速存储器 ·1000次擦写周期 ·全静态操作:0Hz-24MHz ·三级机密程序存储器 ·128X8字节内部RAM ·32个可编程I/O口线
3
·2个16位定时/计数器 ·5个中断源
·可编程串行UART通道 ·低功耗空闲和掉电模式
3.1.2功能特性
AT89S52提供一下标准功能:8k字节Flash闪速存储器,256字节内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断机构,一个全双工串行通信口,片内振荡及时钟电路。同时,AT89S52可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,只允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
图3.2单片机最小系统
3.1.3引脚功能说明
(1)VCC:电源电压。
4
(2)GND:地。
(3)P0口:P0口是一组8位漏极开路型双向I/O口,即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口写“1”可使其成为高阻抗输入端。在访问外部数据存储器或程序存储器时,这组口线分别被地址(低8位)和数据总线使用,在访问期间激活内部上拉电阻。在flash编程时,P0口接受指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。 (4)P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,做输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。Flash编程和程序校验期间,P1接受低8位地址。
(5)P2口:P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,做输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器(如执行MOVX@RI指令)时,P2口线上的内容(也即特殊功能寄存器(SFR)区中R2寄存器的内容),在整个访问期间不改变。Flash编程时,P2亦接受高位地址和其他控制信号。
(6)P3口:P3是一个带有内部上拉电阻的8位双向I/O口,P3的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写“1”,它们被内部的上拉电阻拉高,此时可作输入口,做输入口使用时,被外部拉低的P3口将用上拉电阻输出电流。
(7)RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
(8)ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。即使不访问外部存储器,ALE仍以时钟振荡频率
5
的1/6输出拱顶的正脉冲信号,因此它可对外输出时钟或用于定时。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。对flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。禁止后,只有一条MOVX和MOVC指令可激活ALE。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE无效。 (9)EA/VPP: 外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH)。EA端必须保持低电平(接地)。需注意的是:如果加密位IB1被编程,复位时内部会锁存E端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。Flash存储器编程时,该引脚要加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
(10) XTAL1:振荡器反相放大器的及内部时钟发生器的输入端。 (11) XTAL2:振荡器反相放大器的输出端。
3.1.4 AT89S51复位模式
复位电路单片机的RST管脚为主机提供了一个外部复位信号输入口。复位信号是高电平有效,高电平有效的持续时间为2个机器周期以上。单片机的复位方式可由手动复位方式完成。电阻、电容器的参考值1R=10KΩ、1C=10uF、hC=0.01uF复位电路如图所示。
图3.1复位电路
6
3.2电源设计
电源由变压部分、滤波部分、稳压部分组成。为整个系统提供电压,确保电路的正常稳定工作。
采用L7805稳压块,输出为5V。电子组件要正常运作都需要电源电压供电,一般常用的电源电压为+5V或+12V,因为数字IC (Ingegrated Circuit:集成电路)所供给的电压为+5V,而CMOS IC所供给的电压为+12V,7805是一个稳压块。7805稳压管把高电压转换到低电压,7805稳压管具有保护单片机的作用。L7805输出端要并联上一个电解电容,滤除交流电干扰,防止损坏单片机系统。本设计采用只采用了稳压电源。黄色发光二极管表示保温,红色的表示加热状态。
5V或者
12V
图3.2电源电路图
3.3 模拟与数字信号采集模块设计
模拟信号采集主要采用逐次逼近型A/D转换器,它属于直接型A/D转换器,它能把输入的模拟电压直接转换为输出的数字代码,而不需要经过中间变量。主要由比较器、环形分配器、控制门、寄存器与D/A转换器组成。在数字信号方面我们采用的是光电耦合的方式使采集的信号与我们的系统互不影响。 PCF8951模数转换芯片简介:
PCF8591 是一种具有 I2C 总线接口的 8 位 A/D D/A 转换芯片,在与 CPU的信息传输过程中仅靠时钟线 SCL 和数据线 SDA 就可以实现。 I2C 总线是Philips (飞利浦)公司推出的串行总线,它与传统的通信方式相比具有读写方便,结构简单, 可维护性好,易实现系统扩展,易实现模块化标准化设计,可靠性高等优点。PCF8591 为单一电源供电(2.5-6 V)典型值为 5 V,CMOS 工艺 PCF8591 有4 路 8 位 A/D 输入,属逐次比较型,内含采样保持电路; 1 路 8 位 D/A 输出,内含有 DAC的
7
数据寄存器 A/D D/A 的最大转换速率约为 11 kHz,但是转换的基准电源需由外部提供PCF8591 的引脚功能如表3.3:
表3.3 PCF8591 的引脚功能
PCF8591 是单片、单电源低功耗8 位CMOS 数据采集器件,具有4 个模拟输入、一个输出和一个串行I2C 总线接口。3 个地址引脚A0、A1 和A2 用于编程硬件地址,允许将最多8 个器件连接至I2C总线而不需要额外硬件。器件的地址、控制和数据通过两线双向I2C 总线传输。器件功能包括多路复用模拟输入、片上跟踪和保持功能、8 位模数转换和8 位数模拟转换。最大转换速率取决于I2C 总线的最高速率。A/D 转换器采用逐次逼近转换技术。在A/D 转换周期将临时使用片上D/A 转换器和高增益比较器。
一个 A/D 转换周期总是开始于发送一个有效读模式地址给PCF8591 之后。A/D 转换周期在应答时钟脉冲的后沿被触发,并在传输前一次转换结果时执行。一个转换周期被触发,所选通道的输入电压采样将保存到芯片并被转换为8 位二进制码。取自差分输入的采样将被转换为8 位二进制补码。转换结果被保存在ADC 数据寄存器等待传输。如果自动增量标志被置1,将选择下一个通道。在读周期传输的第一个字节包含前一次读周期的转换结果代码。以上电复位之后读取的第一个字节是0x80。I2C 总线协议的读周期。最高 A/D 转换速率取决于实际的I2C 总线速度。
8
3.4键盘输入模块的设计 3.4.1矩阵键盘工作原理
矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线,组成键盘的。在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是4×4个。这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。行列式键盘的工作方式是先利用列线发送扫描字,然后读取行线的状态,查看是否有按键按下。键盘部分提供一种扫描的工作方式能对键盘不断扫描、自动消抖、自动识别按下的键,并给出编码。在显示部分,它可以为发光二极管、荧光管及其他显示器提供按扫描方式工作的显示接口,而且为显示器提供多路复用信号,可以显示多达16位的字符或数字。
键盘中有无按键按下是由列线送入全扫描字、行线读入行线状态来判断的,其方法是由列线逐列置低电平后,检查行输入状态来判断,其方法是依次给列线送低电平,然后检查所有行线状态,如果全为1,则所按下的键不在此列,如果不全为1,则所按下的键必在此列,而且是在与0电平线相交的交点上的那个键。
3.4.2单片机键盘扫描法
扫描法是在判定有键按下后逐列果行(或列)的状态出现非全1状态,如果(或列)的状态出现非全1状态,这时0状态的行、列交点的键就是所按下的键。扫描法的特点是逐行(或逐列)扫描查询,这时相应行(或列)应有上拉电阻接高电平。行列式键盘扫描程序就是采用扫描法来确定哪个键按下的。
确定矩阵式键盘上哪个键被按下时运用扫描法,又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法。其连接图如下如下:
图3.4 矩阵键盘电路与单片机连接图
9
3.5 LCD显示模块的设计
单片机通过A/D转换芯片采集到的俩路数据,经过按键的选择,在LCD1602上显示不同的通道。
1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
图4.5LCD显示模块连接图
10
四、系统软件设计 4.1 系统工作流程
程序开始运行时,我们先将它进行初始化,当数据输入后对4个通道的模拟量进行巡回采样,再将采集的数据进行工程量转换,在数码管管上显示出来,通过外部的中断实现信号的切换。
开始 系统初始化 N循环采样 Y LCD显示器输出 AD采样指定输出
图4.1 系统流程图
4.2编程软件(KEIL)
KEIL C介绍:Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用,单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU可以执行的机器码有两方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从
11
近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP等操作系统。Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。根据需要,可将系统软件按照功能划分为5个模块,分别是主程序模块、A/D转换模块、数码管显示模块、中断服务程序模块、按键输入模块,各模块的功能关系如图3.1所示。编写系统软件时,可首先编写各模块的底层驱动程序,而后是系统联机调试,编写上层主程序。 4.3 A/D转换程序流程图
A/D转换程序的功能是采集数据,在整个系统设计中占有很高的地位。本设计中采用中断的方式来读取转换完成的数据,这样能节省CPU的资源,当系统设置好后,一旦数据转换完成,当便会进入外部中断0,然后在中断中读取转换的数值,处理数据并送数码管显示输出程序流程图如图4.2所示。
图4.2 A/D转换程序流程图
12
五、焊接与调试
5.1调试方案: (1)硬件调试
仔细检查所接电路,按照硬件原理图接线,理论上是能实现的,如果液晶不显示,则应该检查线路是否正确,或是因为单片机没有工作,还有集电极和发射极是否接对。如果只显示八,则可能是采集芯片没有接正确,检查上拉电路是否接好。另外要注意的是,由单片机输出的控制信号比较小,需要进行放大才能驱动继电器工作,蜂鸣器是低电平有效。如果能注意这些问题,电路基本不会出错。 (2)软件仿真调试
如果硬件电路检查后,没有问题却实现不了设计要求,则可能是软件编程的问题,首先应检查初始化程序,然后是读采集的数据值,显示程序,对这些分段程序,要注意逻辑顺序,调用关系,以及涉及到了标号,有时会因为一个标号而影响程序的执行,除此之外,还要熟悉各指令的用法,以免出错。还有一个容易忽略的问题就是,源程序生成的代码是否烧入到单片机中,如果这一过程出错,那不能实现设计要求也是情理之中的事。本人在设计的时候在protues仿真软中进行调试,通过此软件进行调试可以很方便的观察单片机的工作及输出情况。 (3)硬件软件联调
硬件与软件调试相结合,仔细检查各个模块的设计,旧能顺利完成任务,实现设计要求,在调试过程中必须认真耐心,不能有一点马虎,否则遗漏一个小的问题就会导致整个设计的失败。
5.2调试条件与仪器
测试条件:检查多次,硬件电路必须与系统原理图完全相同,并且检查无误,硬件电路保证无虚焊。
测试仪器:protues仿真软件,单片机最小系统实验板,1602液晶显示器。
13
六、总结
在此次的模拟信号采集器设计设计过程中,我更进一步地熟悉了AT89C51单片机、PCF8591模数转换等芯片的结构及掌握了各芯片的工作原理和其具体的使用方法。虽然跟实验室用得芯片不一样,但原理一样,我也得出了正确的结论,不同的电路可以实现同样的功能,我们应该设计最简单,最经济,最实用的电路。当然这个不一定所有条件都符合,找到一个最大限度满足各种条件的方案是我们设计的目标。
在这次课程设计,我还更加深了理论知识的学习。这次的设计电路我用到了很多电子工具及仿真软件等,通过自己分析和设计更好地运用了它们,而且还学会了它们更多的功能,发现它们的功能远比书上说的多很多,只有通过亲自动过手做,才能深刻地了解芯片的工作原理,可以利用不同的接法设计出各种各样不同的电路出来。当然,在设计与仿真中会遇到很多问题,碰到的问题越让人绝望,解决问题之后的喜悦程度就越高。作为工科类的学生,动手能力很重要,以后工作了难免要碰到许许多多的问题,遇到问题不能逃避,要冷静对待,找到问题的关键点,针对性的取解决,然后再总结经验才能在工作中游刃有余。
通过本次课程设计,我还深刻的体会到,理论很重要,但是实践更重要,只有理论只会一叶障目,实践才能真正考验你的能力,所以以后我会多多动手,锻炼自己的动手能力,将理论与实践相结合,做一个更加优秀的大学生。同时非常感谢老师给我们这次学习的机会,使我们小组每个人都在本次设计中都有了极大的提高,希望以后能有更多这样的机会。
14
七、参考文献
【1】 《51单片机C语言教程》郭天祥 编著 电子工业出版社,2008.11.2
【2】 《全国大学生电子设计竞赛——系统设计》黄智伟编著,北京:北京航
空航天大学出版社,2006.12 【3】 《模拟电子技术基础》童诗白,华成英著,北京:高等教育出版社,2000.
【4】 《新型AT89S52系列单片机及其应用》孙育才,北京:清华大学出版社, 2005
【5】 《全国大学生电子设计竞赛——单片机应用技能精解》蓝和慧等著,北京:电子工业出版社,2009.4
15
附录1:
系统原理图:
16
附录2:
部分源程序:
#include //--定义使用的IO口--// #define GPIO_KEY P1 //--定义全局变量--// uchar code dis1[] = {\" PCF-8591 key is:\ unsigned char KeyValue; //用来存放读取到的键值 //--声明全局函数--// void KeyScan(void); void Delay10ms(unsigned int c); //误差 0us uchar m; uchar i; //--定义PCF8591的读写地址--// #define WRITEADDR 0x90 //写地址 #define READADDR 0x91 //读地址 //--声明全局函数--// void Pcf8591SendByte(unsigned char channel); unsigned char Pcf8591ReadByte(); void Pcf8591DaConversion(unsigned char value); /******************************************************************************* * 函 数 名 : main *******************************************************************************/ void main() { unsigned int adNum[5]; float value0; LcdInit(); for(i=0; i<16; i++) { if(i == 13) {LcdWriteCom(0x80 + 0x40); } LcdWriteData(dis1[i]); } while(1) {KeyScan(); LcdWriteCom(0x80 + 0x44); if(KeyValue < 10) 17 { } { LcdWriteData('A'); LcdWriteData(':'); LcdWriteCom(0x80 + 0x48); LcdWriteCom(0x80+0x48); LcdWriteData('0'+adNum[0]%1000/100); LcdWriteData('.'); LcdWriteData('0'+adNum[0]%100/10); LcdWriteData('0'+adNum[0]%10); LcdWriteData('V'); //发送光敏转换命令 adNum[1]=Pcf8591ReadByte()*2; //ADC1读取热敏 } else { LcdWriteData('B' ); LcdWriteCom(0x80+0x48); LcdWriteData('0'+adNum[1]/1000); LcdWriteData('0'+adNum[1]%1000/100); LcdWriteData('0'+adNum[1]%100/10); LcdWriteData('0'+adNum[1]%10); LcdWriteData('0'); adNum[2]=Pcf8591ReadByte()*2; //ADC2读取光敏 adNum[4]=adNum[0]; Pcf8591DaConversion(adNum[4]/2); //DAC } } } 数模转换 */ Pcf8591SendByte(2); adNum[2]=Pcf8591ReadByte()*2; void Pcf8591SendByte(unsigned char channel) I2C_Start(); I2C_SendByte(WRITEADDR, 1); //发送写器件地址 I2C_SendByte(0x40|channel, 0); //发送控制寄存器 I2C_Stop(); /******************************************************************************* * 函 数 名 : Pcf8591ReadByte * 函数功能 : 读取一个转换值 *******************************************************************************/ unsigned char Pcf8591ReadByte() { unsigned char dat; I2C_Start(); I2C_SendByte(READADDR, 1);//发送读器件地址 dat=I2C_ReadByte(); //读取数据 I2C_Stop(); //结束总线 18 return dat; }void Pcf8591DaConversion(unsigned char value) { I2C_Start(); I2C_SendByte(WRITEADDR, 1);//发送写器件地址 I2C_SendByte(0x40, 1); //开启DA写到控制寄存器 I2C_SendByte(value, 0); //发送转换数值 I2C_Stop(); } void KeyScan(void) { char a = 0; } GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f)//读取按键是否按下 {Delay10ms(1);//延时10ms进行消抖 if(GPIO_KEY!=0x0f)//再次检测键盘是否按下 {GPIO_KEY=0X0F; switch(GPIO_KEY) { case(0X07): } GPIO_KEY=0XF0; switch(GPIO_KEY) {case(0X70): KeyValue=KeyValue+3;break; } while((a<50) && (GPIO_KEY!=0xf0)) { } Delay10ms(1); a++; //检测按键松手检测 case(0Xb0): KeyValue=KeyValue+2;break; case(0Xd0): KeyValue=KeyValue+1;break; case(0Xe0): KeyValue=KeyValue;break; KeyValue=0;break; case(0X0b): KeyValue=4;break; case(0X0d): KeyValue=8;break; case(0X0e): KeyValue=12;break; } 19 因篇幅问题不能全部显示,请点此查看更多更全内容