《微机原理》课外设计制作总结报告题目(B):使用单片机和温度传感器制作数字式温度计组号:29任课教师:王向阳组长:11122412 侯景业20%成员:11122445 白波20%成员:11122510 吕锦涛20%成员:11123633 柴金磊20%成员:11123722 沈璘熙20%联系方式:0二零一三年五月十五日一、课程设计目的与要求利用学习过的《单片机与接口技术》课程的内容和其他相关课程的内容,设计数字式温度计。
使用单片机和温度传感器制作数字式温度计(1)实时温度采集(2)数字显示(3)显示精度:0.1℃(4)其它与温度有关的扩展二、课程设计内容2.1数字温度计设计方案考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以可以采用一只温度传感器DS18B20,该传感器可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
2.2方案的总体框图温度计电路设计总体设计方框图如图1所示,控制器采用单片机8051,温度传感器采用DS18B20,用3位LED数码管以串口传送数据实现温度显示。
图1 总体设计方框图主控制器单片机8051具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。
温度传感器数字温度传感器DS18B20,它不仅能直接输出串行数字信号,而且具有微型化、低功耗、高性能、易于微处理器连接和抗干扰能力强等优点。
DS18B20数字温度传感器对于实测的温度提供了9-12位的数据和报警温度寄存器,它的测温范围为-55℃~+125℃,其中在-10℃~+85℃的范围内的测量精度为±0.5℃。
由于每个DS18B20有唯一的一个连续64位的产品号,所以允许在一根电缆上连接多个传感器,以构成大型温度测控网络。
DS18B20特性DS18B20 可以程序设定9~12 位的分辨率,精度为±0.5°C。
可选更小的封装方式,更宽的电压适用范围。
分辨率设定,及用户设定的报警温度存储在EEPROM 中,掉电后依然保存。
DS18B20 的性能是新一代产品中最好的!性能价格比也非常出色!DS1822 与DS18B20 软件兼容,是DS18B20 的简化版本。
省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。
继"一线总线"的早期产品后,DS1820 开辟了温度传感器技术的新概念。
DS18B20 和DS1822 使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。
DS18B20 的主要特性(1)适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电(2)独特的单线接口方式,DS18B20 在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20 的双向通讯(3)DS18B20 支持多点组网功能,多个DS18B20 可以并联在唯一的三线上,实现组网多点测温(4)DS18B20 在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内(5)温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃(6)可编程的分辨率为9~12 位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温(7)在9 位分辨率时最多在93.75ms 内把温度转换为数字,12 位分辨率时最多在750ms 内把温度值转换为数字,速度更快(8)测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC 校验码,具有极强的抗干扰纠错能力(9)负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
DS18B20 工作原理DS18B20 的读写时序和测温原理与DS1820 相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s 减为750ms。
DS18B20 测温原理如图 3 所示。
图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器 2 的脉冲输入。
计数器 1 和温度寄存器被预置在-55℃所对应的一个基数值。
计数器 1 对低温度系数晶振产生的脉冲信号进行减法计数,当计数器 1 的预置值减到0 时,温度寄存器的值将加1,计数器 1 的预置将重新被装入,计数器 1 重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器 2 计数到0 时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
图 3 中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器 1 的预置值。
2.3系统硬件电路DS18B20与8051单片机连接非常简单,只需将DS18B20信号线与单片机一位I/O线相连,且一位I/O线可连接多个DS18B20,以实现单点或多点温度测量。
DS18B20可以通过2种方式供电:外加电源方式和寄生电源方式。
前者需要外加电源,电源的正负极分别与DS18B20的VDD和GND相连接。
后者采用寄生电源,将DS18B20的VDD与GND接在一起,当总线上出现高电平时,上拉电阻提供电源;当总线低电平时,内部电容供电。
由于采用外加电源方式更能增强DS18B20的抗干扰性,故本设计采用这种方式。
234432EA/VP 31X119X218RESET 9R D 17WR 16INT012INT113T014T115P101P112P123P134P145P156P167P178P0039P0138P0237P0336P0435P0534P0633P0732P2021P2122P2223P2324P2425P2526P2627P2728PSEN29ALE/P 30TXD 11RXD 10U?8051NC 1NC 2GND 3I/O 4NC 8NC 7NC 6Vcc5U2DS18B20S1SW-PBY1C 1C 2R 5R 4R 3C 4C 3R 2R 1VCC图3 DS18B20温度传感器与单片机的接口电路 显示电路显示电路是使用的串口显示,这种显示最大的优点就是使用口资源比较少,可充分利用串行口,将并行口用到最需要的地方去,同时主程序不需要扫描显示器,使它有更多的时间处理其他的事情,这种方法用于显示位数少,显示亮度大的地方,效果较好,只用p3口的总体电路图系统整体硬件电路包括,传感器数据采集电路,温度显示电路,单片机主板电路等,图中的按健复位电路是上电复位加手动复位,使用比较方便,在程序跑飞时,可以手动复位,这样就不用在重起单片机电源,就可以实现复位。
DS18B20 有4 个主要的数据部件:(1)光刻ROM 中的64 位序列号是出厂前被光刻好的,它可以看作是该DS18B20 的地址序列码。
64位光刻ROM 的排列是:开始8 位(28H)是产品类型标号,接着的48 位是该DS18B20 自身的序列号,最后8 位是前面56 位的循环冗余校验(CRC=X8+X5+X4+1)。
光刻ROM 的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20 的目的。
(2)DS18B20 中的温度传感器可完成对温度的测量,以12 位转化为例:用16 位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB 形式表达,其中S 为符号位。
这是12 位转化后得到的12 位数据,存储在18B20 的两个8 比特的RAM 中,二进制中的前面5 位是符号位,如果测得的温度大于0,这 5 位为0,只要将测到的数值乘于0.0625 即可得到实际温度;如果温度小于0,这5 位为1,测到的数值需要取反加 1 再乘于0.0625 即可得到实际温度。
例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。
三、系统软件算法分析系统程序主要包括单片机主程序、温度变换程序、显示程序等。
3.1主程序主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见图6所示图6 主程序流程图3.2读出温度子程序读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
其程序流程图如图7示发DS18B20复位命令发条过ROM命令发读取温度命令读取操作,CRC校验9字节完?CRC校验正?移入温度暂存器结束3.3温度转换命令子程序温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
温度转换命令子程序图图8 温度转换命令子程序流程图四、程序编写#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include "18b20.h"bit ReadTempFlag;//定义读时间标志#define DataPort P0 //定义段数据端口程序中遇到DataPort 则用P0 替换#define SegPort P2 //定义位数据端口unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值01234567unsigned char code dofly_WeiMa[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]; //存储显示值的全局变量void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数void Init_Timer0(void);//定时器初始化/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned int TempH,TempL,temp;Init_Timer0();while (1) //主循环{if(ReadTempFlag==1){ReadTempFlag=0;temp=ReadTemperature();if(temp&0x8000){TempData[0]=0x40;//负号标志temp=~temp; // 取反加1temp +=1;}elseTempData[0]=0;TempH=temp>>4;TempL=temp&0x0F;TempL=TempL*6/10;//小数近似处理if(TempH/100==0)TempData[1]=0;elseTempData[1]=dofly_DuanMa[TempH/100]; //十位温度if((TempH/100==0)&&((TempH%100)/10==0))//消隐TempData[2]=0;elseTempData[2]=dofly_DuanMa[(TempH%100)/10]; //十位温度TempData[3]=dofly_DuanMa[(TempH%100)%10]|0x80; //个位温度,带小数点TempData[4]=dofly_DuanMa[TempL];TempData[6]=0x39; //显示C符号}}}/*------------------------------------------------显示函数,用于动态扫描数码管输入参数FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。