目 录
引言.... 1
1 确定设计方案.... 1
2 元器件选择.... 1
2.1 传感器型号选择... 1
2.2 运算放大电路... 2
2.3 模数转换... 3
2.4 控制器... 5
2.5 显示元器件的选择... 8
3 结构和基本原理.... 9
3.1传感器及放大电路... 9
3.2 模数转换电路... 10
3.3 键盘消抖... 10
3.4 显示电路... 11
4 电路仿真.... 11
5 硬件电路设计.... 11
5.1 画硬件原理图... 12
5.2画印刷电路板PCB图... 12
5.3 打印PCB图... 13
6 软件设计.... 13
7 总结.... 14
谢 辞.... 15
参考文献.... 16
附 录.... 17
引言
在当今信息化时代展过程中,各种信息的感知、采集、转换、传输和处理的功能器件已经成为各个应用领域中不可缺少的重要技术工具。传感器是信息采集系统的首要部件,是实现现代化测量和自动控制的主要环节,是现代信息产业的源头,又是信息社会赖以存在和发展的物质与技术基础。可见理解和撑握传感器的知识与技术有着其极重要的意义。
传感器知识面广,如果在实践技能的锻炼上下功夫,单凭课堂理论课学习,势必出现理论与实践脱节的局面。任随书本上把单片机技术介绍得多么重要、多么实用多么好用,同学们仍然会感到那只是空中楼阁,离自己十分遥远,或者会感到对它失去兴趣,或者会感到它高深莫测无从下手,这些情况都会令课堂教学的效果大打折扣。
本次设计的目的就是让我们在理论学习的基础上,通过完成一个传感品器件的设计,使我们学生不但能够将课堂上学到的理论知识与实际应用结合起来,而且能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排版调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高。
1 确定设计方案
测量温度的方法多种多样,测温传感器是决定技术指标的关键元件,这次实训采用AD590作为温度传感,再通过模数转换把模拟信号转成数字信号,送入单片机进行处理并显示。
2 元器件选择
2.1 传感器型号选择
集成温度传感器实质上是一种半导体集成电路,它是利用晶体管的b-e结压降的不饱和值VBE与热力学温度T和通过发射极电流I的下述关系实现对温度的检测,集成温度传感器具有线性好、精度适中、灵敏度高、体积小、使用方便等优点,得到广泛应用。集成温度传感器的输出形式分为电压输出和电流输出两种。电压输出型的灵敏度一般为10mV/K,温度0℃时输出为0,温度25℃时输出2.982V。电流输出型的灵敏度一般为1mA/K。AD590是美国模拟器件公司生产的单片集成两端感温电流源。它的主要特性如下:流过器件的电流(mA)等于器件所处环境的热力学温度,AD590的测温范围为-55℃到+150℃。AD590的电源电压范围为4V-30V。电源电压可在4V-6V范围变化,电流变化1mA,相当于温度变化1K。AD590可以承受44V正向电压和20V反向电压,因而器件反接也不会被损坏。输出电阻为710MW。精度高共有I、J、K、L、M五档,其中M档精度最高,在-55℃到+150℃范围内,非线性误差为±0.3℃。AD590的输出电流I=(273+T)μA(T为摄氏温度),因此测量的电压V为(273+T)μA×10K=(2.73+T/100)V。为了将电压测量出来又务须使输出电流I不分流出来,我们使用电压跟随器其输出电压V2等于输入电压V。由于一般电源供应教多器件之后,电源是带杂波的,因此我们使用齐纳二极管作为稳压元件,再利用可变电阻分压,其输出电压V1需调整至2.73V接下来我们使用差动放大器其输出Vo为(100K/10K)×(V2-V1)=T/10,如果现在为摄氏28℃,输出电压为2.8V,输出电压接AD转换器,那么AD转换输出的数字量就和摄氏温度成线形比例关系。
2.2 运算放大电路
电路需要两路运算放大电路,所以选择双路运算放大器,一路作跟随器另一路作差分放大器,LM358 内部包括有两个独立的、高增益、内部频率补偿的双运算放大器,适合于电源电压范围很宽的单电源使用,也适用于双电源工作模式,在推荐的工作条件下,电源电流与电源电压无关。它的使用范围包括传感放大器、直流增益模块和其他所有可用单电源供电的使用运算放大器的场合。LM358 的封装形式有塑封8引线双列直插式和贴片式,本实训用8引线双列直插式DIP8。
特性(Features):
内部频率补偿
直流电压增益高(约100dB)
单位增益频带宽(约1MHz)
电源电压范围宽:单电源(3—30V);
双电源(±1.5 一±15V)
低功耗电流,适合于电池供电,低输入偏流
低输入失调电压和失调电流
共模输入电压范围宽,包括接地
差模输入电压范围宽,等于电源电压范围
输出电压摆幅大(0 至Vcc-1.5V)
为了减少测量电压时对AD590的电流分流所以本实训先用一路放大器作为跟随器,电压跟随器的显著特点就是,输入阻抗高,而输出阻抗低,一般来说,输入阻抗要达到几兆欧姆是很容易做到的。输出阻抗低,通常可以到几欧姆,甚至更低。
在电路中,电压跟随器一般做缓冲级及隔离级。因为,电压放大器的输出阻抗一般比较高,通常在几千欧到几十千欧,如果后级的输入阻抗比较小,那么信号就会有相当的部分损耗在前级的输出电阻中。在这个时候,就需要电压跟随器来从中进行缓冲。起到承上启下的作用。应用电压跟随器的另外一个好处就是,提高了输入阻抗,这样,输入电容的容量可以大幅度减小,为应用高品质的电容提供了前提保证。
AD590是恒流输出,其输出电流刚好是1uA/K。在电路中用10K的电阻跟AD59串连,因此电阻两电压刚好就是0.01V/K。在零摄氏度时电阻两端的电压为2.73V然而模数转换ADC0809的输入电压为0-5V,分辨率为0.19。精度比较低,如果电压跟随直接与模数转换模块直接相连就会有很大误差。所以还要经过差分放大电路把电压放大10倍。具体是把电压跟随器输出电压与一个标准的2.73V的相减然后再放大10倍。这样做之后温度每改变一摄氏度电压就改变0.1V。这样就可以送入模数转换模块进行转换了。该电路的输入端是两个信号的输入,这两个信号的差值,为电路有效输入信号,电路的输出是对这两个输入信号之差的放大。设想这样一种情景,如果存在干扰信号,会对两个输入信号产生相同的干扰,通过二者之差,干扰信号的有效输入为零,这就达到了抗共模干扰的目的。一种单晶体管电流镜像与适当的负载相接合,其中结合了适当的开关集合,以实现比较器功能。具体地,差分电路包括单晶体管电流镜像,所述单晶体管电流镜像包括通过开关与晶体管相连的电容器以及通过各自独立的开关与电流镜像相连的两个电流源,与电容器开关一起操作电流源之一的开关,以便充电电容器,并且操作另一个电流源的开关,以便所述电路作为具有电流源负载的源极跟随放大器进行操作。因此,晶体管特性的空间分布不会影响比较器功能。
2.3 模数转换
传感器输出信号经过电压跟随器和差分放大电路之后,输出的是0-5V的电压信号,为了把这一信号用数码管显示出来,还要经过模数转换器件ADC0809把0-5V的电压转为数字信号0-255。a/d转换器的功能是把模拟量变换成数字量。由于实现这种转换的工作原理和采用工艺技术不同,因此生产出种类繁多的a/d转换芯片。a/d转换器按分辨率分为4位。6位。8位。10位。14位。16位和bcd码的31/2位。51/2位等。按照转换速度可分为超高速(转换时间≤330ns),次超高速,高速,低速(转换时间>330μs)等。a/d转换器按照转换原理可分为直接a/d转换器和间接a/d转换器。所谓直接a/d转换器,是把模拟信号直接转换成数字信号,如逐次逼近型,并联比较型等。其中逐次逼近型a/d转换器,易于用集成工艺实现,且能达到较高的分辨率和速度,故目前集成化a/d芯片采用逐次逼近型者多;间接a/d转换器是先把模拟量转换成中间量,然后再转换成数字量,如电压/时间转换型(积分型),电压/频率转换型,电压/脉宽转换型等。其中积分型a/d转换器电路简单,抗干扰能力强,切能作到高分辨率,但转换速度较慢。有些转换器还将多路开关。基准电压源。时钟电路。译码器和转换电路集成在一个芯片内,已超出了单纯a/d转换功能,使用十分方便。
A/D转换器的主要技术参数1.分辨率:分辨率是指A/D转换器输出数字量的最低位变化一个数码时,对应输入模拟量的变化量.通常以A/D转换器输出数字量的位数表示分辨率的高低,因为位数越多,量化单位就越小,对输入信号的分辨能力也就越高.例如,输入模拟电压满量程为10V,若用8位A/D转换器转换时,其分辨率为10V/28=39mV,10位的A/D转换器是9.76Mv,而12位的A/D转换器为2.44mV。2.转换误差:转换误差表示A/D转换器实际输出的数字量与理论上的输出数字量之间的差别.通常以输出误差的最大值形式给出.转换误差也叫相对精度或相对误差.转换误差常用最低有效位的倍数表示.例如,某A/D转换的相对精度为±(1/2)LSB,这说明理论上应输出的数字量与实际输出的数字量之间的误差不大于最低位为1的一半。3.转换速度:A/D转换器从接收到转换控制信号开始,到输出端得到稳定的数字量为止所需要的时间,即完成一次A/D转换所需的时间称为转换速度.采用不同的转换电路,其转换速度是不同的,并行型比逐次逼近型要快得多.低速的A/D转换器为1~30ms,中速A/D转换器的时间在50μs左右,高速A/D转换器的时间在50ns左右,ADC809的转换时间在100μs左右。采样频率为8位的、以逐次逼近原理进行模—数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。,当数字量变化时,d/a转换器输出的模拟量按比例关系变化的程度。理想的d/a转换器是线性的,但是实际上是有误差的,模拟输出偏离理想输出的最大值称为线性误差。
8路8位A/D转换器,即分辨率8位。
具有转换起停控制端。
转换时间为100μs
单个+5V电源供电
模拟输入电压范围0~+5V,不需零点和满刻度校准。
工作温度范围为-40~+85摄氏度
低功耗,约15mW。
内部结构
ADC0809是CMOS单片型逐次逼近式A/D转换器,内部结构如图13.22所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型D/A转换器、逐次逼近
外部特性(引脚功能)
ADC0809芯片有28条引脚,采用双列直插式封装,如图13.23所示。下面说明各引脚功能。
IN0~IN7:8路模拟量输入端。
2-1~2-8:8位数字量输出端。
ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路
ALE:地址锁存允许信号,输入,高电平有效。
START: A/D转换启动信号,输入,高电平有效。
EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平。
OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ。
REF(+)、REF(-):基准电压。
Vcc:电源,单一+5V。
GND:地。
ADC0809的工作过程是:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上
2.4 控制器
At89s52 是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非 易失性存储器技术制造,与工业80C51 产品指令和引脚完 全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统 可编程Flash,使得AT89S52为众多嵌入式控制应用系统提 供高灵活、超有效的解决方案。 AT89S52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻 辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工 作。掉电保护方式下,RAM内容被保存,振荡器被冻结, 单片机一切工作停止,直到下一个中断或硬件复位为止。8 位微控制器 8K 字节在系统可编程 Flash AT89S52
P0 口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻
辑电平。对P0端口写“1”时,引脚用作高阻抗输入。
当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,
P0具有内部上拉电阻。
在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验
时,需要外部上拉电阻。
P1 口:P1 口是一个具有内部上拉电阻的8 位双向I/O 口,p1 输出缓冲器能驱动4 个
TTL 逻辑电平。对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入
口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2
的触发输入(P1.1/T2EX),具体如下表所示。
在flash编程和校验时,P1口接收低8位地址字节。
引脚号第二功能
P1.0 T2(定时器/计数器T2的外部计数输入),时钟输出
P1.1 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)
P1.5 MOSI(在系统编程用)
P1.6 MISO(在系统编程用)
P1.7 SCK(在系统编程用)
P2 口:P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4 个
TTL 逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入
口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX @DPTR)
时,P2 口送出高八位地址。在这种应用中,P2 口使用很强的内部上拉发送1。在使用
8位地址(如MOVX @RI)访问外部数据存储器时,P2口输出P2锁存器的内容。
在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。
P3 口:P3 口是一个具有内部上拉电阻的8 位双向I/O 口,p2 输出缓冲器能驱动4 个
TTL 逻辑电平。对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入
口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。
在flash编程和校验时,P3口也接收一些控制信号。
端口引脚 第二功能
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 INTO(外中断0)
P3.3 INT1(外中断1)
P3.4 TO(定时/计数器0)
P3.5 T1(定时/计数器1)
P3.6 WR(外部数据存储器写选通)
P3.7 RD(外部数据存储器读选通)
此外,P3口还接收一些用于FLASH闪存编程和程序校验的控制信号。
RST——复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位。
ALE/PROG——当访问外部程存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。
对FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG)。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。
PSEN——程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
EA/VPP——外部访问允许,欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。
如EA端为高电平(接Vcc端),CPU则执行内部程序存储器的指令。FLASH存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
2.5 显示元器件的选择
在系统中要显示时间,就必需有显示无器件,目前市场上显示元器件很多,有LCD、点阵显显、7段数码管显示等。LED显示器与LCD显示器相比,LED在亮度、功耗、可视角度和刷新速率等方面,都更具优势。LED与LCD的功耗比大约为10:1,而且更高的刷新速率使得LED在视频方面有更好的性能表现,能提供宽达160°的视角,可以显示各种文字、数字、彩色图像及动画信息,也可以播放电视、录像、VCD、DVD等彩色视频信号,多幅显示屏还可以进行联网播出。有机LED显示屏的单个元素反应速度是LCD液晶屏的1000倍,在强光下也可以照看不误,并且适应零下40度的低温。利用LED技术,可以制造出比LCD更薄、更亮、更清晰的显示器,拥有广泛的应用前景。由此可知LCD缺点是比较耗电,而且成本也较高。从节约成本和节约能源的角度作为出发点,我们选择两组4位7段共阴数码管作为时间显示,以便节约成本和功耗。数码管的驱动方式:数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
3 结构和基本原理
本电路主要分为这几部下:传感器及外围元件、信号处理放大电路、模数转换电路、控制器、显示电路、报警电路、键盘输入,结构原理如图3.1所示。
图 3.1 系统框图
3.1传感器及放大电路
传感器输出电流是以绝对温度零度(-273℃)为基准,每增加1℃,它会增加1μA输出电流,因此在室温25℃时,其输出电流Iout=(273+25)=298μA。测量Vo时,不可分出任何电流,所以在应用时我们还要通过运算放大器来作相应处理才能达到测量V0时,不分出任何的电流,电路如图3.2所示。
图3.2 传感器信号放大电路
电路分析:AD590的输出电流I=(273+T)μA(T为摄氏温度),因此测量的电压为2.V。为了将电压测量出来又务须使输出电流I不分流出来,我们使用电压跟随器其输出电压V2等于输入电压V。
由于一般电源供应教多器件之后,电源是带杂波的,因此我们使用齐纳二极管作为稳压元件,再利用可变电阻分压,其输出电压V1需调整至2.73V接下来我们使用差动其输出Vo为(100K/10K)×(V2-V1)=T/10,如果现在为摄氏28℃,输出电压为2.8V,输出电压接AD转换器,那么AD转换输出的数字量就和摄氏温度成线形比例关系。
3.2 模数转换电路
本次实训只用到一路模拟信号,所以ADC0809的地址选择端A、B、C直接与地相边,默认选择IN0输入通道。ALE与START端直接相连再边到单片机的P2口,ADC0890必须由外部提供时钟信号,其时钟信号频率范围是:10-1248kHZ,所以时钟信号可以由单片机提供,单片机ALE端输出频率是晶振频率的六分之一。所以单片机的晶振应选6MHz这样ALE端输出1000kHz的频率就可以供给ADC0809使用。
3.3 键盘消抖
键盘是计算机和工业控制等领域不可缺少的输入设备,通过它可以实现人机对话,完成各种功能操作。但是,通常的按键所用开关为机械弹性开关,由于机械触点的弹性作用,一个按键开关在闭合时不会, 马上稳定地接通,在断开时也不会一下子断开,因而在闭合及断开的瞬间均伴随有一连串的抖动,键抖动会引起一次按键被误读多次,为了确保对按键的一次闭合仅作一次处理,必须去除按键抖动。常见的消 抖方法采用软件或硬件来实现:软件消抖主要是采用延时多次读取键盘接口数据,通过比较前后两次读取键盘端口的数据来判断是否有键按下;简单硬件消抖则简单硬件消抖则是采用电容来平掉信号的毛刺。但是对稳定性要求比较高的应用则需要采用相对复杂的集成电路来实现。按键抖动时间的长短由按键的机械特性决定,一般为5ms~10ms,按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒,利用软件延时消除键盘抖动所产生的毛刺信号时需设置一个定时器中断,每中断一次则读取键盘接口的信号数 据,如果与上次读取的数据不一致,说明当前读取的是前沿抖动数据,将当前的数据保留,等待下次定时器中断。如果当前读取的数据和前次读取数据相同则说明读取的是稳定状态下的数据,则确认为真正有键按下。当检测到按键释放后,需要延时 5ms到10ms的时间,待后沿抖动消失后才能转入该键的处理程序。
软件延时并不需要增加新的硬件,但采用这种方式来设计,一般通过软件指令或者定时器的方式来设定延时的时间,采用通用处理器,由于运行速度不一致,需要将软件做相应的修改。
3.4 显示电路
显示部分是传感器最后的部分,常用的显示器主要有发光二极管和液晶显示器,发光二极管由于其亮度高、价格低、寿命长,对电流、电压的要求较低等优点,因而得到广泛应用。发光二极管由特殊的半导体材料砷化镓、 磷砷化镓等制成,可以单独使用,也可以组装成分段式或点阵式LED显示器件(半导体显示器)。分段式显示器(LED数码管)由7条线段围成8型,每一段包含一个发光二极管。外加正向电压时二极管导通,发出清晰的光,有红、黄、绿等色。只要按规律控制各发光段的亮、灭,就可以显示各种字形或符号。共需要4位LED显示器。采用动态显示方式,由于端口的问题以及动态显示方式的优越性,在此设计的连接方式上采用共阴级接法。显示器LED有段选和位选两个端口,首先说段选端,它由LED八个端口构成,通过对这八个端口输入的不同的二进制数据使得它的时间显示也不同,从而可以得到我们所要的时间显示和温度。
4 电路仿真
在制作硬件电路之前我们选采用模拟电路来仿真,本设计使用Proteus Professosr模拟电路图4.1所示。
图 4.1 硬件仿真图
5 硬件电路设计
在仿真电路中能实现所有功能后,我们使用Protel99来画硬件原理图和PCB图
5.1 画硬件原理图
新建一个工程之后,新建一张原理图,把所需的元器件摆放整齐,并正确连线,确认无误后,就可以作元件封装,并生成网络,最后得到的原理如图5.1所示。
图5.1 电路原理图
5.2画印刷电路板PCB图
把原理图生成的网络导入PCB图中,并进得布线最后得到的PCB图5.2所示。
图5.2 PCB布线图
5.3 打印PCB图
将画好的PCB图打印好,并紧贴到电路板上,送入转印机之后就可以进行腐蚀了,接下来就是打孔了,打好孔之后就进行元器件的焊接。焊接芯片时,首先要检查芯片的各个管脚,保证没有弯曲或者错位,不然按照师兄的话说,焊上去之后就比较难搞了。然后将芯片各个管脚跟PCB板上的焊盘仔细的对准一定要保证顺序,右上角O标记顺时针方向的第一个管脚为1然后用电烙铁轻轻烫一下管脚,由于芯片管脚和焊盘上均有少量的残锡,可以将芯片固定住,然后用电烙铁依次将管脚压平。接下来最关键的步骤:补锡。先在芯片管脚的一端点少量焊锡,然后将一排管脚涂满松香,快速而缓慢的划过管脚
6 软件设计
硬件制作完毕之后,接下来就是程序设计,本设计采用C语言,在主程序中,主要实现初始化,模数转换,按键处理,温度采用动态显示方式。当有键按下时,进入按键处理程序,程序流程图如图6.1所示。
图6.1 程序流程图
7 总结
通过这次实训,我发现在现实设计中还需要注意很多的细节,包括程序设计和硬件设计都要我们小心仔细,一个地方出错就可能会整个系统失效。在硬件设计时,由于电路图转印不好使得腐蚀后的电路板出现断线,在调试过程中引来很大的麻烦,在写调整时间程序时,当按选择键择选要调整时还是秒或分时,看不出是要调整那一位为了方便用户看出现在是在调整那一位,就必须使调整位闪烁,但显示的时候已经用动态显示,如果直接改显示时间,就会使所有的位都闪烁,这样根本就不能实现,后面经过和同学导论,我使不调的位显示4到5次再显示调整位1次,这样做最后就可以实现了,而且这样做还可以改变闪烁速度。
本次设计电路原理图时还有一个错误,这一错误导致电路不能正常工作,在看AD590的PDF文档后,发现AD590供电电压为4-13V,所以我不假思索就把电源供电设为5V。电路板制作完成后调试发现测量温度不准确,测到30多摄氏度之后就上不去了。后来才发现AD590是与10K的电阻串连,当温度上升到30摄氏度时电阻两端的电压为3V而供电电压为5V。由此可知AD590两端的电压为2V这一电压远远低于正常工作电压,找出问题的原因后我立即把供电电压改为12V然后重新制作一块电路板,最后终于调试成功。
在单片机编程时也遇到了一个难题:在用ADC0809进行采样得到0-255的数字信号之后,还要把它转换成对应的温度,由电路的关系可知温度T=data*500/255其中data为ADC0809输出的数字信号0-255.要实现这个式子的运算就要把小数点后面的数也算进去,然后51单片机汇编语言很难实现带小数点的运算,而且单片机为8位,最大的数就是255。要计算500/255就必须另想办法。为此我询问很多同学,他们给我提供了思路就是用C语言来编写程度,最后又发现C语言可以运算符点,还可以通过把小数点后面的数取出。经过几天的努力之后终于把电路调试成功,心理很高兴,因为我又学会了很多的知识。
谢 辞
在本次实训中,我遇到了很多难题,然而这些难题让我不断的学习,在因难中进步,在此我要感谢指导教师给我的提供了宝贵的意见,感谢学校给我们这提供实训的机会。
参考文献
[1]刘修文主编.新编电子控制电路.北京:机械工业出版社,2006
[2]黄贤武编著.传感器原理与应用.桂林:高等教育出版社,2007
[3]刘瑄编著.单片机有效值转换器. 机械工业出版社,2008
[4]刘军编著.单片机原理与接口技术.华东理工大学出版社,2008
附 录
单片机程序
#include "reg51.h"
sbit s1=P1^0;
sbit s2=P1^1;
sbit s3=P1^2;
sbit led1=P1^3;
sbit led2=P1^4;
sbit p37=P3^7;
sbit g1=P2^0;
sbit g2=P2^1;
sbit g3=P2^2;
sbit g4=P2^3;
sbit oe=P2^7;
sbit eoc=P2^6;
sbit start=P2^5;
char table[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
float f_aaa=0,faaa[4];
int zshu,xshu;
unsigned char j=0;
unsigned char bbb[4];
unsigned char set=0;
unsigned char htemp=86;
unsigned char ltemp=3;
//TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
void delay(unsigned int x)
{
while(x--);
}
//TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
void readadc(void)
{
j++;
start=1;
delay(100);
start=0;
delay(100);
oe=1;
delay(100);
if(j==1)
{faaa[1]=P0;}
if(j==2)
{faaa[1]=P0;}
if(j==3)
{faaa[2]=P0;}
if(j>=4)
{faaa[4]=P0;j=0;}
//*******************
if(faaa[1]<=faaa[2])
{
faaa[1]=faaa[2];
}
if(faaa[1]<=faaa[3])
{
faaa[1]=faaa[2];
}
if(faaa[1]<=faaa[4])
{
faaa[1]=faaa[4];
}
//*********************
faaa[0]=(faaa[1]+faaa[2])/2;
f_aaa=f_aaa*500/255*10/15-267;
zshu=(int)f_aaa;
xshu=(f_aaa*100)-(zshu*100);
bbb[0]=zshu/100;
bbb[1]=zshu/10%10;
bbb[2]=zshu%10;
bbb[3]=xshu/10;
if(zshu==htemp)
{
led1=1;
}
if(zshu==ltemp)
{
led2=1;
}
}
//TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
//TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
display(void) {
//*******************
/*P3=table[bbb[0]];//
g1=0;
delay(100);
g1=1;
*/
//**************************************
P3=table[bbb[1]];//
g2=0;
delay(100);
g2=1;
//****************************************
P3=table[bbb[2]];
g3=0;
delay(100);
g3=1;
//**************************
P3=table[bbb[3]];
P2=0xfb;
g4=0;
delay(100);
P2=0xff;
g4=1;
//***********************
}
//TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
void settemp(void)
{
do{
//****************************************
if(s1==0)
{
delay(4000);
if(s1==0)
set++;
if(set>2)
{set=0;
bbb[0]=10;
bbb[1]=10;
bbb[2]=10;
bbb[3]=10;
}
}
//*********************************
if(set==1)//Éè¸ß±¨
{xshu=0;
zshu=htemp;
bbb[0]=zshu/100;
bbb[1]=zshu/10%10;
bbb[2]=zshu%10;
bbb[3]=xshu;
display();
if(s2==0)
{
delay(4000);
if(s2==0){htemp++;}
}
//GGGGGGGGG
if(s3==0)
{ delay(4000);
if(s3==0){htemp--;}
}
}
//**********************
if(set==2)
{
xshu=0;
zshu=ltemp;
bbb[0]=zshu/100;
bbb[1]=zshu/10%10;
bbb[2]=zshu%10;
bbb[3]=xshu;
display();
if(s2==0)
{ delay(4000);
if(s2==0){ltemp++;}
}
//GGGGGGGGGG
if(s3==0)
{delay(4000);
if(s3==0){ltemp--;}
}
}
} while(set);
}
//********************************************
void main(void)
{ int i=1;
led1=0;
led2=0;
bbb[0]=10;
bbb[1]=10;
bbb[2]=10;
bbb[3]=10;
while(1)
{
settemp();
display();
i++;
if(i>200)
{
readadc();
i=0;
}
}
}