福建工程学院国脉信息学院本科毕业
福建工程学院国脉信息学院
毕业设计(论文)
专 业: 班级:
设计题目: 基于单片机的低功耗温度记录仪
学生姓名: 学号:
起止日期:
设计地点:
指导教师:
2011年 03 月 25 日
基于单片机的低功耗温度记录仪设计
1、摘要
本文介绍了一种基于AT89C51单片机与PC机串口通信的温度控制系统,用单片机作下位机完成温度数据的采集和执行PC机发出的控制执行命令;用PC机作上位机接收单片机发送的数据,进行数据处理,向单片机发送控制命令,四位一体共阴数码管实时显示当前温度。 PC机与单片机采甪串行通信,可实现温度检测和采集并处理数据的人机友好界面。本设计充分利用PC机VB6.0软件强大的数据处理功能和友好的人机界面,对温度进行实时曲线显示。本设计由硬件和软件二部分组成。通过对系统软件和硬件的合理规划,发挥单片机自身集成多系统功能单元的优势,在不减少功能的前提下有效降低了成本,同时实现低功耗运行,系统操作简便,结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。
关键词:AT89C51单片机,PC机,串行通信,数据采集以及处理
2、引论
随着时代的进步和发展,单片机技术已经普及到我们生活、工作、科研、各个领域,已经成为一种比较成熟的技术。温度是工业生产中主要的被控参数之一,有些工艺过程对其温度的控制效果直接影响着产品的质量。许多化学反应的工艺过程必须在适当的温度下才能正常进行;炼油过程中,原油必须在不同的温度和压力条件下进行分馏才能得到汽油、柴油、煤油等产品。没有合适的温度环境,许多电子设备就不能正常工作。还有比如在观察用药剂前后病人体温随时间的变化情况,临床一般都采用水银或电子温度计,隔一段时间测量一次并手工记录结果。这种传统方式给病人带来了很多不便,也加大了护理工作量。更为欠缺的是测量时间间隔不够短,在体温变化率较高的情况下,容易造成处理不当或不足,达不到最理想的疾病控制与治疗效果。
传统的温度记录仪通常采用的是人工记录或普通记录仪用墨水在记录纸上绘制曲线,其体积庞大、精度低、墨水易堵塞、费时费力。。。。。。无纸温度记录仪产生,并因为其更准确地数据记录、更方便的数据存储、更便捷的数据分析功能,所占市场份额逐年猛增;近年来推出的带usb接口的无纸记录仪更是极大的方便了数据的下载和保存。
因此可见,设计出一款测量温度并自动记录下数据的温度记录仪是多么重要。用单片机做成的产品外围元件很少,能实现的功能却很广,广泛应用于工业,农业等。兼于此,特用单片机设计此电路。
单片机发展的三个阶段:
(1)第一阶段(1976-1978):单片机的控索阶段。以Intel公司的MCS – 48为代表。MCS – 48的推出是在工控领域的控索,参与这一控索的公司还有Motorola 、Zilog等,都取得了满意的效果。这就是SCM的诞生年代,“单机片”一词即由此而来。
(2)第二阶段(1978-1982)单片机的完善阶段。Intel公司在MCS – 48 基础上推出了完善的、典型的单片机系列MCS –51。它在以下几个方面奠定了典型的通用总线型单片机体系结构。
①完善的外部总线。MCS-51设置了经典的8位单片机的总线结构,包括8位数据总线、16位地址总线、控制总线及具有很多机通信功能的串行通信接口。
②CPU外围功能单元的集中管理模式。
③体现工控特性的位地址空间及位操作方式。
④指令系统趋于丰富和完善,并且增加了许多突出控制功能的指令。
(3)第三阶段(1982-1990):8位单片机的巩固发展及16位单片机的推出阶段,也是单片机向微控制器发展的阶段。Intel公司推出的MCS – 96系列单片机,将一些用于测控系统的模数转换器、程序运行监视器、脉宽调制器等纳。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善。DS18B20是美国DALLAS公司生产的数字温度传感器芯片,具有结构简单、体积小、功耗小、抗干扰能力强、使用方便等优点。本文设计的一种温度控制系统,用STC89C51单片机作为温控器,选用DS18B20数字温度传感器,单片机与上位机之间通过MAX232串口进行通信,对测试点温度采集,实时显示,数据处理。
3、目 录
1、摘要………………………………………………………………………………2
2、引论………………………………………………………………………………3
3、目录………………………………………………………………………………5
4、正文………………………………………………………………………………7
4.1.1、设计目的……………………………………………………………………7
4.1.2、系统实现功能………………………………………………………………7
4.2、系统总体
设计……………………………………………………………8
4.2.1、系统总体设计框图…………………………………………………………8
4.2.2、系统硬件
…………………………………………………………8
4.2.3、系统软件设计方案…………………………………………………………8
4.3、系统各个模块设计……………………………………………………………9
4.3.1、单片机最小系统……………………………………………………………9
4.3.2、显示电路……………………………………………………………………11
4.3.3、串行通信电路………………………………………………………………13
4.3.4、DS18B20温度传感器电路…………………………………………………13
4.3.5、电源电路……………………………………………………………………15
4.3.6、单片机与PC机串口连接电路……………………………………………15
4.4、系统软件设计…………………………………………………………………17
4.4.1、单片机软件设计……………………………………………………………17
4.4.2、上位机软件设计……………………………………………………………17
4.5、系统调试………………………………………………………………………19
5、结论………………………………………………………………………………20
6、致谢………………………………………………………………………………20
7、参考文献…………………………………………………………………………21
8、附录………………………………………………………………………………22
附录1、系统总体电路图……………………………………………………………22
附录二、单片机程序…………………………………………………………………22
附录三、PC机程序……………………………………………………………………28
正文
(
4.1设计目的及系统实现功能要求
4.1.1设计目的:
(1)了解电子系统的设计方法,巩固和提高学过的基础理论和专业知识;
(2)学习DS18B20数字温度传感器的测温原理,
(3) 掌握串口通信
及其编程方法,
(4)增强对单片机的认识,掌握分析处理问题的方法,进行调试、计算等基本技能的训练,达到具有一定程度的实际工作能力。
(5) 学会用Protel99se进行电路原理图和PCB图的绘制。
(6) 学习用PSPICE、 Multisim 8等仿真软件进行电路设计和仿真。
4.1.2.系统实现功能:
1. 内容及要求:
研究基于单片机的低功耗温度记录仪,可以以一定的时间间隔连续记录系统温度,并提供通讯接口将温度数据上传到PC机。利用VB/VC/DELPHI编制PC示例程序。
2. 主要技术指标:
(1)、温度测量范围0-70℃,系统实现低功耗运行;
(2)、温度记录数不少于200条;
(3)、提供PC机通讯接口;
(4)、PC机软件实现对温度数据分析、统计和处理;
4.2系统总体方案设计
4.2.1.系统总体构成框图如下:
系统总体构成框图
4.2.2系统硬件设计方案:
1.利用AT89C51自身强大的功能和优异的可扩展性,配上四位一体数码管和按键等少量外围电路,就能搭建合适本次实验的小系统。从而大大缩短设计流程,把设计的重点放在温度探测单元,串行通信协议两个部分。
2.现在PC机提供的COM1、Com2是采用RS-232借口标准的。而RS-232是用正负电压来表示逻辑状态,与TTL以高低电平来表示逻辑状态的规定不同。因此,为了能够同计算机借口或终端的TTL器件(如单片机)连接,必须在RS-232与TTL电路之间进行电平和逻辑关系的变换,变换电路选用有德州仪器公司(TL)推出的一款兼容RS-232标准的芯片MAX232.该器件包含2个驱动器、2个接收器和一个电压发生器电路提供TIA/EIA-232-F电平转换成5V TTL/CMOS电平。每一个发送器将TTL/CMOS电平转换成TIA/EIA-232-F电平。
4.2.3系统软件设计方案:
①单片机软件设计
单片机程序由主程序和中断子程序组成的。主程序负责对来自上位机的命令进行解析并执行读温度值、存储温度值、输出控制等等,中断服务程序只负责单片机和上位机之间的数据发送与接收。
②上位机程序设计
由单片机采集的测试点实时温度,通过MAX232传输到上位机PC,利用在Visual Basic 6.0的通信控件Mscomm 属性设置和事件响应的基础上,实现与单片机串行通信,在上位机中,完成温度传感器64位激光ROM读取并显示、实时温度数据显示、数据存储、曲线绘制、历史数据查询,其中在数据查询功能中,设计了时间查询、温度查询等功能。
4.3系统各个模块设计:
4.3.1单片机最小系统
(1)AT89C51管脚图如下:
AT89C51封装引脚图
引脚说明:
①电源引脚
Vcc(40脚):典型值+5V。
Vss(20脚):接低电平。
②外部晶振
X1、X2分别与晶体两端相连接。当采用外部时钟信号时,X2接振荡信号,X1接地。
③输入输出口引脚:
P0口:I/O双向口。作输入口时,应先软件置“ 1”。
P1口:I/O双向口。作输入口时,应先软件置“ 1”。
P2口:I/O双向口。作输入口时,应先软件置“ 1”。
P3口:I/O双向口。作输入口时,应先软件置“ 1”。
④控制引脚:
RST/Vpd、ALE/-PROG、-PSEN、-EA/Vpp组成了MSC-51的控制总线。
RST/Vpd(9脚):复位信号输入端(高电平有效)。
第二功能:加+5V备用电源,可以实现掉电保护RAM信息不丢失。
ALE/-PROG(30脚):地址锁存信号输出端。
第二功能:编程脉冲输入。
-PSEN(29脚):外部程序存储器读选通信号。
-EA/Vpp(31脚):外部程序存储器使能端。
第二功能:编程电压输入端(+21V)。
(2)单片机最小系统:
单片机最小系统
(3) 复位电路:
单片机上电时,当振荡器正在运行时,只要持续给出RST引脚连个机器周期的高电平,便可完成系统复位。外部复位电路是为内部复位电路提供两个机器周期以上的电平而设计的。系统采用上电自动复位,上电瞬间电容器上的电压不能突变,RST上的电压是Vcc上的电压与电容器上的电压之差,因而RST上的电压与Vcc上的电压相同。随着充电的进行,电容器上的电压不断上升,RST上的 电压就随着下降,RST脚上只要保持10ms以上高电平,系统就会有效复位。电容C可取10~33uF,电阻R可取1.2~10kΩ。在本系统设计中,C取10uf,R取10kΩ。
(4)振荡电路:
XTAL1脚和XTAL2脚分别构成片内振荡器的反相放大器的输入和输出端,外接石英晶振或陶瓷晶振以及补偿电容C1、C2选47uF构成并联谐振电路。当外接石英晶振时,电容C1、C2选30Pf±10pF;当外接陶瓷振荡器时,电容C1、C2选47uF±10uF。系统中,外接电C1、C2的大小会影响振荡器频率的稳定度、起振时间及温度稳定性。在设计电路板时,晶振和电容应靠近单片机芯片,以便减少寄生电容,保证振荡器稳定可靠工作。
在本硬件系统设计中,为保证串行通行波特率的误差,选择了11.0592MHz的标准石英晶振,电容C1、C2为30pF。
(3)
接高电平,选用片内程序存储器。
(4) 单片机编程
4.3.2 显示电路
数码管显示电路部分如图:
显示部分采用四位一体共阴数码管,为了显示数字或字符,必须对数字或字符进行编码。七段数码管加上一个小数点,共计8段。因此为LED显示器提供的编码正好是一个字节。
共阴数码管码表
· 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d ,
· 0
1
2
3 4 5
· 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c ,
· 6
7
8
9 A B
· 0x39 , 0x5e , 0x79 , 0x71 , 0x00
· C D E F
无显示
静态显示方式
LED显示器工作方式有两种:静态显示方式和动态显示方式。静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法的优点是占用CPU时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高。
动态显示
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。
本设计采用四位一体共阴数码管动态显示。
4.3.3串行通信电路
由于串口用的是TTL电平,和RS232电平不同,因此,单片机和PC通信时需要进行电平转换,常用的IC是MAX232,连接图如下图所示,其中MAX232供电脚为+5V。采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接。
MAX232串口通信电路图(9孔串口接头)
4.3.4 DS18B20温度传感器电路
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9-12位的数字值读数方式。DS18B20的性能特点如下:
(1)独特的单线接口仅需要一个端口引脚进行通信,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
(2)DS18B20支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点组网测温;
(3)无须外部器件,全部传感元件及转换电路集成在形如一只三极管的集成电路内;
(4)可通过数据线供电,电压范围为3.0-5.5V;
(5)零待机功耗;
(6)温度以9或12位数字,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温;
(7)用户可定义报警设置;
(8)报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
(9)负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;
(10)测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
DS18B20采用3脚PR35封装或8脚SOIC封装,其引脚排列及内部结构框图以及测温原理图如下所示:
引脚排列
电路连接如下图:
4.3.5 恒压电源电路
本设计的供电电路主要变压器、整流桥、滤波电路和78L05芯片组成。电源供电电路如图所示:
系统供电电源总体电路图
4.3.6单片机与PC机串口连接电路:
目前RS-232是PC机与通信工业中应用最广泛的一种串行接口。RS-232被定义为一种在低速率串行通讯中增加通讯距离的单端标准。RS-232采取不平衡传输方式,即所谓单端通讯。
图2-9 RS232引脚图
收、发端的数据信号是相对于信号地,如从DTE设备发出的数据在使用DB25连接器时是2脚相对7脚(信号地)的电平,DB25各引脚定义参见图2-9。典型的RS-232信号在正负电平之间摆动,在发送数据时,发送端驱动器输出正电平在+5~+15V,负电平在-5~-15V电平。当无数据传输时,线上为TTL,从开始传送数据到结束,线上电平从TTL电平到RS-232电平再返回TTL电平。接收器典型的工作电平在+3~+12V与-3~-12V。由于发送电平与接收电平的差仅为2V至3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3~7kÙ。所以RS-232适合本地设备之间的通信。上位机和下位机的接线方法如图
上位机和下位机的接线方法
MCS-51内部含有一个可编程全双工串行通信接口,具有UART的全部功能。该接口电路不仅能同时进行数据的发送和接收,也可作为一个同步移位寄存器使用。
在进行异步通信时,数据的发送和接收分别在各自的时钟(TCLK和RCLK)控制下进行的,但都必须与字符位数的波特率保持一致。MCS-51串行口的发送和接收时钟可由两种方式产生,一种是由主机频率fosc经分频后产生,另一种方式是由内部定时器T1或T2的溢出率经16分频后提供。
发送和接收的过程如下:
串行口的发送过程由指令MOV SBUF,A启动,即CPU由一条写发送缓冲器的指令把数据(字符)写入串行口的发送缓冲器SBUF(发)中,再由硬件电路自动在字符的始、末加上起始位(低电平)、停止位(高电平)及其它控制位(如奇偶位等),然后在移位脉冲SHIFT的控制下,低位在前,高位在后,从TXD端(方式0除外)一位位地向外发送。
串行口的接收与否受制于允许接收位REN的状态,当REN被软件置“1”后,允许接收器接收。接收端RXD一位位地接收数据,直到收到一个完整的字符数据后,控制电路进行最后一次移位,自动去掉启始位,使接收中断标志RI置“1”,并向CPU申请中断。CPU响应中断,用一条指令(MOV A,SBUF)把接收缓冲器SBUF(收)的内容读入累加器。
TI和RI是由硬件置位的,但需要用软件复位。
4.4系统软件设计
4.4.1单片机软件设计:
SHAPE \* MERGEFORMAT
4.4.2上位机软件设计:
VB是微软公司出品的一个快速可视化程序开发工具软件,借助微软在操作系统和办公软件的垄断地位,VB在短短的几年内风靡全球。VB是极有和功能强大的软件,主要表现在:所见即所得的界面设计,基于对象的设计方法,极短的软件开发周期,较易维护的生成代码。
美国微软公司在1991年推出VB1.0至今已经经历了6个版本,VB6.0运行在win9x或winme,win2000,winxp,windowsNT等操作系统下,是一个32位的应用程序开发工具。它主要有以下几个特点[9]:
(1)成功地简化了界面的设计过程。它在windows平台上提供了图形用户界面(GUI)的集成开发环境(IDE)。
(2)采用简单易学的Basic语言。它既适用于没有任何编程经验的开发者学习,也适合于开发各种复杂的底层应用程序。
(3)具有强大的数据和字符串处理功能。Visual Basic 提供了许多现成的字符串处理函数。
(4)易于扩充。除了简单易学的特点以外,Visual Basic 还是一种易于扩充功能的开发系统。
(5)提供了IntelliSense技术。当你在Visual Basic 的代码窗口敲进对象名称的时候IntelliSense技术会自动向你显示一些相关的信息,例如对象的属性和方法等。
(6)提供了多种向导。利用这些向导,你可以快速地完成一般性的任务,例如生成其控件不绑定到数据控件上的纯代码窗体,建立查询,添加工具,制作图表,以及发布创建的应用程序等。
完成后的界面如图3-3所示
单片机与PC的温度控制系统的VB界面
4.5 系统调试
硬件调试首先检查电路的焊接是否正确,然后可用万用表测试或通电检测。硬件调试主要是针对主控板中单片机模块和外部输入、输出模块进行调试。这一部分硬件调试主要分成两大块:上电前的调试和上电后的调试。
在电路安装焊接前,首先是对元器件的检测。对AT89C51、DS18B20在未接电路时是不能检测其好坏的。对于其他器件则可利用万用表进行测量。电阻的测量,用万用表的欧姆档测量。
(1)上电前的调试
在上电前,必须确保电路中不存在断路或短路情况,这一工作是整个调试工作的第一步,也是非常重要的一个步骤。在这部分调试中主要使用的工具是万用表,用来完成检测电路中是否存在断路或者短路情况等。只要将一个表笔固定在电源端或接地端,另仪表笔接其他连接点,指针偏转到0刻度就是通路的。通过万用表的检测,没有发现短路和断路的地方了,电路基本正常后再进行下一步调试。
(2)上电后的调试
在确保硬件电路正常,无异常情况(断路或短路)方可上电调试,上电调试的目的是检验电路是否接错,同时还要检验原理是否正确。
在本设计中,上电调试主要是检测单片机部分与外部输入、输出电路是否接对。本次调试需要通过软硬件联调来实现。由于DS18B20与单片机采用串行数据传送,因此,对DS18B20进行读/写编程时必须严格地保证读/写时序,否则将无法读取测量结果。本程序采用单片机C语言编写,用Keil C51编译器编程调试。
5、结论
首先,通过这次应用系统设计,在很大程度上提高了自己的独立思考能力和单片机的专业知识,也深刻了解写一篇应用系统的步骤和
,有过这样的一次训练,相信在接下来的日子我们都会了,而且会做得更好。
我所写的系统主要根据目前节省能源的发展趋势和国内实际的应用特点和要求,系统以单片机AT89C51为核心部件,采用了自动化的结构形式,实现对温度的检测、记录与数据处理。利用C语言编制,运行程序该系统的主要特点是:
1)适用性强,利用VB友好的人机界面,用户只需对界面参数进行设置并启动系统正常运行便可实现对温度的测量、记录与数据处理。
2)将单片机以及温度传感器引入对温度的分析和处理中,单片机控制决策无需建立被控对象的数学模型,系统的鲁棒性强,适合对非线性、时变、滞后系统的控制,对温度测量系统采用单片机控制非常适合。
3)系统成本低廉,操作非常简单,可扩展性强,只要稍加改变,即可增加其他使用功能。
通过对本设计的思考,更加加深了对单片机的认识,熟练了单片机的编程,更对当前的温度传感器有了更深刻的认识与了解,但是由于此系统依赖温度传感器,因而对温度传感器的稳定性,线性等诸多方面有着严格的要求,但是传感器的性能越好,相对而言其价格也就越高,因而在此设计中,温度传感器我个人觉的还是存在遗憾,其次,由于采用了C语言,所以其编程过程复杂不易查错。最后由于时间紧迫,本设计还有诸多地方需要改进,比如改用RS-485串行接口或是网线,实现远距离操作。
6、致谢
在我论文即将完成之际,我首先要向在论文写作中给予我悉心关怀、鼓励和指导的陈松岭老师致以深深的敬意和谢意!老师一丝不苟的钻研精神,严谨求实的治学态度,执着忘我的工作作风,独树一帜的思维方式,使学生受益匪浅,并终身难忘。
所有人的青春,从一开始的空白无物,到后来的极欲飞扬,阴霾满地,再到现在的尘埃落定,一切都在发生,一切都在结束.美好而缤纷的大学生活,就这样画上了句号,真有些难忘和难舍。
纯如钻,强如钢。最大的收获是心智的成熟,一千多个日子里曾悲伤过、失落过、苦恼过,委屈过。而现在懂得擦干眼泪,收拾伤痕,站起继续勇往直前,前面的荆棘,不算什么,路上的障碍,我每攀登越过一次,便往云端靠近了一步。感谢我的朋友和同学对我的关心和帮助!
7、参考文献
[1] 陈大钦主编 《电子技术基础实验》 高等教育出版社 2004年
[2] 余锡存 曹国华.单片机原理及接口技术[M].陕西:西安电子科技大学出版社
[3] 苏家健. 单片机原理及应用技术 .高等教育出版社,2004.11
[4] 周航慈. 单片机程序设计基础 . 北京航空航天大学出版社,2003.07
[5] 李仁发、肖玲、吴强.数字逻辑设计(第四版). 人民邮电出版社,2006.05
[6]
51单片机学习网 http://www.51c51.com/
[7]
单片机学习网 http://www.mcustudy.com/
[8]《单片机C语言应用程序设计》第四版,马忠梅主编,北京航空航天大学出版社
[9]《单片机开发与典型工程项目实例详解》,边海龙、孙永奎编著,电子工业出版社
[10]《51单片机C语言教程----入门、提高、开发、拓展全攻略》,郭天祥 编著,
电子工业出版社,2009
[11] 吴黎明主编 《单片机原理及应用技术》 科学出版社 2003年
[12] 刘乐善主编 《微型计算机接口技术及应用》 华中科技大学出版社 2004年
[13] J.A.Connelley. ANALOG INTEGRATED CIRCUITS. John Wiley &Sons
[14] 吴洪潭,肖艳萍,赵伟国.单片机原理及应用系统设计[M].北京:国防工业出版社,2005
[15] 陈梓城主编 《电子技术实训 》 机械工业出版社 2003年
[16] 李伯成.基于MCS-51单片机的嵌入式系统的设计[M].北京:电子工业出版社,2004.
[17] 李学海主编 标准80C51单片机基础教程》 北京航空航天大学出版社 2006年
[18] 刘乐善主编 《微型计算机接口技术及应用》 华中科技大学出版社 2004年
[19] 先锋工作室. 单片机程序实例[M].北京:清华大学出版社,2002.
[20] 付家才. 单片机控制工程实践技术[M]. 北京:化学工业出版社,2004.5
[21] Atmel Microcontroller Handbook,2001
[22] STC Microcontroller Handbook,2007
[23] John F. Wakerly[M] DIGITAL DESIGN 北京:高等教育出版社 2009
8、附录
附录1:
总体电路图:
附录2:
单片机程序:
#include
#include
#define uchar unsigned char
bit Tflag;//温度正负标志
sbit DQ=P3^7; //温度输入口
sbit DIN=P0^7; //LED小数点控制
uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//温度小数部分用查表法
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x00,0x40};
//共阴led段码表0x40 负
unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
};
uchar data temp_data[2]={0x00,0x00}; // 读出温度暂放
unsigned char dispbuf[5]={0,0,0,0,0};
void digitalshow(unsigned char a3,unsigned char a2,unsigned char a1,unsigned char a0)
{
unsigned char i;
dispbuf[0]=a0;
dispbuf[1]=a1;
dispbuf[2]=a2;
dispbuf[3]=a3;
for(i=0;i<4;i++)
{
P2=0xff; //关闭所有显示
P0=dispcode[dispbuf[i]];
P2=dispbitcode[i];
if(i==1){DIN=1;}
}
}
/********** 该程序为总线上只有一个器件 **********/
//毫秒延时 11.059 Mhz
void dmsec (unsigned int count)
{
unsigned int i;
// 1ms延时
while (count--)
{
for (i=0;i<125;i++){}
}
}
void Delay(unsigned int num)// 延时函数
{
while( --num );
}
//复位脉冲
void tmreset (void)
{
DQ = 0;
Delay(90);
// 精确延时 大于 480us
DQ = 1;
Delay(4);
// 90,4 可以小范围变化
}
//存在脉冲
void tmpre (void)
{
while (DQ);
while (~DQ);
Delay(4);
}
//读一个位
bit tmrbit (void)
{
unsigned int i;
bit dat;
DQ = 0; i++;
// i++;大概1us
DQ = 1; i++; i++;
dat = DQ;
Delay(8);
return (dat);
}
//读一个比特
unsigned char tmrbyte (void)
{
unsigned char i,j,dat;
dat = 0;
for (i=1;i<=8;i++)
{
j = tmrbit ();
dat = (j << 7) | (dat >> 1);
}
return (dat);
}
//写一个比特
void tmwbyte (unsigned char dat)
{
unsigned int i;
unsigned char j;
bit testb;
for (j=1;j<=8;j++)
{
testb = dat & 0x01;
dat = dat >> 1;
// 从低位开始?
if (testb)
{// Write 1
DQ = 0;
// 先拉低
i++; i++;
// >1us
DQ = 1;
Delay(4);
}
else
{// Write 0
DQ = 0;
Delay(4);
// 大一点 没影响,但不能太大,写一个位在30us内
DQ = 1;
i++; i++;
// 再拉高
}
}
}
//ds1820开始转换
void tmstart (void)
{
dmsec(1);
tmreset ();
tmpre ();
dmsec (1);
tmwbyte (0xcc);
// skip rom
tmwbyte (0x44);
// 转换
}
//读取温度
read_temp()
{
tmreset ();
tmpre ();
dmsec (1);
tmwbyte (0xcc);
// skip rom
tmwbyte (0xbe);
// 转换
temp_data[0] = tmrbyte ();
// LSB低8位
temp_data[1]= tmrbyte ();
// MSB高8位
if((temp_data[1] & 0x80)==0x80)
//判断温度正负
{
temp_data[1]=~temp_data[1];temp_data[0]=~temp_data[0]+1;
//负温度处理(DS18B20的负温度是正的反码,即将它取反+1,就得到正的温度)
Tflag=0;
}
else
{
Tflag=1;
}
}
/********** MAIN **********/
void main (void)
{
uchar last;
uchar lsb,msb;
uchar i;
tmstart();
dmsec(450);
// 初始化ds18b20
while(1)
{
tmstart();
// ds1820开始转换
dmsec(2);
read_temp();
// 读取温度
dispbuf[4]=temp_data[0]&0x0f;dispbuf[0]=ditab[dispbuf[4]];
dispbuf[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
dispbuf[3]=dispbuf[4]/100;
dispbuf[1]=dispbuf[4]%100;
dispbuf[2]=dispbuf[1]/10;
dispbuf[1]=dispbuf[1]%10;
msb=last/10;
lsb=last%10;
for(i=255;i>0;i--)
{
if(Tflag==1) //正温
if(dispbuf[4]<126)
{ if(dispbuf[4]<100)
{digitalshow(10,dispbuf[2],dispbuf[1],dispbuf[0]);} //温度小于100度,则百位不显示
else
{msb=msb%10; //温度大于100度时十位需要在除10取余
digitalshow(Tflag,dispbuf[2],dispbuf[1],dispbuf[0]);};} //温度大于100度,百位显示为1
else
{ digitalshow(11,11,11,11); } //温度大于125度时显示---
else
{
if(dispbuf[4]<56)
//负温大于-55度时正常显示
{digitalshow(11,dispbuf[2],dispbuf[1],dispbuf[0]);}
else
{digitalshow(11,11,11,11);}}
//负温小于-55度时显示为---
}
}
}
附录3
PC机程序:
Dim n As Integer
Dim t As Integer ‘定义全局变量
Private Sub Command1_Click() ‘单击温度设置按钮程序
Dim i As Integer
If Len(Trim(Text2.Text)) < 3 Or Val(Text2.Text) > 100 Or Val(Text2.Text) < 0 Or Left(Right(Text2.Text, 2), 1) <> "." Then
Label3.Caption = "设定输入错误,不发送"
Else
Label3.Caption = ""
Select Case Len(Trim(Text2.Text))
Case 5
Text8.Text = Trim(Text2.Text)
Case 4
Text8.Text = "0" & Trim(Text2.Text)
Case 3
Text8.Text = "00" & Trim(Text2.Text)
End Select
MSComm1.Output = "C"
Timer2.Enabled = True
End If
End Sub
Private Sub Command2_Click() ‘单击按钮执行数据采集或停止采集
If Command2.Caption = "采集数据" Then
Command2.Caption = "停止采集"
Timer1.Enabled = True
MSComm1.Output = "A"
Else
Command2.Caption = "采集数据"
Timer1.Enabled = False
MSComm1.Output = "B"
MSComm1.Output = "B"
End If
End Sub
Private Sub Command4_Click() ‘单击按钮清空数据
Text1.Text = ""
Text4.Text = ""
End Sub
Private Sub Command5_Click() ‘单击按钮开关通信端口
If Command5.Caption = "开通信端口" Then
Command5.Caption = "关通信端口"
COM.Enabled = False
Command2.Enabled = True
Command1.Enabled = True
Text2.Enabled = True
Select Case COM.ListIndex '指定端口号(COM)
Case 0 MSComm1.CommPort = 1
Case 1 MSComm1.CommPort = 2
Case 2 MSComm1.CommPort = 3
Case 3 MSComm1.CommPort = 4
End Select
MSComm1.Settings = "9600,n,8,1" '9600波特,无校验,8位数据位,1位停止位
MSComm1.InputMode = comInputModeText '接收文本数据
MSComm1.InputLen = 0 '读出接收缓冲区的所有内容
MSComm1.InBufferSize = 1024
MSComm1.OutBufferSize = 1024
MSComm1.RThreshold = 1 '每接收到1个字符,发生1次事件
MSComm1.PortOpen = True '打开串口
Else
Timer1.Enabled = False
MSComm1.Output = "B"
MSComm1.Output = "B"
Command5.Caption = "开通信端口"
COM.Enabled = True
MSComm1.PortOpen = False
Command2.Caption = "采集数据"
Command2.Enabled = False
Command1.Enabled = False
Text2.Enabled = False
End If
End Sub
Private Sub Command7_Click() ‘单击按钮保存温度数据
CommonDialog1.Action = 2
Open CommonDialog1.FileName For Append As #1
Write #1, Now
Write #1, Text4.Text
Close #1
End Sub
Private Sub Form_Load()
COM.AddItem "COM1"
COM.AddItem "COM2"
COM.AddItem "COM3"
COM.AddItem "COM4"
End Sub
Private Sub MSComm1_OnComm() ‘串口接收到数据时读出数据
Select Case MSComm1.CommEvent
Case comEvReceive
Text1.Text = Text1.Text & MSComm1.Input
Case Else
End Select
End Sub
Private Sub Text1_Change() ‘对读出的数据进行处理
If (Len(Text1.Text) Mod 4 = 0) And (Len(Text1.Text) > 0) Then
Text3.Text = Right$(Text1.Text, 4) & "℃"
Text4.Text = Time & Chr$(6) & Chr$(6) & Chr$(6) & Text3.Text & " " & Text4.Text
Text7.Text = Time$
n = n + 1
End If
If n = 100 Then
n = 0
Text1.Text = ""
End If
End Sub
Private Sub Text5_Change() ‘改变读数据的时间
Timer1.Interval = Val(Text5.Text) * 1000
End Sub
Private Sub Timer1_Timer() ‘采集数据后进行绘图
MSComm1.Output = "A"
Dim a As Single
Dim a1 As String
Dim a2 As String
Dim a3 As String
Dim k As Integer
Static b(200) As Integer
Text7.Text = Time
For k = 1 To 199
b(k) = b(k + 1)
Next k
b(200) = Val(Text3.Text)
With MSChart1
For i = 1 To 200
a = Val(Mid(Text7.Text, 1, 2)) * 3600 + Val(Mid(Text7.Text, 4, 2)) * 60 + Val(Mid(Text7.Text, 7, 2)) - 200 * Val(Text5.Text) + i * Val(Text5.Text) + 1
If a < 0 Then
a = a + 86400
ElseIf a > 86400 Then
a = a - 86400
End If
If a \ 3600 < 10 Then
a1 = "0" & (a \ 3600)
Else
a1 = Str(a \ 3600)
End If
If (a Mod 3600) \ 60 < 10 Then
a2 = "0" & ((a Mod 3600) \ 60)
Else
a2 = (a Mod 3600) \ 60
End If
If ((a Mod 3600) Mod 60) < 10 Then
a3 = "0" & ((a Mod 3600) Mod 60)
Else
a3 = ((a Mod 3600) Mod 60)
End If
.Row = i
.Data = b(i)
.RowLabel = a1 & ":" & a2 & ":" & a3
Next i
End With
End Sub
Private Sub Timer2_Timer() ‘设置温度时间隔开发送数据的时间,以使
If t = 0 Then ‘单片机能正常处理
MSComm1.Output = Mid(Text8.Text, 1, 1)
t = t + 1
ElseIf t = 1 Then
MSComm1.Output = Mid(Text8.Text, 2, 1)
t = t + 1