当前位置:文档之家› 单片机温度传感器

单片机温度传感器

课题二温度传感器1课程描述及要求 (2)2课程设计分析设计 (3)2.1课程设计方案 (3)2.2元器件介绍 (3)2.2.1AT89S52 (3)2.2.2DS18B02 (4)2.2.4DS18B02测温原理 (5)3系统硬件设计 (6)3.1最小系统 (7)3.2显示电路 (7)3.3测温电路 (8)3.4按键电路 (9)4软件流程图 (10)5程序的源代码清单 (11)6调试运行结果及分析 (11)6.1软件仿真 (11)7课程设计总结 (12)8参考文献 (13)附录:程序源代码清单 (14)1题目描述及要求课程设计要求:1.9V供电;2.温度采集采用DS18B20;3.4位LED显示;4.4个按键;5.设计温度控制器原理图,学习用PROTEL画出该原理图,并用proteus进行仿真;设计和绘制软件流程图,用C语言进行程序编写;焊接硬件电路,进行调试。

2课程设计分析设计2.1课程设计方案总体设计思路如下。

图2.1硬件框图2.2元器件介绍2.2.1AT89S52AT89S52是一种低功耗、高性能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、A T 89S 52最小系统模块按键模块测温模块驱动模块显示模块定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

8位微控制器8K字节在系统可编程Flash AT89S522.2.2DS18B02DALLAS最新单线数字温度传感器DS18B20是一种新型的“一线器件”,其体积更小、更适用于多种场合、且适用电压更宽、更经济。

DALLAS半导体公司的数字化温度传感器DS18B20是世界上第一片支持“一线总线”接口的温度传感器。

温度测量范围为-55~+125摄氏度,可编程为9位~12位转换精度,测温分辨率可达0.0625摄氏度,分辨率设定参数以及用户设定的报警温度存储在EEPROM 中,掉电后依然保存。

被测温度用符号扩展的16位数字量方式串行输出;其工作电源既可以在远端引入,也可以采用寄生电源方式产生;多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。

因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。

DS18B20的性能特点如下:独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯,DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温,DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内,适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电,温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃零待机功耗,可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快用户可定义报警设置报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作以上特点使DS18B20非常适用与多点、远距离温度检测系统。

DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。

DS18B20的管脚排列、各种封装形式如图所示,DQ为数据输入/输出引脚。

开漏单总线接口引脚。

当被用着在寄生电源下,也可以向器件提供电源;GND为地信号;VDD为可选择的VDD引脚。

当工作于寄生电源时,此引脚必须接地。

其电路图所示:2.2.3DS18B20测温原理DS18B20的测温原理如图2所示,图中低温度系数晶振的振荡频率受温度的影响很小用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量.计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。

减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温图2中的斜率累加器用于补偿和修正测温过程中的非线性其输出用,于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。

另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。

系统对DS18B20的各种操作必须按协议进行。

操作协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。

3系统硬件设计。

本温度计大体分三个工作过程。

首先,由DS18B20温度传感器芯片测量当前的温度,并将结果送入单片机。

然后,通过AT89S52单片机芯片对送来的测量温度读数进行计算和转换,井将此结果送入数码管显示模块。

最后,数码管显示温度数据。

本电路主要由DS18820温度传感器芯片、数码管显示模块和AT89S52单片机芯片组成。

原理图如下:3.1最小系统最小系统是指能进行正常工作的最简单电路。

AT89S52最小应用系统电路如图所示。

电源电路、时钟电路、复位电路是保证单片机系统能正常工作的最基本的三部分电路,缺一不可。

3.2显示电路显示电路采用4个数码管显示,如下图。

3.3测温电路DS18B20最大的特点是单总线数据传输方式,DS18B20的数据I/O均由同一条线来完成。

DS18B20的电源供电方式有2种:外部供电方式和寄生电源方式。

工作于寄生电源方式时,VDD和GND均接地,他在需要远程温度探测和空间受限的场合特别有用,原理是当1W ire总线的信号线DQ为高电平时,窃取信号能量给DS18B20供电,同时一部分能量给内部电容充电,当DQ为低电平时释放能量为DS18B20供电。

