项目10数字温度采集系统的设计.ppt

上传人:本田雅阁 文档编号:3004578 上传时间:2019-06-23 格式:PPT 页数:76 大小:6.59MB
返回 下载 相关 举报
项目10数字温度采集系统的设计.ppt_第1页
第1页 / 共76页
项目10数字温度采集系统的设计.ppt_第2页
第2页 / 共76页
项目10数字温度采集系统的设计.ppt_第3页
第3页 / 共76页
项目10数字温度采集系统的设计.ppt_第4页
第4页 / 共76页
项目10数字温度采集系统的设计.ppt_第5页
第5页 / 共76页
点击查看更多>>
资源描述

《项目10数字温度采集系统的设计.ppt》由会员分享,可在线阅读,更多相关《项目10数字温度采集系统的设计.ppt(76页珍藏版)》请在三一文库上搜索。

1、电子工业出版社,单片机控制技术 项目式教程 (C语言版),电子工业出版社,项目10 数字温度 采集系统的设计,能了解A/D转换器的相关技术指标; 能理解ADC0809的工作原理与应用方法; 能掌握ADC0809与51单片机的接口方法; 能掌握DS18B20的工作原理和应用方法; 能掌握数字温度采集系统的硬件电路的分析与设计方法; 能熟练编写数字温度采集系统的单片机控制程序。,学习目标,叙述A/D转换器的技术指标要求; 叙述ADC0809的工作原理; 叙述DS18B20的工作原理; 设计单片机控制的数字温度采集系统的工作电路; 编写数字温度采集系统的单片机控制程序。,工作任务,任务10.1 数字

2、电压表的设计 任务10.2 数字温度采集系统的设计 项目拓展 串行A/D转换芯片PCF8591 在实验板上的应用 项目小结 思考与训练,项目10 数字温度采集系统的设计,任务10.1 数字电压表的设计,能够将模拟量转换成数字量的器件称为模数(A/D)转换器。,10.1.1 A/D转换器的基本原理,1A/D转换器的主要指标 (1)分辨率:A/D转换器能分辨的最小模拟输入量。也就是指使输出数字量变化一个相邻数码所需输入模拟电压的变化量。通常用能转换成的数字量的位数来表示,如8位、10位、12位、16位等。位数越高,分辨率越高。 (2)转换时间:A/D转换器完成一次转换所需的时间。转换时间是编程时必

3、须考虑的参数。 (3)量程:A/D转换器所能转换的输入电压范围,如5V、10V等。 (4)精度:与数字输出量所对应的模拟输入量的实际值与理论值之间的差值。有绝对精度和相对精度两种表示方法。常用数字量的位数作为度量绝对精度的单位,如精度为1/2LSB,而用百分比来表示满量程时的相对误差,如0.05%。,2A/D转换器的分类 按转换原理可分为逐次逼近(比较)式、双积分式、计数式和并行式A/D转换器;按其分辨率可分为816位的A/D转换器芯片。目前最常用的是逐次逼近式和双积分式。 逐次逼近式A/D转换器是一种速度较快、精度较高的转换器,其转换时间在几微秒到几百微秒之间。常用产品有ADC0801ADC

4、0805型8位MOS型A/D转换器、ADC08080809型8位MOS型A/D转换器、ADC08160817型8位MOS型A/D转换器、AD574型快速12位A/D转换器。 双积分式A/D转换器的优点是转换精度高,抗干扰性能好,价格便宜,但转换速度较慢。因此这种转换器主要用于速度要求不高的场合。常用产品有ICL7106ICL7107ICL7126、MC144335G14433、ICL7135等。,3A/D转换器与单片机的接口方法 A/D转换器与单片机的接口主要考虑的是数字量输出线的连接、ADC启动方式、转换结束信号处理方法以及时钟的连接等。 A/D转换器数字量输出线与单片机的连接方法与其内部结

5、构有关。对于内部带有三态锁存数据输出缓冲器的ADC(如ADC0809、AD574等),可直接与单片机相连。对于内部不带锁存器ADC,一般通过锁存器或并行I/O接口与单片机相连。在某些情况下,为了增强控制功能,那些带有三态锁存数据输出缓冲器的ADC也常采用I/O接口连接。随着位数的不同,ADC与单片机的连接方法也不同。对于8位ADC,其数字输出线可与8位单片机数据线对应相接。对于8位以上的ADC,必须增加读取控制逻辑,把8位以上的数据分两次或多次读取。,ADC开始转换时,必须加一个启动转换信号,这一启动信号要由单片机提供。不同型号的ADC,对于启动转换信号的要求也不同,一般分为脉冲启动和电平启动

