基于STC89C52单片机的数字温度计(附源代码,完美实现)
基于STC89C52单片机的数字温度计

桂林航天工业学院单片机课程设计与制作说明书设计题目数字温度计专业电子信息工程技术学生姓名班级学号指导教师起止日期2012.06.18——2012.06.29单片机技术课程设计答辩记录桂林航天工业学院电子工程系单片机课程设计任务书专业:电子信息工程技术年级:2010基于STC89C52单片机的数字温度计设计摘要:温度是工业生产和自动控制中最常见的工艺参数之一。
过去温度检测系统设计中,大多采用模拟技术进行设计,这样就不可避免地遇到诸如传感器外围电路复杂及抗干扰能力差等问题;而其中任何一环节处理不当,就会造成整个系统性能的下降。
随着半导体技术的高速发展,特别是大规模集成电路设计技术的发展, 数字化、微型化、集成化成为了传感器发展的主要方向。
本文介绍了检测的基本概念,单总线数字温度传感器DS18B20及单片机STC89C52的特性、内部结构及工作原理,给出了DS18B20与单片机STC89C52接口的应用实例,以及由两者组成简单的数字温度计,并给出了对DS18B20进行各种操作的软件流程图及操作程序。
关键词:温度传感器DS18B20 单片机STC89C52 C语言引言随着新技术的不断开发与应用,近年来单片机发展十分迅速,一个以微机应用为主的新技术革命浪潮正在蓬勃兴起,单片机的应用已经渗透到电力、冶金、化工、建材、机械、食品、石油等各个行业。
传统的温度采集方法不仅费时费力,而且精度差,单片机的出现使得温度的采集和数据处理问题能够得到很好的解决。
温度是工业对象中的一个重要的被控参数。
然而所采用的测温元件和测量方法也不相同;产品的工艺不同,控制温度的精度也不相同。
因此对数据采集的精度和采用的控制方法也不相同。
传统的控制方式以不能满足高精度,高速度的控制要求,如温度控制表温度接触器,其主要缺点是温度波动范围大,由于他主要通过控制接触器的通断时间比例来达到改变加热功率的目的,受仪表本身误差和交流接触器的寿命限制,通断频率很低。
基于STC89C52单片机的数字温度计(附源代码,完美实现)

基于STC89C52单片机的数字温度计学院:信息科学与工程学院专业:电子信息科学与技术一、摘要温度的检测是工业生产中比较典型的应用之一,随着传感器在生产和生活中的更加广泛的应用,利用新型数字温度传感器实现对温度的测试与控制得到更快的开发。
本文设计了一种基于STC89C52单片机的温度检测系统,该系统将温度传感器DS18B20接在控制器的端口上,对温度进行采集,将采集到的温度值显示在1602液晶屏上。
经实验测试表明,该系统设计和布线简单,结构紧凑,有可读性高,反应速度快,测量准确,抗干扰能力强,性价比高,扩展方便等优点,具有关阔的应用前景。
关键词:STC89C52 数字温度计 DS18B20二、前言随着人民生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便是不可否定的,其中数字温度计就是一个典型的例子。
单片机控制温度检测系统的温感系统主要是DS18B20芯片,该芯片由一根总线控制,电压范围为3.0v--5.5v。
DS18B20具有测温方便、测温范围广、测温精度高等特点。
出于对此类问题的探索,我们设计并制作了此温度检测系统。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确。
其输出温度采用数字显示,主要用于对测温比较准确的场所,该设计控制器模块主要使用STC89C52单片机,测温传感模块使用DS18B20;显示模块使用1602液晶显示屏,可以只管、准确的显示所测温度值。
三、系统组成及工作原理3.1、总体设计方案经分析,将系统分为两个部分,一个是由温度传感器DS18B20组成的检测部分,另一个是由单片机和1602液晶组成的主控与显示部分。
如图所示DS18B20将检测到的数据送到单片机,单片机对接收到的数据进行处理并送到1602显示,6V电源给各个部分供电。
3.2系统单元的选择与论证3.2.1单片机控制模块的选择与论证方案一:采用XC9000系列的FPGA。
基于89S52单片机的电子体温计