但寄生电源方式需要强上拉电路,软件控制变得复杂(特别是在完成温度转换和拷贝数据到E2PROM时),同时芯片的性能也有所降低,电路图如下图。

3.4按键电路4软件流程图软件程序从开始执行,先通过初始化各个寄存器,经过扫描按键来决定是否设定参数来执行相应功能的程序,进而在数码管上显示。

5程序的源代码清单源代码见附录。

6调试运行结果及分析在编写从程序时,程序分为两大部分去编写,分别是:1、led动态显示部分;2、DS18B20与单片机通信部分。

完成第一部分的编写后,通过proteus仿真,检验程序是否正确。

然后查阅相关资料编写通信部分的程序,然后结合led动态显示调试程序。

程序仿真及硬件调试效果如下截图所示。

6.1软件仿真7课程设计总结经过将近三周的单片机课程设计,我终于在参考了众多程序之后完成了我的数字温度计的设计,虽然没有完全达到设计要求,但我们还是高兴的,毕竟这次设计的电路板是我们一手焊出来的。

在本次设计的过程中,我们发现很多的问题,也学到了许多东西。

虽然我以前也做过类似的课程设计,但这次设计真的让我长进了很多。

本次单片机课程设计的重点就在于测温及按键编程软件算法的设计,其中有许多很巧妙的算法。

我以前总是能看懂别人写的程序,但自己单独写时就会出现很多问题,经过这次锻炼我基本掌握了C语言编程的方法并在以前的基础上有所提高。

通过本次课程设计,增长了知识固然重要,但提高了能力更重要。

这次设计是由五个人为一组进行,合理的安排、分配任务,让每个同学都参与进来,都有收获,学会摒弃争吵,做到互不对以后的工作很重要。

从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。