6、两种。对于脉冲启动型ADC,只要给其启动控制端上加一个符合要求的脉冲信号即可,如ADC0809、AD574等。通常用WR和地址译码器的输出经一定的逻辑电路进行控制。对于电平启动型ADC,当把符合要求的电平加到启动控制端上时,立即开始转换,在转换过程中,必须保持这一电平,否则会终止转换的进行。因此,在这种启动方式下,单片机的控制信号必须经过锁存器保持一段时间,一般采用触发器、锁存器或并行I/O接口等来实现。AD570、AD571等都属于电平启动型ADC。,当ADC转换结束时,ADC输出一个转换结束标志信号,通知单片机读取转换结果。单片机检查判断A/D转换结束的方法一般有中断和查询两种。对于中断方

7、式,可将转换结束标志信号接到单片机的中断请求输入线上或允许中断的I/O接口的相应引脚,作为中断请求信号;对于查询方式,可把转换结束标志信号经三态门送到单片机的某一位I/O口线上,作为查询状态信号。 A/D转换器的另一个重要连接信号是时钟,其频率是决定芯片转换速度的基准。整个A/D转换过程都是在时钟的作用下完成的。A/D转换时钟的提供方法有两种:一种是由芯片内部提供(如AD574),一般不需外加电路;另一种是由外部提供,有的用单独的振荡电路产生,更多的则是把单片机输出时钟经分频后,送到A/D转换器的相应时钟端。,1ADC0809的性能 ADC0809采用5V电源供电。 转换时间:取决于芯片的工作

8、时钟。ADC0809为外接时钟,转换一次的时间为64个时钟周期,当工作时钟为500KHz时,转换时间为128s,最大允许值为800KHz。 8位CMOS逐次逼近型的A/D转换器。 三态锁定输出。 分辨率:8位。 总误差:1LSB。 模拟输入电压范围:单极性05V。,10.1.2 ADC0809芯片的介绍,2ADC0809的内部结构,逐次逼近式A/D转换器,由控制与时序电路、逐次逼近寄存器、树状开关以及256R电阻阶梯网络等组成。,用于存放和输出转换得到的数字量。,可实现8路模拟信号的分时采集,转换后的数字量的输出是三态的(总线型输出),可直接与单片机数据总线相连接。,ADC0809有8个模拟量

9、输入通道IN0IN7,在某一时刻,模拟开关只能与一路模拟量通道接通,对该通道进行A/D转换。 8路模拟开关与输入通道的关系如表所示。,ADDC、ADDB、ADDA是三条通道的地址线。 当地址锁存信号ALE为高电平时,ADDC、ADDB、ADDA三条线上的数据送入ADC0809内部的地址锁存器中,经过译码器译码后选中某一通道。 当ALE0时,地址锁存器处于锁存状态,模拟开关始终与刚才选中的输入通道接通。 ADC0809是分时处理8路模拟量输入信号的。,注意:ADC0809通道的选择比较灵活,根据应用的需要,可以固定选择,也可以用CPU的端口动态选择,这样适合多路转换时应用。,IN7IN0:模拟量

10、输入通道。 ADDA、ADDB、ADDC:地址线。 ALE:地址锁存允许信号。 START:转换启动信号。 D7D0:数据输出线。 OE:输出允许信号。 CLK:时钟信号。 EOC:转换结束状态信号。 Vcc:5V电源。 GND:为地。 Vref、Vref:参考电压。,3ADC0809的引脚,ADC0809的转换时钟CLK由单片机的ALE提供。,4ADC0809与51单片机的接口,51单片机通过地址线P2.0和读、写控制线RD、WR来控制转换器的模拟输入通道地址锁存ALE、启动START和输出允许OE。,模拟输入通道地址的译码输入ADDAADDC由P0.0P0.2提供。,根据P2.0和P0.0