void zhudata(uc d)
{P2_7=1;P0=d;P2=P2&0xdf;_nop_();P2=P2|0xff;}
void zidata(uc d)
{P2_7=1;P0=d;P2=P2&0xbf;_nop_();P2=P2|0xff;}
wen_l=du18b20();
wen_h=du18b20();
}
void main(void)
{
float wendu_xs;
bit fuhao;
uc xsdwz;//小数点位置.
uc tiwencd;//体温程度.
else
fuhao=0;
wendu_xs=((wen_h*256)+wen_l)*0.0625;
if((wendu_xs<35)||(wendu_xs>40)) tiwencd=0;
if((wendu_xs>=35)&&(wendu_xs<36.5)) tiwencd=1;//
else
{B1820=0; for(i=18;i>0;i--); B1820=1;}
shuju=shuju>>1;k--;
}
while(k>0);
}
uc du18b20(void)
{
uc k,i,dushu;
dushu=0;
for(k=0;k<8;k++)
return b1820fw_ok;
}
//写18B20
基于STC89C52单片机的数字温度计_单片机课程设计1 精品

通信***班,*** 基于STC89C52单片机的数字温度计单片机课程设计报告项目名称专业班级学生姓名指导教师年月日通信***班,*** 基于STC89C52单片机的数字温度计摘要随着时代的进步和发展,单片机技术已经普及到我们生活、工作、科研、各个领域,已经成为一种比较成熟的技术, 本文主要介绍了一个基于STC89C52单片机的测温系统,详细描述了利用数字温度传感器DS18B20开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,该系统可以方便的实现实现温度采集和显示,并可根据需要任意设定上下限报警温度,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。
实验结果表明,DS18B20与STC89C52结合可以实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。
关键词:温度检测;单片机;数字温度传感器;温度采集;I通信***班,*** 基于STC89C52单片机的数字温度计AbstractWith the progress and development of this epoch ,Single-chip Microcomputer (SCM ) technology has spread into various fields ---our lives ,work ,scientific researches and so on ,becoming a comparatively mature technology .This article was mainly written to introduce a temperature measurement system(TMS ) based on STC89C52 SCM .It’s with a detailed description of the development progress of TMS using digital temperature sensor ,putting emphasis on analyzing the hardware connection of the sensor under the SCM ,software programming and each module progress .This system can conveniently achieve the temperature data collection and display ,and can be arbitrarily set upper and lower alarm temperature .It’s quite easy to use ,with high accuracy ,wide range ,high sensitivity ,small size ,low power dissipation ,etc .Thus ,it’s suitable for our daily life and industrial and agricultural production’s temperature measurement ,and also can be used as temperature processing modules embedded in other systems ,as an auxiliary expansion of other main systems .Experimental results show that ,the integration of DS18B20 and STC89C52 can achieve the simplest TMS ,which has simple structure ,strong anti-jamming capability ,suitable for conducting in-situ temperature measurement ,all above leading this to have broad prospects of applications .Keywords:T emperature measurement ; Single-chip Microcomputer (SCM ) ; Digital Temperature sensor; Temperature data collectionII通信***班,*** 基于STC89C52单片机的数字温度计目录摘要 (I)Abstract (II)第1章绪论 (1)1.1 背景 (1)1.2 数字温度计的设计目的 (1)1.3 本文研究的意义 (1)第2章系统硬件选择 (2)2.1 单片机的选择 (2)2.1.1 STC89C52单片机的性能介绍 (2)2.1.2 STC89C52单片机引脚图 (2)2.2. 温度传感器的选择 (4)2.2.1 DS18B20 介绍 (4)第3章原理分析 (6)3.1原理框图 (6)3.2原理分析 (6)第4章系统的硬件电路设计 (7)4.1 显示电路 (7)4.2报警电路 (7)4.3 数字温度传感器 (7)4.4单片机最小系统电路 (8)4.5数字温度计的实物图 (8)4.6系统板上硬件连线 (9)第5章系统的软件设计 (10)5.1 程序流程图 (10)5.2元件清单及程序代码 (11)第6章实验数据分析 (14)6.1 proteus仿真图 (14)6.2系统调试与分析 (14)结论 (15)参考文献 (16)附录1 (17)附录2 (18)致谢 (26)项目创新及特色 (27)III通信***班,*** 基于STC89C52单片机的数字温度计第1章绪论1.1 背景在日常生活及工农业生产中,经常要用到温度的检测及控制,传统的测温元件有热电偶和热电阻。
基于stc89c52单片机的温度检测LCD1602显示