8参考文献1.李春法,单片机原理及接口技术案例教程,机械工业出版社,20032.丁向荣,单片机应用系统与接口技术,电子工业出版社,20013.李朝青,单片机原理及接口技术,北京航空航天大学出版社,20054.马忠梅,单片机的C语言应用程序设计(第4版),清华出版社,20075.彭伟,单片机C语言程序设计实训100例,电子工业出版社,2009附录源代码如下:#include<reg52.h>sbit DQ=P3^7;//定义DS18B20总线I/O#define uint unsigned int#define uchar unsigned char//宏定义sbit SET=P1^0;//定义调整键sbit DEC=P3^2;//定义减少键sbit ADD=P3^3;//定义增加键sbit BEEP=P3^0;//高于上限温度亮sbit BEEA=P3^1;//低于下限温度亮bit shanshuo_st;//闪烁间隔标志bit beep_st;//蜂鸣器间隔标志uchar x=0;//计数器unsigned char m;//整数位温度值全局变量uchar p;//小数位温度值全局变量uchar set_st=0;//状态标志uchar shangxian=30;//上限报警温度,默认值为38uchar xiaxian=5;//下限报警温度,默认值为5uchar code LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};//共阳极不带小数点段码uchar code LEDData1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff};//共阳极带小数点段码void Delay_DS18B20(int num){while(num--);}void Init_DS18B20(void){unsigned char q=0;DQ=1;//DQ复位Delay_DS18B20(8);//稍做延时DQ=0;//单片机将DQ拉低Delay_DS18B20(80);//精确延时,大于480usDQ=1;//拉高总线Delay_DS18B20(8);q=DQ;//稍做延时后,如果q=0则初始化成功,q=1则初始化失Delay_DS18B20(20);DQ=1;}unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat=0;for(i=8;i>0;i--){DQ=0;//给脉冲信号dat>>=1;DQ=1;//给脉冲信号if(DQ)dat|=0x80;Delay_DS18B20(4);}return(dat);}void WriteOneChar(unsigned char dat){unsigned char i=0;for(i=8;i>0;i--){DQ=0;DQ=dat&0x01;Delay_DS18B20(5);DQ=1;dat>>=1;}}unsigned int ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;float tem=0;Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0x44);//启动温度转换Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0xBE);//读取温度寄存器a=ReadOneChar();//读低8位b=ReadOneChar();//读高8位t=b;t<<=8;t=t|a;tem=t*0.0625;t=tem*100;//放大10倍输出并四舍五入return(t);}void Delay(uint num){while(--num);}void InitTimer(void){TMOD=0x01;TH0=0x3c;TL0=0xb0;//50ms(晶振12M)}void timer0(void)interrupt1{TH0=0x3c;TL0=0xb0;x++;}void int0(void)interrupt0{EX0=0;//关外部中断0if(DEC==0&&set_st==1){Delay(2000);do{}while(DEC==0);while(!DEC);shangxian--;if(shangxian<xiaxian)shangxian=xiaxian;}else if(DEC==0&&set_st==2) {Delay(2000);do{}while(DEC==0);while(!DEC);xiaxian--;if(xiaxian<0)xiaxian=0;}}void int1(void)interrupt2{EX1=0;//关外部中断1if(ADD==0&&set_st==1){Delay(2000);do{}while(ADD==0);while(!ADD);shangxian++;if(shangxian>99)shangxian=99;}else if(ADD==0&&set_st==2){Delay(2000);do{}while(ADD==0);while(!ADD);xiaxian++;if(xiaxian>shangxian)xiaxian=shangxian;}}void check_wendu(void){uint a,b,c,d,e;c=ReadTemperature();//获取温度值并减去DS18B20的温漂误差a=c/1000;//计算得到千位数字b=c/100-a*10;//计算得到百位数字m=c/100;//计算得到整数位d=c/10-a*100-b*10;//计算得到十位e=c-a*1000-b*100-d*10;//计算得到个位p=c%100;if(m<0){m=0;p=0;};//设置温度显示下限if(m>99){m=99;p=99;}//设置温度显示上限}Disp_Temperature()//显示温度{P0=0xc6;//CP2=0x08;Delay(300);P2=0x00;P0=LEDData[p/10];//显示十位P2=0x04;Delay(300);P2=0x00;P0=LEDData1[m%10];//显示百位P2=0x02;Delay(300);P2=0x00;P0=LEDData[m/10];//显示千位P2=0x01;Delay(300);P2=0x00;//关闭显示}Disp_alarm(uchar baojing){P2=0x00;P0=0xc6;//CP2=0x08;Delay(200);P2=0x00;P0=LEDData[baojing%10];P2=0x04;Delay(200);P2=0x00;P0=LEDData[baojing/10];P2=0x02;Delay(200);P2=0x00;if(set_st==1)P0=0x89;//上限H标示else if(set_st==2)P0=0xc7;//下限L标示P2=0x01;Delay(200);P2=0x00;//关闭显示}void Alarm(){if(x>=3){beep_st=~beep_st;x=0;}if(m>=shangxian&&beep_st==1)BEEP=1;//beep状态位和警戒温度一起决定高于上限温度else BEEP=0;if((m<xiaxian&&beep_st==1))BEEA=1;//beep状态位和警戒温度一起决定低于下限温度else BEEA=0;}void main(void){uint z;InitTimer();//初始化定时器EA=1;//全局中断开关TR0=1;//开启定时器0ET0=1;//允许定时器0中断BEEP=0;BEEA=0;IT1=0;IT0=0;while(1){if(SET==0){Delay(2000);do{}while(SET==0);while(!SET);set_st++;x=0;shanshuo_st=1;if(set_st>2)set_st=0;//调整键按下退出}switch(set_st){case(0):EX0=0;//关闭外部中断0EX1=0;//关闭外部中断1check_wendu();Disp_Temperature();Delay(2000);Alarm();//报警检测break;case(1):BEEP=0;//关闭蜂鸣器BEEA=0;EX0=1;//开启外部中断0EX1=1;//开启外部中断1if(x>=10){shanshuo_st=~shanshuo_st;x=0;}if(shanshuo_st){Disp_alarm(shangxian);}break;case(2):BEEP=0;//关闭蜂鸣器BEEA=0;EX0=1;//开启外部中断0EX1=1;//开启外部中断1if(x>=10){shanshuo_st=~shanshuo_st;x=0;}if(shanshuo_st){Disp_alarm(xiaxian);}break;}}}。

相关主题