1、数字温度计设计报告学校: 常州大学院系: 信息与电子工程系班级: 自动化141姓名: 肖磊 蒋金林指导老师: 郑剑锋时间: 2016年12月1日摘要随着时代的进步和发展,单片机技术已经普及到我们生活、工作、科研、各个领域,已经成为一种比较成熟的技术,本文主要介绍了一个基于89S51单片机的测温系统,详细描述了利用数字温度传感器DS18B20和时钟芯片DS1302开发测温系统和时间系统的过程,并且通过芯片AT24C02进行数据掉电保存。重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,特别是数字温度传感器DS18B20和时钟芯片DS1302的数据采集过程。对各部分的电路
2、也一一进行了介绍,该系统可以方便的实现实现温度采集和时间显示,并可根据需要任意设定上下限报警温度,更改当前时间。它们使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。DS18B20、DS1302与AT89C51结合实现最简温度,时间检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度时间测量,有广泛的应用前景。关键词:单片机 DS18B20温度传感器 时钟芯片DS1302 AT24C02 AT89S52目录1概述.41.1课程设计的意义.41.2设计
3、的任务和要求.42系统总体方案及硬件设计.52.1数字温度计设计方案论证.52.1.1方案一.52.1.2方案二.52.2系统总体设计.62.3系统模块.72.3.1主控制器.72.3.2显示电路.82.3.3温度传感器.82.3.4时钟芯片.2.3.5掉电数据保存电路.2.3.6报警温度调整按键.93系统软件算法分析.103.1主程序流程图.103.2读出温度子程序.103.3温度转换命令子程序.113.4计算温度子程序.113.5显示数据刷新子程序.113.6按键扫描处理子程序.124实验仿真.135总结与体会.14参考文献.15附1源程序代码.161 概述1.1数字温度计基本功能1、 能
4、数字显示被测温度,测量温度范围0100;2、 分辨率不低于0.53、 带有计时和时间显示功能;4、 至少有高、低两路限温控制输出接口控制外部电路,实际制作时可以发光二极管模拟显示其控制状态输出;5、 高、低两路限温控制点可在0100范围内任意独立设置;6、 当温度达到高、低限温控制点发出声光报警。扩展部分1、提高温度测量精度,使分辨率不低于0.1;2、自动顺时测量(测量间隔时间可调)并保存温度值和测量时间;3、可以查询、回显存储器中自动测量的温度值和测量时刻;4、多路温度巡检(至少两路)和多路温度、时间保存。 数字温度计框图2理论分析与计算2.1数字温度计设计方案论证2.1 单片机的选择:方案
5、1:采用传统的STC89C52RC作为电机的控制核心。单片机算术运算功能强,软件编程灵活、自由度大,可用软件编程实现各种算法和逻辑控制,并且由于其功耗低、体积小、技术成熟和成本低等优点,使其在各个领域应用广泛。方案2:采用STM32F103ZET6微控制器(ARM cortexM3内核),还带有非易失性512k Flash程序存储器。它是一种高性能、低功耗的32位CMOS微处理芯片,市场应用最多。其主要特点如下:512KB Flash ROM,72M的主频,片内集成AD、DA, 以及具有DMA、SPI总线。方案3:采用MSP430单片机,MSP430系列单片机是一个16位的单片机,采用了精简指
6、令集(RISC)结构,具有丰富的寻址方式(7 种源操作数寻址、4 种目的操作数寻址)、简洁的 27 条内核指令以及大量的模拟指令;大量的寄存器以及片内数据存储器都可参加多种运算;还有高效的查表处理指令。这些特点保证了可编制出高效率的源程序。由于本系统对CPU运算速度要求不高,不需要执行很复杂的运算,加上成本上和队员各自的技术特点考虑,综合起来选STC89C52RC较适合本系统的要求。2.2.温度传感器的选择2.21.方案一由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将
7、被测温度显示出来,这种设计需要用到A/D转换电路,其中还涉及到电阻与温度的对应值的计算,感温电路比较麻烦。而且在对采集的信号进行放大时容易受温度的影响出现较大的偏差。2.22.方案二进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,电路简单,精度高,软硬件都以实现,而且使用单片机的接口便于系统的再扩展,满足设计要求。2.2方案选择从以上两种方案,很容易看出,采用方案二,电路比较简单,费用较低,可靠性高,软件设计也比较简单,故采用了方案二。2.3 温度时间显示模块:2
8、.31. 方案1:使用液晶显示屏显示时间温度数字。 液晶显示屏(LCD)具有轻薄短小、低耗电量、无辐射危险,平面直角显示以及影象稳定不闪烁等优势,可视面积大,画面效果好,分辨率高,抗干扰能力强等特点,但是液晶显示屏使用的温度范围很窄,正常工作温度范围为0+55,存储温度范围-2060。2.32. 方案2:使用传统的LED数码管显示。 数码管具有:低能耗、低损耗、低压、寿命长、耐老化、防晒、防潮、防火、防高(低)温,对外界环境要求低,易于维护,同时其精度比较高,称重轻,精确可靠,操作简单。但显示效果很差。方案3:使用彩屏(TFT)显示时间温度数字,彩屏显示屏幕较大,所需代码冗长,处理不方便。由于
9、试题上说明显示只能采用数码管显示,故采用传统的LED数码管显示。三 键盘模块: 方案1:使用独立式键盘。独立式键盘是指直接用I/O口线构成的单个按键电路。独立式按键电路配置灵活,软件结构简单。 方案2:使用矩阵式键盘。矩阵式键盘是由行线和列线组成,按键位于行、列的交叉点上,行线、列线分别连接到按键开关的两端。其特点是简单且不增加成本,这种键盘适合按键数量较多的场合。由于考虑到本系统所需的按键的不多,并且为了简化程序,选择独立式按键。 电路与程序设计主控制器STC89C52RC STC89C52RC单片机是宏晶科技推出的新一代高速、低功耗、超强抗干扰的单片机,指令代码完全兼容传统8051单片机,
10、12时钟、机器周期和6时钟、机器周期可以任意选择。 主要特性如下: 增强型8051单片机,6时钟、机器周期和12时钟、机器周期可以任意选择,指令代码完全兼容传统8051单片机。 工作电压:5.5V3.3V 工作频率范围:044MHz。 用户应用程序空间为8K字节 片上集成512字节RAM 通用I/O口32个,复位后为:P1/P2/P3/P4是准双向口/弱上位,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。 ISP(在系统可编程)/IAP(再应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RXD/P3.0,TXD/P3.1 )直接下载用户程序,
11、数秒即可完成一片。 具有EEPROM功能 具有看门狗功能 共3个16位定时器/计数器。及定时器T0、T1、T2 外部中断4路,下降沿中断或低电平触发电路,Power Down模式可由外部中断低电平触发中断方式唤醒 通用异步串行口(UART),还可用定时器实现多个UART 工作温度范围:-40+85(工业级)/075(商业级) PDIP封装 主控制器STC89C52RC电路图温度探测单元: DALLAS最新单线数字温度传感器DS18B20是一种新型的“一线器件”,其体积更小、更适用于多种场合、且适用电压更宽、更经济。DALLAS半导体公司的数字化温度传感器DS18B20是世界上第一片支持“一线总
12、线”接口的温度传感器。温度测量范围为-55+125摄氏度,可编程为9位12位转换精度,测温分辨率可达0.0625摄氏度,分辨率设定参数以及用户设定的报警温度存储在EEPROM中,掉电后依然保存。被测温度用符号扩展的16位数字量方式串行输出;其工作电源既可以在远端引入,也可以采用寄生电源方式产生;多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。 DS18B20的性能特点如下:独特的单线接口方式,DS18B2
13、0在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内适应电压范围更宽,电压范围:3.05.5V,在寄生电源方式下可由数据线供电测温范围55125,精度为0.5零待机功耗测量结果直接输出数字信号,以“一线总线”穿行传送给CPU,同时可传送CRC校验位,具有极强的抗干扰纠错能力负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作以上特点使DS18B20非常适用与多点、远距离温度
14、检测系统。以上特点使DS18B20非常适用与多点、远距离温度检测系统。DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列、各种封装形式如图4.2所示,DQ为数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源;GND为地信号;VDD为可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。2DS18B20温度传感器接线图外部时钟电路:系统采用DS1302时钟芯片,DS1302是美国DALLAS公司推出的具有涓细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分
15、、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;数字显示是采用的液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒和温度等信息。此外,该电子时钟还具有时间校准等功能。DS1302的性能特性: 实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行比较; 用于高速数据暂存的31*8位RAM; 最少引脚的串行I/O; 2.55.5V电压工作范围; 2.5V时耗小于300nA; 用于时钟或RAM数据读/写的单字节或多字节(脉冲方式)数据传送方式; 简单的三线接口。时钟芯片DS1302与外围电路的连接:与MCS-51单片机的接口是由3条线来完成的,MCS-51
16、单片机的P1.0与时钟芯片的数据传输端I/O相连,P1.1用来作为DS1302输入时钟SCLK控制端,P1.2控制DS1302的复位输入端RST。DS1302的X1和X2管脚外接标DS1302的复位引脚通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址命令序列送入移位寄存器;其次,RST提供了终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中置RST为低电平,则会终止此次数据传送,并且I/O引脚变为高阻态。上电运行时,在Vcc2.5V之前,RST必须保持低电平。只有在
17、SCLK为低电平时,才能将RST置为高电平。外部DS1302时钟电路接线图外部存储电路:系统兼有时间温度显示功能,对工作数据要进行掉电保护,并需要再硬件上增加掉电检测电路,但存在电池不可靠及拓展存储芯片占用单片机过多口线的缺点。采用具有I2C总线接口的串行EEPROM器件可很好的解决掉电数据保护问题。系统采用AT24C01数据存储芯片。AT24C01性能特征:1、与400KHz I2C 总线兼容; 2、1.8 到6.0 伏工作电压范围; 3、低功耗CMOS 技术; 4、写保护功能当WP 为高电平时进入写保护状态; 5、页写缓冲器; 6、自定时擦写周期; 7、1,000,000 编程/擦除周期;
18、 8、可保存数据100 年; 外部AT24C01存储电路接线图显示电路设计主要使用数码管功能实现,显示部分硬件用8只数码管为显示管。前四个显示温度,后四个显示温度。这些数码管的共阴相连在一起通过在数码管的阳极加+5V电压或0V电压数码管形成不同的数字。数码管性能特征:1、 低功耗CMOS 技术;2、 ap数码管段选;3、 AD数码管位选;4、 低功耗CMOS 技术;数码管连线图声光报警电路接线图:按键功能:A:温度,高温报警,低温报警切换。B:报警值加一;C:报警值减一;D:返回到当前温度;E:时分之间切换;F:时分加一;G:时分减一;系统软件设计数字温度计的测量温度程序主要包括5个方面的内容
19、:一是单片机从DS1302中读取数据进行计数,二是利用按键进行时间温度上下限的调整,三是单片机中读取DS1302,EEPROM中的和DS18B20采集的数据在数码管上显示时间温度。主程序流程图主程序的主要功能是负责温度,时间的实时显示、读出并处理DS18B20的测量的当前温度值,DS1302的时间。 初始化 读取温度,时间 读出温度值温度,时钟时间,计算处理显示数据刷新 发温度,时间转换开始 命令 调试显示子程序 结束 主程序流程图3.2读出温度子程序 读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其流程图如图所示 发DS18B20的
20、复位命令 发跳过ROM命令 发读取温度命令 读取操作,CRC校验 Y 9字节完 N Y CRC N 校验正 移入温度暂存器 结束 读温度流程图温度超出报警读出温度超过上限值时,发出警报,读出温度低于下限值时,发出警报,通过按键更改温度上下限。开始控制键有效,进入温度上下限设置报警温度上限设置温度超出温度正常温度下限设置温度正常温度超出报警读出DS1302时钟芯片的时间,在数码管上显示出来 4.测试方案与测试结果4.1 测试仪器数字万用表、秒表、电吹风。数字万用表主要用来测试分立元件的电阻、压降、漏电流、截止、导通状态等参数。秒表用来测试时间的准确度。电吹风用来测试温度的变化。4.2 测试方法:
21、先是硬件调试,温度传感器DS18B20能否正常工作,读出温度;时钟芯片能否正常计时,接着软件调试,最后是软硬件调试。调试时可以采用逐个调试,先调试温度传感器,接着是时钟芯片,最后在整体调试。4.3 测试数据及结果分析测试温度(C)实际温度(C)2524.33030.84041.26061.3测试时间(t)实际时间(t)6060120120180180240240结果分析:测试温度与实际温度存在着一定误差,误差不是很大。猜测是周围环境对测得温度产生了影响,但是影响不是很大,可以忽略不计。测试时间与实际时间之间不存在误差,达到了我们的要求。5问题分析与解决方法1 问题: 进行硬件调试时,数码管显示
22、的数字基本错误。 解决方法: 用万用表检查接线,发现数码管的8个段选,接错4位,重新焊接后显示无误。2 问题: 测温度时,数码管上显示乱码。 解决方法: 先用万用表检查接线,检查无误;接着检查程序,发现DS18B20管脚定义错误,经过改正后,能够正常显示温度。3 问题: 整体调试时,两个数码管虽能准确显示温度和时间,但是数码管不停的闪烁,在逐个调试时没有这个问题。解决方法: 先是检查软件有没有弄错,检查无误,查阅资料才弄清原因。因为数码管显示是通过人眼视觉暂留效果,得不停的刷新人眼才无法辨别出来,闪烁是因为刷新的速度比较慢,说明程序在一个周期里面执行的代码时间过长。经过一些调整,只能进行优化,
23、而不能彻底解决这个问题。5心得体会通过本次设计,使我们对单片机的了解有了更加深一步,我发现只有动手做才会孰能技巧,还有对材料的整理和理解。这次设计运用到的知识很多方面,尤其是单片机,像AT89C52,引脚多,硬件内部线路接通,所以用起来很方便,还有ds1302芯片与单片机之间的连接,以及如入使用ds1302,ds12b20芯片。当然也要对这些元器件作相应调查。主要就是电路原理图,还有对引脚的作用熟悉。对于软件方面则是灵活运用单片机有关的程序语言,还有很多扩展功能,由于知识匮乏,但是理论知识还是比较详细的。我们最大的成功之处是在这整个过程,动脑寻求解决一个一个问题的办法,对程序是不断思索,务必写
24、出很简单的程序来,使得数字温度计能做成功!附录代码#include#include#define uchar unsigned char #define uint unsigned intsbit ds=P22;sbit wela=P12;sbit dula=P10;sbit shidula=P11; /段选 sbit led=P20;sbit beep=P23;sbit k1=P25;sbit k2=P26;sbit k3=P27;sbit k4=P24;sbit T_RST=P37;/ds1302-5sbit T_IO=P36;/ds1302-6sbit T_CLK=P35;/ds1302
25、-7sbit ACC0=ACC0;sbit ACC7=ACC7;/累加器A 51单片机原理中有介绍sbit up=P32;sbit down=P33;sbit set=P34;sbit shangxian=P17;/温度上限指示灯sbit xiaxian=P16;/温度下限指示灯sbit zhengwen=P15;sbit fuwen=P14;sbit baojing=P13;uint temp1;float f_temp;int alarmH=310;int alarmL=100;uchar a,b,clock_ss,clock_sg,clock_fs,clock_fg,clock_ms,c
26、lock_mg;int hour,mie,sei;uchar clk_time3; /秒,分,时寄存器初始值code uchar ledmap=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40;/数码管段码 unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef;void key_to1();void key_to2();void key();
27、/*DS1302:写入操作(上升沿)*/ void write_byte(uchar da) uchar i; ACC=da; for(i=8;i0;i-) T_IO=ACC0; T_CLK=0; T_CLK=1; ACC=ACC1; /*DS1302:读取操作(下降沿)*/uchar read_byte(void) uchar i; for(i=0;i1; T_CLK = 1; T_CLK = 0; ACC7 = T_IO; return(ACC);/*DS1302:写入数据(先送地址,再写数据)*/ void write_1302(uchar addr,uchar da) T_RST=0;
28、 /停止工作 T_CLK=0; T_RST=1; /重新工作 write_byte(addr); /写入地址 write_byte(da); T_RST=0; T_CLK=1;/*DS1302:读取数据(先送地址,再读数据)*/uchar read_1302(uchar addr) uchar temp; T_RST=0; /停止工作 T_CLK=0; T_RST=1; /重新工作 write_byte(addr); /写入地址 temp=read_byte(); T_RST=0; T_CLK=1; /停止工作 return(temp);/*延时程序=a*1ms*/void delay(uch
29、ar a) uchar i; while(a- !=0) / led_disp(); for(i=0;i125;i+); /*显示程序*/* DS1302秒,分,时寄存器是BCD码形式: 用16求商和余进行高4位和低4位分离 */*/ void led_disp() uchar cant1,cant2; if(b=0) cant1=0;cant2=0;clock_ms=clk_time0/ 16; clock_mg=clk_time0%16;sei=clock_ms*10+clock_mg;clock_fs=clk_time1/ 16; clock_fg=clk_time1%16;mie=cl
30、ock_fs*10+ clock_fg;clock_ss=clk_time2/ 16; clock_sg=clk_time2%16;/BCD*to*10hour=clock_ss*10+ clock_sg; /用16求商和余进行高4位和低4位分离 if(b=1) cant1+; cant2=0;clock_ss=hour/ 10; clock_sg=hour%10;clock_fs=mie/ 10; clock_fg=mie%10;clock_ms=sei/10; clock_mg=sei%10; if(b=2) cant1=0; cant2+;clock_ss=hour/ 10; clock_sg=hour%10;clock_fs=mie/ 10; clock_fg=mie%10;clock_ms=sei/10; clock_mg=sei%10; if(cant1=3) /*P2=0;P0=ledmapclock_ss;delay(1);P0=0X00;P2=1;P0=ledmapclock_sg;/时个位delay(1);P0=0X00;*/wela=1;P0=0xef;wela=0; shidula=1; P0=ledmapclock_ss; shidula=0;delay(1);P0=0xff;wela=1;