第一章、总体方案设计 (4)第二章、系统硬件选择 (5)1、单片机的选择 (5)2、温度传感器的选择 (6)第三章、硬件电路设计 (8)1.温度检测电路 (8)2.显示电路 (9)第四章、系统软件设计 (12)1.概述 (12)2.主程序流程图 (12)设计体会 (13)参考文献 (14)附录:C语言程序 (15)硬件实物图 (22)当今,单片机技术已经普及到我们生活、工作、科研、各个领域,已经成为一种比较成熟的技术, 本文主要介绍了一个基于89C51单片机的测温系统,详细描述了利用数字温度传感器DS18B20开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,对各部分的电路也一一进行了介绍,该系统可以方便的实现实现温度采集和显示,并可根据需要任意设定上下限报警温度,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。
DS18B20与AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。
第一章总体方案设计采用数字温度芯片DS18B20 测量温度,输出信号全数字化。
便于单片机处理及控制,省去传统的测温方法的很多外围电路。
且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线形较好。
在0—100 摄氏度时,最大线形偏差小于1 摄氏度。
DS18B20 的最大特点之一采用了单总线的数据传输,由数字温度计DS18B20和微控制器AT89C51构成的温度测量装置,它直接输出温度的数字信号,可直接与计算机连接。
这样,测温系统的结构就比较简单,体积也不大。
采用51 单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便。
既可以单独对多DS18B20 控制工作,还可以与PC 机通信上传数据,另外AT89S51 在工业控制上也有着广泛的应用,编程技术及外围功能电路的配合使用都很成熟。
该系统利用AT89C51芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度。
该系统扩展性非常强,它可以在设计中加入时钟芯片DS1302以获取时间数据,在数据处理同时显示时间,并可以利用AT24C16芯片作为存储器件,以此来对某些时间点的温度数据进行存储,利用键盘来进行调时和温度查询,获得的数据可以通过MAX232芯片与计算机的RS232接口进行串口通信,方便的采集和整理时间温度数据。
第二章系统硬件选择2.1、单片机的选择对于单片机的选择,可以考虑使用8031与8051系列,由于8031没有内部RAM,系统又需要大量内存存储数据,因而不适用。
AT89C51 是美国 ATMEL 公司生产的低功耗,高性能 CMOS8 位单片机,片内含 4kbytes 的可编程的 Flash 只读程序存储器,兼容标准 8051 指令系统及引脚。
它集 Flash 程序存储器既可在线编程(ISP),也可用传统方法进行编程,所以低价位 AT89C51单片机可为提供许多高性价比的应用场合,可灵活应用于各种控制领域,对于简单的测温系统已经足够。
单片机AT89C51 具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。
主要特性如下图-1所示:●与MCS-51 兼容●4K字节可编程闪烁存储器●寿命:1000写/擦循环●数据保留时间:10年●全静态工作:0Hz-24Hz●三级程序存储器锁定●128*8位内部RAM●32可编程I/O线●两个16位定时器/计数器●5个中断源●可编程串行通道●低功耗的闲置和掉电模式●片内振荡器和时钟电路2.2、温度传感器的选择2.2.1. DS18B20 简单介绍:DALLAS 最新单线数字温度传感器DS18B20是一种新型的“一线器件”,其体积更小、更适用于多种场合、且适用电压更宽、更经济。
DALLAS 半导体公司的数字化温度传感器DS18B20是世界上第一片支持“一线总线”接口的温度传感器。
温度测量范围为-55~+125 摄氏度,可编程为9位~12 位转换精度,测温分辨率可达0.0625摄氏度,分辨率设定参数以及用户设定的报警温度存储在EEPROM 中,掉电后依然保存。
被测温度用符号扩展的16位数字量方式串行输出;其工作电源既可以在远端引入,也可以采用寄生电源方式产生;多个DS18B20可以并联到3 根或2 根线上,CPU只需一根端口线就能与诸多DS18B20 通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20的管脚排列、各种封装形式如图4.2 所示,DQ 为数据输入/输出引脚。
开漏单总线接口引脚。
当被用着在寄生电源下,也可以向器件提供电源;GND为地信号;VDD为可选择的VDD引脚。
当工作于寄生电源时,此引脚必须接地。
其电路图 4.3所示.。
图 4.2 外部封装形式图4.3 传感器电路图第三章.硬件电路设计本设计由DS18B20温度传感器芯片测量当前的温度并将转换后的结果送入单片机。
然后通过A89C51单片机驱动两位共阳极8段LED 数码管显示测量温度值。
如附录中本设计硬件电路图所示,本电路主要有DS18B20温度传感器芯片,两位共阳极数码管,AT89C51单片机及相应外围电路组成。
其中DS18B20采用“一线制”与单片机相连。
3.1、温度检测电路DS18B20 最大的特点是单总线数据传输方式,DS18B20 的数据I/O 均由同一条线来完成。
DS18B20 的电源供电方式有 2 种: 外部供电方式和寄生电源方式。
工作于寄生电源方式时, VDD 和GND 均接地, 他在需要远程温度探测和空间受限的场合特别有用, 原理是当1 W ire 总线的信号线DQ 为高电平时, 窃取信号能量给DS18B20 供电, 同时一部分能量给内部电容充电, 当DQ 为低电平时释放能量为DS18B20 供电。
但寄生电源方式需要强上拉电路, 软件控制变得复杂(特别是在完成温度转换和拷贝数据到E2PROM 时) , 同时芯片的性能也有所降低。
外部电源供电方式是DS18B20最佳的工作方式,工作稳定可靠,抗干扰能力强,而且电路也比较简单,可以开发出稳定可靠的多点温度监控系统。
因此本设计采用外部供电方式。
如下图所示:温度传感器DS18B20的测量范围为-55℃~+125℃,在-10℃~+85℃时精度为±0.5℃。
因为本设计只用于测量环境温度,所以只显示0℃~+85℃。
DS18B204.7K+5VJDL162A3.2、显示电路液晶显示屏具有微功耗、体积小、显示内容丰富、超薄轻巧等诸多优点。
在袖珍式仪表和低功耗应用系统中,LCD 得到越来越广泛的应用。
字符型液晶显示屏,是一种用5*7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2行16个字、2行20个字等,本设计以常用的2行16个字的JDL162A 液晶模块作为数据显示模块。
JDL162A 采用标准的16脚接口,其中:第1脚:VSS 接地第2脚:VDD 接5V 正电源。
第3脚:为液晶显示器对比度调整端,接电源时对比度最弱,接地时对比度生“鬼影”,个10K 欧姆比度。
第4脚:为寄存器选择,高电平时选择数据寄存低电平时选择指令寄存器。
第5脚:为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW 共同为低电平时,可以写入指令或者显示地址,当RS 为低电平RW 为高电平时,可以读忙信号,当RS 为高电平RW 为低电平时可以写入数据。
第6脚:E 端为使能端,当E 端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15~16脚:空脚JDL162A 与单片机的I/O 口电路连接如图4-9所示:本设计采用数码管动态显示,电路如下图所示:显示部分电路图-6图中由单片机P174HC245驱动两位共阳极数码管,上拉电阻排为10K。
由P2.0和P2.1通过PNP型三极管Q1,Q2驱动其字位。
三极管发射极接高电平,当P2.0或P2.1为低电平时使三极管导通选通数码管的某一位。
第四章、系统软件设计4.1、概述整个系统的功能是由硬件电路配合软件来实现的,当硬件基本定型后,软件的功能也就基本定下来了。
从软件的功能不同可分为两大类:一是监控软件(主程序),它是整个控制系统的核心,专门用来协调各执行模块和操作者的关系。
二是执行软件(子程序),它是用来完成各种实质性的功能如测量、计算、显示、通讯等。
每一个执行软件也就是一个小的功能执行模块。
这里将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义。
各执行模块规划好后,就可以规划监控程序了。
首先要根据系统的总体功能选择一种最合适的监控程序结构,然后根据实时性的要求,合理地安排监控软件和各执行模块之间地调度关系。
4.2.总程序流程图设计体会温度传感器DS18B20外形像一个小三极管,硬件连接非常简单,应用非常方便。
它不仅能测量温度,而且也是一个ADC转换器,它能将测得的温度信号直接转换成数字信号输入到单片机。
硬件开销较小,相对需要复杂的软件进行补偿,DS18B20软件编程比较复杂,但是可以把复位、读和写3个基本操作的子程序看成是3个固定的基本模块。
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。
参考文献[1]孙育才.《单片微型计算机及其应用》.东南大学出版社.2004[2]沈德金陈粤初.《单片机接口电路与应用程序实例》.北京航天航空大学出版[3]张齐,朱宁西. 单片机应用系统设计技术 .北京:电子工业出版社[4]DS18B20中文资料[5]百度网站 附录:C语言程序:#include<reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar teH = 35,teL = 20;sbit DQ=P3^7;//ds18b20与单片机连接口sbit RS=P2^5;sbit RW=P2^6;sbit EN=P2^7;sbit SET=P1^0;sbit ADD=P1^1;sbit SUB=P1^2;sbit BEEP = P3^2;sbit L = P3^3;sbit H = P3^4;uchar s1num = 0, s2num = 0;uchar dis3[]={"0123456789 "};uchar val_sp[5]={0};uchar fre_sp[5]={0};uchar code str1[]={"Tem: "};uchar code str2[]={"studentN0: "};uchar code str3[]={"11314230"};uchar code str4[]={"teH:35"};uchar code str5[]={"teL:20"};uchar data disdata[5];uchar data str6[2];uchar p=0;uint tvalue;//温度值uchar tflag;//温度正负标志//*************************lcd1602程序**************************/ void delay1ms(uint ms)//延时1毫秒{uint i,j;for(i=0;i<ms;i++)for(j=0;j<114;j++);}void wr_com(uchar com)//写指令//{//delay1ms(1);RS=0;RW=0;EN=0;P0=com;//delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(uchar dat)//写数据// {//delay1ms(1);RS=1;RW=0;EN=0;P0=dat;//delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置// {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(uchar *p)//显示// {while(*p!='\0'){wr_dat(*p);p++;delay1ms(1);}}void init_play()//初始化显示{lcd_init();wr_com(0x80);display(str2);wr_com(0xc0);display(str3);delay1ms(2000);lcd_init();wr_com(0x80);display(str1);wr_com(0xc0);display(str4);wr_com(0xc0+8);display(str5);}/***************************ds18b20程序****************************/ void delay_18B20(uint i)//延时1微秒{while(i--);}void ds1820rst()/*ds1820复位*/{DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480usDQ = 1; //拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{uchar i=0;uchar 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)/*写数据*/{uchar i=0;for (i=8; i>0; i--){DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}read_temp()/*读取温度值并转换*/{uint 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<0x08ff)tflag=0;else{tvalue=~tvalue+1;tflag=1;}tvalue=tvalue*(0.0625)*10;//温度值扩大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(0x80+4);wr_dat(flagdat);//显示符号位wr_com(0x81+4);wr_dat(disdata[0]);//显示百位wr_com(0x82+4);wr_dat(disdata[1]);//显示十位wr_com(0x83+4);wr_dat(disdata[2]);//显示个位wr_com(0x84+4);wr_dat(0x2e);//显示小数点wr_com(0x85+4);wr_dat(disdata[3]);//显示小数位wr_com(0x86+4);wr_dat(0x43);}void zeroff(uchar *p) //灭0处理{ uchar i;for(i=0;i<5;i++){ if(*p==0){*p=10;p++;}else break;}}void teL_dis(uint value){ uchar i;val_sp[0] = value/10;val_sp[1] = value%10;wr_com(0xc0+12);zeroff(val_sp);for(i=0;i<2;i++){wr_dat(dis3[val_sp[i]]);}}void teH_dis(uint fre){ uchar i;fre_sp[0] = fre/10;fre_sp[1] = fre%10;wr_com(0xc0+4);zeroff(fre_sp);for(i=0;i<2;i++){wr_dat(dis3[fre_sp[i]]);}}void settings(void) //设置{ s1num++;if(s1num == 1){teH_dis(teH);wr_com(0xc0+13);//lcd_pos(1,14);wr_dat(0x0f);//write_com(0x0f); //cmd }else if(s1num == 2){teL_dis(teL);wr_com(0xc0+5); //lcd_pos(1,6);wr_dat(0x0f);}else{s1num = 0;teL_dis(teL);teH_dis(teH);} }void add(void) //加{if(s1num == 1){teL++;if(teL == 36) teL = 0;teL_dis(teL);}if(s1num == 2){teH++;if(teH == 51) teH = 10;teH_dis(teH);} }void minus(void) //减{if(s1num == 1){teL--;if(teL == -1)teL = 35;teL_dis(teL);}if(s1num == 2){teH--;if(teH == 9) teH = 50;teH_dis(teH);} }//*************************报警程序**************************/ void baojing(void){ if(((read_temp()/10)>teH)||((read_temp()/10)<teL)) BEEP=0;else BEEP=1;}void baojing2(){if((read_temp()/10)<teL)L = 0;else L=1;if((read_temp()/10)>teH)H = 0;else H=1;}void keyscan(){if(!SET) { delay1ms(30);if(!SET) settings();}if(!ADD) { delay1ms(30);if(!ADD) add();}if(!SUB) { delay1ms(30);if(!SUB) minus();}}//********************主程序***********************************// void main(){//BEEP=0;init_play();//初始化显示while(1){ read_temp();//读取温度ds1820disp();//显示keyscan();baojing() ;baojing2();//}delay1ms(150);}}21硬件实物图:。