#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P3^7;//ds18b20与单片机连接口sbit RS=P3^0;sbit RW=P3^1;sbit EN=P3^2;unsigned char code str1[]={"temperature: "};unsigned char code str2[]={" "};uchar data disdata[5];uint tvalue;//温度值uchar tflag;//温度正负标志/*************************lcd1602程序**************************/ void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}void wr_com(unsigned char com)//写指令//{ delay1ms(1);RS=0;RW=0;EN=0;P2=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据//{ delay1ms(1);;RS=1;RW=0;EN=0;P2=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x08);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void display(unsigned char *p)//显示// {while(*p!='\0'){wr_dat(*p);p++;delay1ms(1);}}init_play()//初始化显示{ lcd_init();wr_com(0x80);display(str1);wr_com(0xc0);display(str2);}/******************************ds1820程序***************************************/ void delay_18B20(unsigned int i)//延时1微秒{while(i--);}void ds1820rst()/*ds1820复位*/{ unsigned char x=0;DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480usDQ = 1; //拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{ 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_18B20(10);}return(dat);}void ds1820wr(uchar wdata)/*写数据*/{unsigned char i=0;for (i=8; i>0; i--){ DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}read_temp()/*读取温度值并转换*/{uchar a,b;ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0x44);//*启动温度转换*/ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0xbe);//*读取温度*/a=ds1820rd();b=ds1820rd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0x0fff)tflag=0;else{tvalue=~tvalue+1;tflag=1;}tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数return(tvalue);}/*******************************************************************/ void ds1820disp()//温度值显示{ uchar flagdat;disdata[0]=tvalue/1000+0x30;//百位数disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30;//个位数disdata[3]=tvalue%10+0x30;//小数位if(tflag==0)flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:-if(disdata[0]==0x30){disdata[0]=0x20;//如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位为0,十位为0也不显示}}wr_com(0xc0);wr_dat(flagdat);//显示符号位wr_com(0xc1);wr_dat(disdata[0]);//显示百位wr_com(0xc2);wr_dat(disdata[1]);//显示十位wr_com(0xc3);wr_dat(disdata[2]);//显示个位wr_com(0xc4);wr_dat(0x2e);//显示小数点wr_com(0xc5);wr_dat(disdata[3]);//显示小数位}/********************主程序***********************************/void main(){ init_play();//初始化显示while(1){read_temp();//读取温度ds1820disp();//显示}}。
基于STC89C52单片机的温度控制电路设计