11、P0.2的连接方法,8模拟输入通道的地址依IN0IN7顺序为0xFEF80xFEFF。,ADC0809工作时的时序关系如图所示。,在进行A/D转换时,通道地址应先送到ADDAADDC输入端。然后在ALE输入端加一个正跳变脉冲,将通道地址锁存到ADC0809内部的地址锁存器中,这样对应的模拟电压输入就和内部变换电路接通。为了启动,必须在START端加一个负跳变信号。此后,变换工作就开始进行,标志ADC0809正在工作的状态信号EOC由高电平(空闲状态)变为低电平(工作状态)。一旦变换结束,EOC信号就又由低电平变成高电平,此时只要在OE端加一个高电平,即可打开数据线的三态缓冲器从D0D7数据线读

12、得一次变换后的数据。,注意:ADC0809的几根控制脚和其工作时序在应用时非常重要,一定要掌握,否则不能正确应用ADC0809来实现A/D转换。,1任务要求 用AT89C51和ADC0809设计一只简单的数字电压表,可以测量0+5V的电压,并将测得的电压数值显示在4位共阴极的数码管上,要求测量精度为0.01V,即保留两位小数。,10.1.3 数字电压表的设计,2任务分析 要实现本任务的要求,ADC0809是作为读取模拟电压值的A/D转换芯片,在其输入通道IN3上接入被测电压就可以了。由于ADC0809的供电电压是+5V,所以其输入通道只能输入0+5V的电压,正好与任务要求符合,我们可以用一只简

13、单的可调电阻,其一端接+5V,一端接地,中间的可调脚接入ADC0809的IN3,只要滑动电阻的可调脚,IN3上就能输出不同的电压值,通过ADC0809A/D转换成数字量后送入AT89C51的P3口,AT89C51再将接收到的电压值的数字量还原为模拟量显示在数码管上。 由于0+5V的模拟电压值转换为8位数字量0000000011111111(0255),一个数字量单位的电压值是5V/255,将数字量还原为模拟量时只要将P3口读取的数值乘以5V/255就可以了。我们可以用T0的定时中断为ADC0809提供CLK信号。,3任务设计 (1)器件的选择 根据任务的要求和分析,采用AT89C51作为CPU