2.7系统整体硬件电路系统整体硬件电路包括,传感器数据采集电路,温度显示电路,单片机主控电路等,通过Protel99se 可画出如图2-9所示的电路图[9][10][11]图2-9 温度控制电路原理三系统软件设计3.1 温度控制系统原理框图主控制程序的主要是用来实时控制当前所要测控的环境温度,并读出由DS18B20测量的经过处理的当前环境的温度值,同时检查温度是否在限度之内,否则报警,同时调整温度值。
其主控制程序流程图如3-1所示。
图3-1 主程序流程图图3-2读温度流程图温度控制系统C语言程序#include <reg51.h>#define uint unsigned int#define uchar unsigned charsbit p34=P2^4;sbit p35=P2^5;sbit p36=P2^6;sbit dp=P0^7;sbit p37=P2^7;sbit DQ=P2^2; //定义DS18B20总线I/Osbit SET=P3^1; //定义选择报调整警温度上限和下限(1为上限,0为下限)sbit LING=P2^0; //定义闪烁signed char m; //温度值全局变量bit sign=0; //外部中断状态标志signed char shangxian=38; //上限报警温度,默认值为38signed char xiaxian=5; //下限报警温度,默认值为5ucharcode LEDData[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; /*****延时子程序*****/void Delay(uint i){while( i-- );}/*****初始化DS18B20*****/void Init_DS18B20(void){unsigned char x=0;DQ=1;Delay(8); //稍做延时DQ=0; //单片机将DQ拉低Delay(80); //精确延时,大于480usDQ=1; //拉高总线Delay(14);x=DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败Delay(20);}/*****读一个字节*****/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(4);}return(dat);}/*****写一个字节*****/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ=0;DQ=dat&0x01;Delay(5);DQ=1;dat>>=1;}}void Tmpchange(void) //发送温度转换命令{Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0x44); //启动温度转换}/*****读取温度*****/unsigned int ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;Tmpchange();Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器a=ReadOneChar(); //读低8位b=ReadOneChar(); //读高8位t=b;t<<=8;t=t|a;tt=t*0.0625;t= tt*100+0.5; //放大100倍输出并四舍五入return(t);}/*****显示开机初始化等待画面*****/Disp_init(){P0 = 0x80; //显示-p34=1;p35=0;p36=0;p37=0;Delay(200);P0 = 0x80;p34=0;p35=1;p36=0;p37=0;Delay(200);P0 = 0x80;p34=0;p35=0;p36=1;p37=0;Delay(200);P0 = 0x80;p34=0;p35=0;p36=0;p37=1;Delay(200);P0 = 0x80;}/*****显示温度子程序*****/Disp_Temperature() //显示温度{uint a,b,c,d,e;e=ReadTemperature(); //获取温度值a=e/1000; //计算得到十位数字b=e/100-a*10; //计算得到个位数字d=e%10; //计算得到小数点后两位c=(e%100)/10; //计算得到小数点后一位m=e/100;if(m>shangxian || m<xiaxian) LING=1; //温度不在范围内报警else LING=0;p34=0;p35=0;p36=0;p37=0;P0 =LEDData[d]; //显示小数点后两位p34=1;p35=0;p36=0;p37=0;Delay(300);p34=0;p35=0;p36=0;p37=0;P0 =LEDData[c]; //显示小数点后一位p34=0;p35=1;p36=0;p37=0;Delay(300);p34=0;p35=0;p36=0;p37=0;P0 =LEDData[b]; //显示个位dp=0;p34=0;p35=0;p36=1;p37=0;Delay(300);p34=0;p35=0;p36=0;p37=0;P0 =LEDData[a]; //显示十位p34=0;p35=0;p36=0;p37=1;Delay(300);p34=0;p35=0;p36=0;p37=0; //关闭显示}disptiaozheng(){uchar f,g,j,k;f=shangxian/10;g=shangxian%10;j=xiaxian/10;k=xiaxian%10;p34=0;p35=0;p36=0;p37=0;P0 =0xc0; //显示0p34=1;p35=0;p36=0;p37=0;Delay(200);p34=0;p35=0;p36=0;p37=0;P0 =0xc0; //显示0p34=0;p35=1;p36=0;p37=0;Delay(200);p34=0;p35=0;p36=0;p37=0;if(SET==1){P0 =LEDData[g];dp=0; //显示上限温度个位}else{P0 =LEDData[k];dp=0;}p34=0;p35=0;p36=1;p37=0;Delay(200);p34=0;p35=0;p36=0;p37=0;if(SET==1) P0 =LEDData[f]; //显示上限温度十位else{if(f==0) P0=0x00; //不显示下限温度十位else P0 =LEDData[j]; //显示下限温度十位}p34=0;p35=0;p36=0;p37=1;Delay(200);p34=0;p35=0;p36=0;p37=0; //关闭显示Delay(20);}/*****外部中断0服务程序*****/void int0(void) interrupt 0{EX0=0; //关外部中断0 sign=1;if(SET==1) shangxian++;else xiaxian++;Delay(500);EX0=1;}/*****外部中断1服务程序*****/void int1(void) interrupt 2{EX1=0; //关外部中断0 sign=1;if(SET==1) shangxian--;else xiaxian--;Delay(500);EX1=1;}/*****主函数*****/void main(void){uint z;IT0=1;IT1=1;EX0=1;EX1=1;EA=1;ReadTemperature();LING=0;for(z=0;z<100;z++){Disp_init();}while(1){Disp_Temperature();if(sign==1){for(z=0;z<300;z++)disptiaozheng();sign=0;}}}。
单片机+STC89C52++温度传感器

单片机数字温度计摘要:本设计单片机采用AT89C52芯片,数字温度传感器采用美国DALASS公司的1–Wire器件DS18B20,即单总线器件DS18B20,与单片机组成一个测温系统,当系统上电时,温度传感器就会读出当前环境的温度,并在三位LED数模显示管上显示出当前的温度,该测温仪的测温范围为0℃~110℃,按此要求设计硬件和软件以实现这一功能。
关键词:单片机STC89C52 温度传感器DS18B20; 温度测量电子线路单片机汇编语言温度1 引言:单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
概括的讲:一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
同时,学习使用单片机是了解计算机原理与结构的最佳选择。
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
单片机在检测和控制系统中得到广泛的应用, 温度则是系统常需要测量、控制和保持的一个量。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,该设计控制器使用单片机STC89C52,测温传感器使用DS18B20,用4位共阳极LED数码管以串口传送数据,实现温度显示,能准确达到以上要求。
2 总体设计方案:2.1 设计思路:(1)本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。
(2)从中考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
从以上两种方案,很容易看出,采用方案(2),电路比较简单,软件设计也比较简单,故采用了方案(2)。
基于单片机的数字温度计设计(附代码及仿真)

基于STC89C52的数字温度计目录1、方案选择1.1、主控芯片选择 (2)1.2、显示模块 (2)1.3、温度检测模块 (2)2、系统硬件设计2.1、51单片机最小系统设计 (2)2.2、温度检测电路设计 (2)3、系统软件设计3.1、LED显示电路设计 (2)3.2、温度检测电路设计 (2)3.3、仿真界面 (3)4、实训与焊接过程4.1、焊接与调试 (4)4.2、焊接实物图 (4)6、总结 (4)7、附录附录1、原理图 (5)附录2、程序清单………………………………………….5~91、系统方案选择1.1 主控芯片选择STC89C52RC是采用8051核的ISP在线可编程芯片,最高工作时钟频率80MHz,片内含8KB的可反复擦写1000次的Flash只读存储器,器件兼容MCS-51指令系统及8051引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,具有在线可编程特定,配合PC端的控制程序即可将用户的程序代码下载进单片机内部,省去了购买通用编程器,而且速度更快。
STC89C52RC系列单片机是单时钟周期、高速、低功耗的新一代8051单片机。
1.2 时钟及显示模块数码管亮度高,显示大,特别是显示的温度很直观,价格比较便宜。
1.3 温度检测模块DS18B20数字温度传感器是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
它在实际应用中不需要外部任何元器件即可实现测温,测量温度范围在-55到+125摄氏度之间。
2、系统硬件设计2.1 51单片机最小系统设计以STC89C52单片机为核心,选用12M的晶振,这是最常用的选择,外接电容没有特别的要求,但是外接电容的大小会影响振荡器的频率高低、振荡器的稳定性和起振的快速性,因此我们选用30pf的电容作为起振电容。
复位电路为按键低电平复位,当按键按下,RET端为高电平,当高电平持续4us的时间就可以使单片机复位。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于STC89C52单片机的数字温度计学院:信息科学与工程学院专业:电子信息科学与技术一、摘要温度的检测是工业生产中比较典型的应用之一,随着传感器在生产和生活中的更加广泛的应用,利用新型数字温度传感器实现对温度的测试与控制得到更快的开发。
本文设计了一种基于STC89C52单片机的温度检测系统,该系统将温度传感器DS18B20接在控制器的端口上,对温度进行采集,将采集到的温度值显示在1602液晶屏上。
经实验测试表明,该系统设计和布线简单,结构紧凑,有可读性高,反应速度快,测量准确,抗干扰能力强,性价比高,扩展方便等优点,具有关阔的应用前景。
关键词:STC89C52 数字温度计 DS18B20二、前言随着人民生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便是不可否定的,其中数字温度计就是一个典型的例子。
单片机控制温度检测系统的温感系统主要是DS18B20芯片,该芯片由一根总线控制,电压范围为3.0v--5.5v。
DS18B20具有测温方便、测温范围广、测温精度高等特点。
出于对此类问题的探索,我们设计并制作了此温度检测系统。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确。
其输出温度采用数字显示,主要用于对测温比较准确的场所,该设计控制器模块主要使用STC89C52单片机,测温传感模块使用DS18B20;显示模块使用1602液晶显示屏,可以只管、准确的显示所测温度值。
三、系统组成及工作原理3.1、总体设计方案经分析,将系统分为两个部分,一个是由温度传感器DS18B20组成的检测部分,另一个是由单片机和1602液晶组成的主控与显示部分。
如图所示DS18B20将检测到的数据送到单片机,单片机对接收到的数据进行处理并送到1602显示,6V电源给各个部分供电。
3.2系统单元的选择与论证3.2.1单片机控制模块的选择与论证方案一:采用XC9000系列的FPGA。
该类器件具有并行处理能力,能快速的响应外部的各种数字信号,但在数据处理方面过于复杂,而且芯片价格较昂贵。
方案二:采用单片机作为控制核心,单片机数学运算功能较强。
在程序相互调用方面,处理方便灵活,性能稳定,适合实际应用。
且单片机技术发展较为成熟,价格便宜。
基于以上分析,采用单片机控制可更为简便灵活地实现系统功能,故拟采用方案二3.2.2温度检测模块的选择与论证方案一:选用铂电阻作为温度检测模块。
铂电阻温度传感器精度高,稳定性好,应用温度范围广,是中低温区(-200摄氏度到650摄氏度)最常用的一种温度检测器,不仅广泛应用于工业测温,而且被制成各种标准温度计。
方案二:选用DS18B20温度传感器。
DS18B20是一线式数字温度传感器,具有独特的单线式接口方式,测量范围在-55℃~125℃,-10℃~85℃,误差为-\+0.5℃。
最高精度可达0.0625℃。
铂电阻需要配合模数转换电路,后续电路复杂,精度较高,而ds18b20将AD转换继承与内部,无需外部电路,仅需一个端口引脚进行通信,从设计要求的简洁性来看,本方案二更优。
综上所述,虽然方案一精度高,但是方案二外围电路配置更简洁,精度也不差于方案一,故本模块采用方案二。
3.2.3温度显示模块的选择与论证方案一:采用12864液晶模块显示测得的数据,可显示较多组的数据,字体较大,可清晰读数,但12864液晶模块价格昂贵,接线复杂,故不采用。
方案二:采用1602液晶模块显示所测数据,1602液晶接线简单方便,同时也能满足显示需要,价格远低于12864液晶。
方案三:采用LED数码管显示所测数据,LED数码管价格便宜可以降低成本但是由于LED数码管需要锁存电路接线复杂,故部采用。
综上所述故选用方案二。
3.3系统模块组成本系统由单片机主控电路、DS18B20温度检测模块、1602液晶显示模块3部分组成。
四、系统电路设计4.1STC89C52单片机主控制器STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
具有以下标准功能:8k 字节Flash,512字节RAM,32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口。
另外STC89X52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35Mhz,6T/12T可选。
STC89C52引脚图如下所示:STC89C52单片机主控电路原理图如下:单片机主控模块包括了振荡电路、复位电路,同时接入了各个模块的接口,保证了整个系统的灵活性。
单片机是整个系统的控制中枢,它指挥外围器件协调工作,从而完成特定的功能。
硬件实现上采用模块化设计,每一模块只实现一个特定功能,最后再将各个模块搭接在一起。
这种设计方法可以降低系统设计的复杂性。
控制电路的核心器件是由STC公司生产的STC89C52单片机,属于MCS-51系列。
STC89C52是一种低功耗、高性能的CMOS8位微控制器,具有8K在系统可编程Flash存储器,采用的工艺是Atmel公司的高密度非易失存储器技术;片上Flash允许程序存储器在系统可编程,亦适于常规编程器;在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案;价格低廉、性能可靠、抗干扰能力强。
因此广泛应用于工业控制和嵌入式系统中。
4.2 1602温度显示模块1602液晶屏原理图如下所示:在日常生活中,我们对液晶显示器并不陌生。
液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。
在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。
在单片机系统中应用晶液显示器作为输出器件有以下几个优点:显示质量高、数字式接口、体积小、重量轻、功耗低、1602LCD 主要技术参数:显示容量:16×2 个字符芯片工作电压:4.5—5.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.95×4.35(W×H)mm引脚功能说明:1602LCD 采用标准的14脚(无背光)或16脚(带背光)接口,第1 脚:VSS 为地电源。
第2 脚:VDD接5V正电源。
第 3 脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K 的电位器调整对比度。
第4 脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5 脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W 共同为低电平时可以写入指令或者显示地址,当RS 为低电平R/W 为高电平时可以读忙信号,当RS 为高电平R/W为低电平时可以写入数据。
第6 脚:E端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8 位双向数据线。
第15脚:背光源正极。
第16脚:背光源负极。
4.3温度检测模块DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的性能特点如下:●独特的单线接口仅需要一个端口引脚进行通信;●多个DS18B20可以并联在惟一的三线上,实现多点组网功能;●无须外部器件;●可通过数据线供电,电压范围为3.0~5.5V;●零待机功耗;●温度以9或12位数字;●用户可定义报警设置;●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;DS18B20引脚如下图所示:DS18B20接线图如下所示:五、系统软件设计设计中使用德国Keil公司出品的Keil uVision编程软件,它是业内对51系列单片机编程的常用工具。
下载器为STC公司的专用程序下载器,与使用的STC89C52RC单片机兼容。
六、系统测试6.1主要指标测试本系统测量范围为-55.0℃-99.9℃,报警温度值设定范围为0℃-99℃,时间为预设的北京时间,温度误差为0.1℃。
6.2测试结果分析通过测试,与标准仪器所测得的温湿度相比较,可得系统的误差为信号传输过程中可能存在误码,及误判。
七、参考文献1、电子技术基础数字部分(第五版)康华光主编高等教育出版社2、电子技术基础模拟部分(第五版)康华光主编高等教育出版社3、C程序设计教程谭浩强著清华大学出版社4、单片机原理及应用张毅刚主编高等教育出版社5、新概念51单片机C语言教程:入门、提高、开发、拓展全攻略郭天祥编著电子工业出版社附录一、系统图1、系统完整原理图2、1602液晶显示模块原理图2、DS18B20温度检测模块原理图附录二、程序源代码#include<reg52.h>#define uchar unsigned char#define uint unsigned int/*************************液晶接口定义********************************/sbit rs=P1^0; //定义RS口为P10sbit rw=P1^1; //定义RW口为P11sbit e=P1^2; //定义E口为P12sbit DQ=P3^5; //定义温度器接口/*******************************各种变量定义************************/bit flag=0; //温度标示位uint temp=0,temp_l=0,temp_h=0; //定义读取的温度值uchar busy,k=1;uint a=0;uchar table1[]={"temp: 00.0 C **C"};uchar table2[]={"----00:00:00----"};void write_com(uchar);/*******************************1602液晶显示*************************************/void delay(uint z) //液晶延时{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void busy_1602(void) //查询忙碌标志信号程序{do{e=0;rw=1;rs=0;e=1;busy=P0;e=0;delay(1);} while(busy&&0x80==1);}void init(void) //初始化液晶{P1=1;e=0;write_com(0x38);write_com(0x0c);write_com(0x06);}void write_com(uchar com) //写指令{busy_1602();rs=0;rw=0;P0=com;delay(5);e=1;delay(5);e=0;}void write_dat(uchar dat) //写数据{busy_1602();rs=1;rw=0;P0=dat;delay(5);e=1;delay(5);e=0;}void display(void) //液晶显示{uint j,k;init();write_com(0x80);table1[10]=0xdf;for(j=0;j<16;j++){write_dat(table1[j]);}write_com(0x80+0x40);for(k=0;k<16;k++){write_dat(table2[k]);}}/****************************ds18b20程序*******************************/ void delay1(uint y)//ds18b20延时{while(y--);}bit init_ds18b20(void)//初始化ds18b20{bit res;DQ=1;delay1(8);DQ=0;delay1(80);DQ=1;delay1(8);res=DQ;delay1(4);return(res);}void write_ds18b20(uchar c)//写一个字节的指令{uint i;for(i=0;i<8;i++){DQ=0;DQ=c&0x01;delay1(4);DQ=1;c=c>>1;}delay1(4);}uchar read_ds18b20(void) //读一个字节的数据{uchar i;uchar shuj=0;for(i=0;i<8;i++){DQ=1;delay1(1);DQ=0;shuj>>=1;DQ=1;if(DQ)shuj=shuj|0x80;delay1(2);}return shuj;}void get_temp(void) //获取温度{init_ds18b20();write_ds18b20(0xcc);write_ds18b20(0x44);init_ds18b20();write_ds18b20(0xcc);write_ds18b20(0xbe);temp_l=read_ds18b20();temp_h=read_ds18b20();delay1(200);temp=temp_h*256+temp_l;}void judge_temp(void)//判断正负温度{if((temp_h&0x80)==0x80){flag=1;//负温度temp=~temp+1;}elseflag=0;}/******************DS1302:写入操作(上升沿)*********************/ void write_byte(unsigned char da){unsigned char i;ACC=da;for(i=8;i>0;i--){T_IO=ACC0;T_CLK=0;T_CLK=1;ACC=ACC>>1;}}/******************DS1302:读取操作(下降沿)*****************/unsigned char read_byte(void){unsigned char i;for(i=0;i<8;i++){ACC=ACC>>1;T_CLK = 1;T_CLK = 0;//delay(1);ACC7 = T_IO;}return(ACC);}/******************DS1302:写入数据(先送地址,再写数据)***************************/void write_1302(unsigned char addr,unsigned char da){T_RST=0; //停止工作T_CLK=0;T_RST=1; //重新工作write_byte(addr); //写入地址write_byte(da);T_RST=0;T_CLK=1;}/******************DS1302:读取数据(先送地址,再读数据)**************************/unsigned char read_1302(unsigned char addr){unsigned char temp;T_RST=0; //停止工作T_CLK=0;T_RST=1; //重新工作write_byte(addr); //写入地址temp=read_byte();T_RST=0;T_CLK=1; //停止工作return(temp);}void main(void){float tem=0;uchar slum=0,num=0,flag2=0;uchar clk_time[3]={0x00,0x00,0x00}; //秒,分,时寄存器初始值uchar temp11=0x80;uchar i;while(1){get_temp();judge_temp();tem=temp*0.0625; //温度值temp=tem*10+0.5;if(flag){table1[5]='-';}table1[6]=temp/100+0x30;table1[7]=(temp-100*(temp/100))/10+0x30;table1[9]=(temp-100*(temp/100))%10+0x30;temp11=0x81;for(i=0;i<3;i++){clk_time[i]=read_1302(temp11); //实现每秒读时间temp11+=2;}table2[4]=clk_time[2]/16%16+0x30;table2[5]=clk_time[2]%16+0x30;table2[7]=clk_time[1]/16%16+0x30;table2[8]=clk_time[1]%16+0x30;table2[10]=clk_time[0]/16%16+0x30;table2[11]=clk_time[0]%16+0x30;/**************按键*************/if(function==0){delay(10);if(function==0){while(!function);slum++;}}if(slum==1){flag2=0;beep=1;if(add==0){delay(10);if(add==0){while(!add);num++;if(num==100)num=99;}}if(red==0){delay(10);if(red==0){while(!red);num--;if(num==-1)num=0;}}table1[13]=num/10+0x30; table1[14]=num%10+0x30; }if(slum==2){slum=0;table1[13]='*';table1[14]='*';flag2=0;beep=1;write_com(0x0c);}if(confirm==0){delay(10);if(confirm==0){while(!confirm);flag2=1;slum=0;table1[13]=num/10+0x30;table1[14]=num%10+0x30;}}if(flag2){ if(tem>num)beep=0;if(tem<=num)beep=1;}display();}}。