14、,ADC0809作为A/D转换芯片,一只可调电阻用来获取不同的电压,一只4位的共阴极数码管显示电压,包括AT89C51工作的外围电路,设计所用器件清单如表所列。,(2)硬件原理图设计,(3)软件程序设计 源程序如下: /* /宏定义 #include #define uchar unsigned char #define uint unsigned int /* /数码管码表 uchar code LEDData = 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F; /ADC0809控制脚定义 sbit OE=P10; sb

15、it EOC=P11; sbit ST=P12; sbit CLK=P13; /* /延时1ms子程序 void DelayMS(uint x) uchar i; while(x-) for(i=0; i120; i+); /*,/显示转换结果子程序 void Display(uchar d) float a; uint b; a = d*5/255; /计算出电压模拟量值 b = a*100+0.5 ; /保留两位小数,四舍五入 P2=0xF7; /数码管第4位显示个位数 P0= LEDData b%10; DelayMS(5); P0=0x00; P2=0xFB; /数码管第3位显示十位数

16、 P0= LEDData b%100/10; DelayMS(5); P0=0x00; P2=0xFD; /数码管第2位显示百位数和小数点 P0= LEDData b/100|0x80; /把小数点加入段码 DelayMS(5); P0=0x00; ,/主程序 void main( ) TMOD=0x02; /定时器0工作在方式2 TH0=0x14; TL0=0x14; IE=0x82; /开T0中断 TR0=1; P1=0x3F; /选择ADC0809的通道3(011) /高4位设通道地址为011(3),低4位为ST,EOC,OE等 while(1) ST=0; ST=1; ST=0; /启

17、动转换 while(EOC=0); /等待转换结束 OE=1; /允许输出 Display(P3); /显示A/D转换结果 OE=0; /关闭输出 /T0中断子程序 void Timer0_INT( ) interrupt 1 CLK=!CLK; /ADC0809时钟信号 ,(4)软硬件联合调试 将编写的程序在Keil C51中编译成*.hex后调入Proteus硬件电路图的AT89C51中运行,就能实现简单的数字电压表功能。运行后,滑动RV1的可调脚,数码管会显示不同的电压值,测量范围为0+5V,精确度为0.01V。,注意:在运用ADC0809与51单片机配合完成A/D转换时要注意单片机对A

18、DC0809的控制信号的控制过程。,任务10.2 数字温度采集系统的设计,DS18B20是美国DALLAS(达拉斯)公司生产的一款单总线(1Wire)数字温度计,具有硬件线路简单、体积超小、功耗低、抗干扰能力强、精度高、附加功能强、易配微处理器等特点,可直接将温度转化成串行数字信号供处理器处理。 DS18B20将温度传感器、A/D转换器等集于一身,从环境中采集了模拟的温度,输出数字温度信号。 DS18B20具有唯一的序列号,在一根通信线上,可以挂很多这样的数字温度计,十分方便。,10.2.1 DS18B20的工作原理,DS18B20的主要特性,全数字温度转换及输出 先进的单总线数据通信 可编程

19、分辨率912可选,精度可达土0.5C 12位分辨率时的最大工作周期为750ms 电压适应范围宽,+3.3V+5.5V,可选择数据线寄生电源工作方式 检测温度范围为55C +125C 内置EEPROM,限温报警功能 64位光刻ROM,内置产品序列号,方便多机挂接 多样封装形式,适应不同硬件系统,DS18B20 引脚介绍 两种封装形式:,DS18B20的引脚定义:,TO-92直插式,八脚SO或SOP贴片式,2. DS18B20 内部结构,DS18B20主要由64位光刻ROM、高速缓存RAM(Scratchpad)、温度传感器、非易失性温度报警触发器TH和TL及配置寄存器 (EEPROM)等组成 。

20、,(1)64位光刻ROM,出厂前被光刻好。 低8位为产品类型号:单线系列编码(DS18B20为19H) 中间48位为产品唯一的序列号 高8位是前面56位的CRC循环冗余校验码,光刻ROM的作用:使每一个DS18B20各不相同,这样可以实现一个总线上挂接多个DS18B20。,MSB LSB,(2)DS10B20内部存储器 包含一个9字节高速缓存RAM和一个3字节非易失性的电可擦除EEPROM。,DS18B20有9个字节的RAM,每个字节是8位。 第2、3、4字节的上电状态依赖于EEPROM的值,测得的温度值,存储温度报警值,设置温度分辨率,镜像,DS18B20的配置寄存器(byte 4),通过设

21、置配置寄存器的R0、R1来确定精度。 注:精度和转换时间有直接关系。,(3)DS18B20温度数据值格式,DS18B20接收到温度转换命令后,启动温度转换,并将转换后的温度值以16位带符号二进制补码形式存储在高速缓存存储器的每1、2字节,单片机可通过单线接口读到该数据,读取时低位在前,高位在后。,出厂默认配置为12位,高5位为符号位,单片机读取数据时,一次会读取2字节,读完后将低11位的二进制数转化为十进制数后再乘以0.0625才得到实际温度值。 当前5位为1时,读取的温度为负值,测得数据值需取反加1再乘以0.0625才得到实际温度值。,注: (1)温度以补码形式存放; (2)9位分辨率时,得

22、到的十进制数乘以0.5;10位分辨率乘0.25;11位分辨率乘0.125,DS18B20温度值格式,温度/数据关系表,注意:从DS18B20读取的数字信号转换成温度值是我们应用DS18B20的关键。,DS18B20完成温度转换后,就把测得的温度值与TH、TL做比较,若TTH或TTL,则将该器件内的告警标志置位,并对主机发出的告警搜索命令做出响应。,3.DS18B20的指令,1)控制DS18B20的指令(对ROM操作) 33H读ROM 读DS18B20温度传感器ROM中的编码 55H匹配ROM 发出此命令后,接着发出64位ROM编码,访问单总线上与该编码相对应DS18B20并使之做出响应,为下一

23、步对该DS18B20的读/写做准备。 CCH跳过ROM。 忽略64位ROM地址,直接向18B20发送温度变换命令。适用于一个DS18B20的情况。,DS18B20工作时,控制其工作的CPU(单片机)可以使用各种命令对DS18B20进行操作,操作过程为:初始化、发功能命令、发存储器操作命令。,F0H搜索ROM 用于确定挂接在同一总线上DS18B20的个数,识别64位ROM地址,为操作各器件做好准备。 ECH告警搜索命令 执行此命令后,只有温度超过设定值上限或下限的芯片才做出响应。,注:只有一个DS18B20时,不需读取ROM编码和匹配ROM编码,只要用跳过ROM(CCH)的指令就行了。,2)温度

24、转换和读取指令(对RAM操作),4. DS18B20的工作时序 作为单总线器件,DS18B20与单片机间采用串行数据传输方式,要求严格按照时隙进行操作。主机使用时间隙来读写DS18B20的数据位和写命令字的位。,(1)初始化DS18B20,单片机发出复位脉冲,DS18B20以存在脉冲响应。当DS18B20发出存在脉冲对复位脉冲响应时,表明该器件已在总线上并作好操作准备。,初始化时序图,主机总线发送一复位脉冲(最短为480s的低电平信号),接着释放总线并进入接收状态。DS18B20在检测到总线的上升沿之后等待1560s,接着DS18B20发出存在脉冲(低电平持续60240s),主机接收到高电平后

25、初始化成功。,(2)写DS18B20,当主机总线从高拉至低电平时就产生写时间隙。从开始15s之内应将所需写的位送到总线上,DS18B20在1560s间对总线采样,若为低电平,则写入的位是0;若为高电平,则写入的位是1。连续写2位间的间隙应大于1s。每一位的发送都应该有一个至少15s的低电平起始位,随后的数据“0”或“1”应该在45s内完成。整个位的发送时间应该保持在60120s,否则不能保证通信的正常。,DS18B20有两种类型的写时序:写0时序和写1时序,如图。,(3)读DS18B20,当单片机发出读时序时,DS18B20可发送数据到单片机。读时间隙时控制的采样时间应该更加的精确才行,所有读

26、时序必须持续60s以上,每个时序之间必须有至少1s的恢复时间。,注:必须在读间隙开始的15s内读取数据位才可以保证通信的正确。,主机在将总线从高电平拉至低电平时,至少在1s后将总线拉高,表示读时间隙的起始,随后在总线被释放后的15s中DS18B20会发送内部数据位,这时控制如果发现总线为高电平表示读出“1”,如果总线为低电平则表示读出数据“0”,主机必须在45s内完成读位,并在60120s内释放总线。,注意:主机(单片机)对于DS18B20的操作都必须严格按照其初始化、读时间隙和写时间隙来完成,否则不能正常通信。在通信时是以8位“0”或“1”为一个字节,字节的读或写是从低位开始的,即D0到D7

27、。,5. DS18B20与单片机的连接,通常用单片机来控制DS18B20,它们的连接非常简单,如图,只要用单片机的1根I/O口线连接到DS18B20的DQ脚上就可以了,但是需要1只电阻上拉。,图中的DS18B20采用的是外部供电,将VDD脚接外部电源(+5V)。单总线上可以同时挂接其它的单总线器件。,10.2.2 数字温度采集系统的设计,1任务要求 设计一个数字温度采集系统,用AT89C51来控制DS18B20采集环境温度,用一只共阴极的4位数码管显示采集的温度,要求显示的温度精确到0.1,也就是保留一位小数位。,2任务分析 根据任务要求,采用AT89C51单片机来控制DS18B20,任意用一

28、个端口线与DS18B20的DQ连接,这里我们用P3.0口,对DS18B20写数据和读数据都从P3.0口串行读写。单片机的外接晶体采用实际中常用的22.1184MHz,这样1个机器周期是0.54s左右,在控制DS18B20的初始化、读数据和写数据时注意时间隙的长短。 按照前面介绍的DS18B20的操作命令,AT89C51从P2.7口将相应的命令字写给DS18B20,在按照初始化的过程对DS18B20进行初始化之后,AT89C51将温度数据从P3.0口读入,每次顺序将8位组合成1字节,温度数据的高8位和低8位都读出后组合成16位的温度数据,按照12位分辨率,将数据乘以0.0625,就得到实际的温度

29、值。将温度值四舍五入保留一位小数后,按位送到数码管显示。,3任务设计,(1)器件的选择 根据任务的要求和分析,采用AT89C51作为CPU,DS18B20作为温度采集芯片,一只4位的共阴极数码管显示温度,包括AT89C51工作的外围电路,设计所用器件清单如表所列 。,(2)硬件原理图设计,(2)软件程序设计,温度采集系统软件流程图,软件源程序如下: /* /宏定义 #include #define uchar unsigned char #define uint unsigned int /* /测温口定义 sbit temp_ds=P30; /定义全局变量 uint temp; /存储整型温

30、度值 float f_temp; /存储浮点型温度值 /定义共阴极段码表 unsigned char code table=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F;,/ms延时子程序 void delay(uint x) uint y; while(x-) for(y=160;y0;y-); /DS18B20初始化子程序,成功返回1,否则返回0 int DS18B20_init(void) uint i; temp_ds=0; /发复位脉冲 i=160; while(i0) i-; temp_ds=1; i=8; while(i0)i

31、-; ,/从DS18B20读1位数据 bit tempreadbit(void) uint i; bit dat; temp_ds=0; /拉低控制线 i+; temp_ds=1; /拉高控制线 i+; i+; dat=temp_ds; /读1为数据 i=10; while(i0) i-; temp_ds=1; /拉高控制线 return (dat); ,/从DS18B20读一个字节 uchar tempreadbyte(void) uchar i,j,dat; dat=0; for(i=1;i1); return(dat); ,/向DS18B20写一位数据 void tempwritebit

32、(bit instruc_data) int time; if(instruc_data) temp_ds=0; /拉低控制线 time=3; while(time0) time-; temp_ds=1; /拉高控制线 time=8; while(time0) time-; else temp_ds=0; /拉低控制线 time=14; while(time0) time-; time-; temp_ds=1; /拉高控制线 time+ ; time+; ,/向DS18B20写一个字节数据 void tempwritebyte(uchar instru) int i; for(i=1;i1;

33、,/读取寄存器中存储的温度数据 uint get_temp() uchar temp_L,temp_H; DS18B20_init(); delay(1); tempwritebyte(0xcc); / 写跳过ROM指令 tempwritebyte(0xbe); /写入读暂存器指令 temp_L=tempreadbyte(); /读温度低8位 temp_H=tempreadbyte(); /读温度高8位 temp=temp_H8|temp_L; /获取温度数据 f_temp=temp*0.0625; /12位温度数据,分辨率为0.0625; temp=f_temp*10+0.5; /乘10是小

34、数点后保留一位,加0.5是减小误差 return temp; ,/显示子程序 void dis_temp(uint t) uint i; i=t/100; /将百位显示在数码管第2位 P0=tablei; P2=0xFD; delay(5); P0=0x00; /消隐 i=t%100/10; /将十位和小数点显示在数码管第3位 P0=tablei|0x80; P2=0xFB; delay(5); P0=0x00; /消隐 i=t%10; /将个位显示在数码管第4位 P0=tablei; P2=0xF7; delay(5); P0=0x00; /消隐 ,/主函数 void main() DS18

35、B20_init(); while(1) DS18B20_init(); delay(1); tempwritebyte(0xcc); / 写跳过ROM指令 tempwritebyte(0x44); / 启动转换 dis_temp(get_temp(); / 调用显示子函数 ,(4)软硬件联合调试 把编写好的温度采集系统软件在Keil C51中编译成*.hex文件调入Proteus绘制的电路中,仿真运行电路,看到数码管显示的温度与DS18B20上调节的温度一致,如图所示。调节DS18B20的两个“-”、“+”按钮改变温度,数码管上的温度值会随之变化。,注意:在温度采集系统中,单片机与DS18B

36、20的硬件连接非常简单,但是控制器工作的软件相对复杂,尤其要严格遵循DS18B20的工作时序。,项目拓展 串行A/D转换芯片PCF8591在实验板上的应用,在项目拓展9中我们用实验板上的PCF8591设计了信号发生器,那时采用的是PCF8591的D/A转换功能。其实PCF8591是一只带有1路D/A转换和4路A/D转换的综合数模/模数转换芯片。在这个项目拓展中我们运用它的A/D转换功能。 附录B中“数模/模数转换”电路为实验板上的PCF8591的连接图,如下图。虽然有AIN0AIN3 4路模拟输入,但只有W3和W4两只可调电阻来改变模拟电压值的输入,所以每次只能有2路工作,由J31和J32来选

37、择。,我们用实验板的PCF8591来实现1路A/D转换,将J31的跳线连接2、3,W4调节的电压值(0+5V)从AIN0输入,有PCF8591A/D转换后数字信号从I2C总线输出传送给STC89C52的P2.0、P2.1脚,由STC89C52控制的共阴极数码管显示转换的数值(0255)。 实验板的连接方法如下:用杜邦线将J23的P2.0与J8的SCL相连,J23的P2.1与J8的SDA相连,J23的P0与J3相连,J23的P2.2与J2的B相连(段锁存),J23的P2.3与J2的A相连(位锁存),J31用跳线连接2、3选择AIN0输入。用跳帽将J50连接给数码管电路供电,如附录B中“8位共阴极

38、数码管”电路所示。这样硬件电路就连接好了。,PCF8591进行A/D转换并将转换的数值显示在数码管上的程序 如下:,主函数main(): /宏定义 #include #include “i2c.h“ #include “delay.h“ #include “display.h“ #define AddWr 0x90 /写数据地址 #define AddRd 0x91 /读数据地址 extern bit ack; unsigned char ReadADC(unsigned char Chl); bit WriteDAC(unsigned char dat);,/PCF8591 AD转换主函数

39、main() unsigned char num=0; Init_Timer0(); while (1) /主循环 num=ReadADC(0); TempData0=dofly_DuanManum/100; TempData1=dofly_DuanMa(num%100)/10; TempData2=dofly_DuanMa(num%100)%10; /主循环中添加其他需要一直工作的程序 DelayMs(100); ,/ 读AD转值程序,输入参数 Chl 表示需要转换的通道,范围从0-3,返回值范围0-255 unsigned char ReadADC(unsigned char Chl) u

40、nsigned char Val; Start_I2c(); /启动总线 SendByte(AddWr); /发送器件地址 if(ack=0) return(0); SendByte(0x40|Chl); /发送器件子地址 if(ack=0) return(0); Start_I2c(); SendByte(AddWr+1); if(ack=0) return(0); Val=RcvByte(); NoAck_I2c(); /发送非应位 Stop_I2c(); /结束总线 return(Val); ,延时子函数: #include “delay.h“ /* / uS延时函数 void Dela

41、yUs2x(unsigned char t) while(-t); /* / mS延时函数 void DelayMs(unsigned char t) while(t-) DelayUs2x(245); DelayUs2x(245); /大致延时1mS ,数码管显示子函数: #include“display.h“ #include“delay.h“ #define DataPort P0 /定义数据端口 程序中遇到DataPort 则用P0 替换 sbit LATCH1=P20; /定义锁存使能端口 段锁存 sbit LATCH2=P23; /位锁存 unsigned char code do

42、fly_DuanMa10=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f; / 显示段码值09 unsigned char code dofly_WeiMa=0xfe,0xfd,0xfb,0xf7, 0xef, 0xdf, 0xbf,0x7f; /分别对应相应的数码管点亮,即位码 unsigned char TempData8; /存储显示值的全局变量,/显示函数,用于动态扫描数码管。 输入参数 FirstBit 表示需要显示的第一位,如赋值/2表示从第三个数码管开始显示,如输入0表示从第一个显示。 /Num表示需要显示的位数,如需要显示9

43、9两位数值则该值输入2 void Display(unsigned char FirstBit,unsigned char Num) static unsigned char i=0; DataPort=0; /清空数据,防止有交替重影 LATCH1=1; /段锁存 LATCH1=0; DataPort=dofly_WeiMai+FirstBit; /取位码 LATCH2=1; /位锁存 LATCH2=0; DataPort=TempDatai; /取显示数据,段码 LATCH1=1; /段锁存 LATCH1=0; i+; if(i=Num) i=0; ,/定时器初始化子程序 void Ini

44、t_Timer0(void) TMOD = 0x01; /使用模式1,16位定时器, TH0=0x00; /给定初值 TL0=0x00; EA=1; /总中断打开 ET0=1; /定时器中断打开 TR0=1; /定时器开关打开 /* / 定时器中断子程序 void Timer0_isr(void) interrupt 1 TH0=(65536-2000)/256; /重新赋值 2ms TL0=(65536-2000)%256; Display(0,8); ,I2C子函数: #include “i2c.h“ #include “delay.h“ #define _Nop() _nop_() /定

45、义空指令 bit ack; /应答标志位 sbit SDA=P21; sbit SCL=P20; /启动总线 void Start_I2c() SDA=1; /发送起始条件的数据信号 _Nop(); SCL=1; _Nop(); /起始条件建立时间大于4.7us,延时 _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; /发送起始信号 _Nop(); /起始条件锁定时间大于4 _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; /钳住I2C总线,准备发送或接收数据 _Nop(); _Nop(); ,/ 结束总线 void Stop_I2c() SDA=0; /发送结束条件的数据信号

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1