基于单片机的数字温度控制系统设计_第1页
基于单片机的数字温度控制系统设计_第2页
基于单片机的数字温度控制系统设计_第3页
基于单片机的数字温度控制系统设计_第4页
基于单片机的数字温度控制系统设计_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

./创新项目报告项目名称:基于单片机的数字温度控制系统设计专业:电子信息工程技术班级:电信141指导老师:乔志勇姓名:卢德寅地点:教学楼时间:2015年12月成绩评定二〇一六年一月十日摘要随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同种类的传感器,可实现诸如电压、湿度、温度、速度、硬度、压力等的物理量的测量。本文将介绍一种基于单片机控制理论及其应用系统设计的数字温度计。本文主要介绍了一个基于AT89C51单片机的测温系统,详细描述了利用数字温度传感器DS18B20开发测温系统的过程,重点对传感器在单片机喜爱的硬件连接,软件编程以及各模块系统流程进行了详尽分析,对各部分的电路也进行一一介绍,该系统可以方便的是实现温度采集和显示,并可以根据需要任意设定上下限报警温度,它使用起来方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合我们日常生活和工农业生产中的温度测量,也可以当做温度处理模块嵌入其他系统中,作为其他主系统的辅助扩展。DS18B20和AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合与恶劣环境下进行现场温度测量,有广泛的应用前景。本设计首先是确定目标,气候是各个功能模块的设计,再在Proteus软件上进行仿真,修改,仿真。本温度计属于多功能温度计,可以设置上下报警温度,当温度不在设置范围内时,可以报警,同时根据设定的温度范围通过升降温电路控制环境的温度达到恒温效果。[关键词]单片机,数字控制,温度计,DS18B20,STC89C52RC目录第1章绪论11研究意义及背景12设计目的13主要工作1第2章系统概述21系统方案22系统组成2第3章系统硬件设计31AT89S52单片机的介绍32显示电路43DS18B20介绍63.1温度传感器测温原理74系统工作原理75系统整体电路8第4章系统软件设计91主程序设计92DS18B20初始化103DS18B20温度传感器与单片机的接口电路124数码管显示与单片机对接145仿真结果166总程序19第五章实物图30总结31.第1章绪论1研究意义及背景随着新技术的不断开发与应用,近年来单片机发展十分迅速,一个以微机应用为主的新技术革命浪潮正在蓬勃兴起,单片机的应用已经渗透到电力、冶金、化工、建材、机械、食品、石油等各个行业。传统的温度采集方法不仅费时费力,而且精度差,单片机的出现使得温度的采集和数据处理问题能够得到很好的解决。本设计使用单片机作为核心进行控制。单片机具有集成度高,通用性好,功能强,特别是体积小,重量轻,耗能低,可靠性高,抗干扰能力强和使用方便等独特优点,在数字化、智能化方面有广泛的用途。2设计目的1.温度显示基本范围10℃—30℃。2.精度误差小于0.01℃3.所测温度值由LCD1602液晶显示屏显示。4.可以设定温度的上下限控制及报警功能。3主要工作本设计的研究重点是设计一种基于单片机的数字温度计控制系统。设计采用数字温度传感器DS18B20,此传感器读取被测量温度值,并进行转换。将转换后的数据送到单片机处理,再通过LCD1602液晶显示屏显示出来。第2章系统概述1系统方案数字温度传感器DS18B20输出信号全数字化,便于单片机处理及控制,省去传统测温方法的很多外围电路。且该芯片的物理性、化学性很稳定,能用做工业测温元件。采用51单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,硬件实现简单,体积小,安装方便。所以该系统利用AT89C51芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可根据需要设定上下限控制及报警温度。2系统组成本设计是以AT89S52单片机为核心的一种数字温度显示控制系统,系统整体硬件电路包括:采集模块、显示模块、设置模块和单片机最小系统模块四大模块组成。系统框图如图2-1所示。单片机最小系统单片机最小系统显示模块显示模块设置模块设置模块报警/控制模块报警/控制模块采集模块采集模块图2-1系统基本方框图第3章系统硬件设计1AT89S52单片机的介绍AT89S52有40个引脚,4个8位并行I/O口,1个全双工异步串行口,同时内含5个中断源,2个优先级,2个16位定时/计数器。AT89S52的存储器系统由4K的程序存储器<掩膜ROM>,和128B的数据存储器<RAM>组成,具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计,使用系统可用USB供电。AT89S52单片机的基本组成框图见图3-1。图3-1AT89S52单片机结构由图3-1可见,AT89S52单片机主要由以下几部分组成:CPU系统8位CPU,含布尔处理器;时钟电路;总线控制逻辑。存储器系统4K字节的程序存储器〔ROM/EPROM/Flash,可外扩至64KB;128字节的数据存储器〔RAM,可再外扩64KB;特殊功能寄存器SFR。I/O口和其他功能单元4个并行I/O口;2个16位定时计数器;1个全双工异步串行口;中断系统〔5个中断源,2个优先级。2显示电路1602液晶简介LCD1602分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的 比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如图3-2所示。图3-2LCD1602规格引脚功能LCD1602采用标准的14脚〔无背光或16脚〔带背光接口,各引脚接口说明如表3.1所示。表3.1LCD1602引脚说明编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极指令说明LCD1602液晶模块内部的控制器共有11条控制指令,如表3.2所示。表3.2LCD1602内部控制器序号指令RSR/WD7D6D5D4D3D2D1D01清显示00000000012光标返回000000001*3置输入模式00000001I/DS4显示开/关控制0000001DCB5光标或字符移位000001S/CR/L**6置功能00001DLNF**7置字符发生存贮器地址0001字符发生存贮器地址8置数据存贮器地址001显示数据存贮器地址9读忙标志或地址01BF计数器地址10写数到CGRAM或DDRAM10要写的数据内容11从CGRAM或DDRAM读数11读出的数据内容3DS18B20介绍DS18B20引脚如图3-3所示。图3-3DS18B20引脚图数字温度传感器DS18B20是一种新型的"一线器件",采用单总线的数据传输,其体积小,输出信号全数字化,便于单片机处理及控制,在0—100摄氏度时,其最大线形偏差小于1摄氏度。工作电源既可以在远端引入,也可以采用寄生电源方式产生。多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。因此用它来组成一个测温系统,线路十分简单。3.1温度传感器测温原理低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。其内部结构图如图3-4所示。图3-4DS18B20内部结构4系统工作原理温度传感器DS18B20将模拟温度值经过DS18B20处理后转换为数字值,然后送到单片机中进行数据处理,单片机将处理后的数据通过LCD1602显示屏显示出来,同时判断测得的温度和设置控制及报警的温度限进行比较,超过限度则通过蜂鸣器发出报警声音。5系统整体电路图3-5系统电路第4章系统软件设计1主程序设计整个系统的功能是由硬件电路配合软件来实现的,当硬件基本定型后,软件的功能也就基本定下来了。从软件的功能不同可分为两大类:一是监控软件〔主程序,它是整个控制系统的核心,专门用来协调各执行模块和操作者的关系。二是执行软件〔子程序,它是用来完成各种实质性的功能如测量、计算、显示、通讯等。每一个执行软件也就是一个小的功能执行模块。这里将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义。主程序流程见图4-1。开始开始AT89S52AT89S52初始化DS18B20初始化LCD1602初始化温度是否到达设定温度是否到达设定限度YY启动控制以及报警启动控制以及报警NN温度温度在显示范围内Y温度显示Y温度显示N结束N结束图4-1主程序流程图主程序如下:voidmain<void>{ unsignedchari=0; P2=0xef;P1=0x00;BEEP=1; LCD_Initial<>; //LCD初始化Read_Temperature<>;//读取温度值 writestring<1,0,"DS18B20Alarmer">; //显示"DS18B20Alarmer" delayms<1000>; //延时1S writestring<0,0,"CurrentT=">; //显示"CurrentT=" writestring<0,1,"Low=10Top=30">; //显示"Low=10Top=30" NG=0; while<1> { Read_Temperature<>; // //读取温度值 Display_Temperature<>; //显示温度值SetFun<>; Alarm<>; } }2DS18B20初始化DS18B20初始化流程图见图4-2。图4-2DS18B20初始化流程图初始化子程序:voidds1820rst<void>/*ds1820复位*/{unsignedcharx=0;DQ=1;//DQ复位delay_18B20<4>;//延时DQ=0;//DQ拉低delay_18B20<100>;//精确延时大于480usDQ=1;//拉高delay_18B20<40>;}3DS18B20温度传感器与单片机的接口电路当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。传感器与单片机接口如图4-3所示:图4-3DS18B20与单片机的接口电路uchards1820rd<void>/*读数据*/{ unsignedchari=0; unsignedchardat=0; for<i=8;i>0;i--> {DQ=0;//给脉冲信号 dat>>=1; DQ=1;//给脉冲信号 if<DQ>dat|=0x80; delay_18B20<10>; }return<dat>;}voidds1820wr<ucharwdata>/*写数据*/{ unsignedchari=0;for<i=8;i>0;i-->{ DQ=0; DQ=wdata&0x01; delay_18B20<10>; DQ=1; wdata>>=1;}}unsignedintRead_Temperature<void>/*读取温度值并转换*/{ uchara,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位小数 CurrentT=tvalue; return<tvalue>;}4数码管显示与单片机对接如图4-4所示。用AT89S5的P0口作为数据端口,P2.5-P2.7为液晶显示使能控制端。P0口接上上拉电阻,拉高信号使液晶显示。图4-4LCD1602显示屏与AT89S52对接LCD1602显示程序:voidDisplay_Temperature<> //显示温度{ ucharflagdat;disdata[0]=tvalue/1000+0x30;//百位数disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30;//个位数disdata[3]=tvalue%10+0x30;//小数位disdata[4]=tvalue%1+0x30;if<tflag==0>flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:- if<tflag==1> { writeChar<10,0,flagdat>;//wr_com<0x8a>;wr_dat<flagdat>;//显示符号位 writeChar<11,0,disdata[0]>;//wr_com<0x8b>;wr_dat<disdata[0]>;//显示百位 writeChar<12,0,disdata[1]>;//wr_com<0x8c>;wr_dat<disdata[1]>;//显示十位 writeChar<13,0,disdata[2]>;//wr_com<0x8d>;wr_dat<disdata[2]>;//显示个位 writeChar<14,0,0X2E>;//wr_com<0x8e>;wr_dat<0x2e>;//显示小数点 writeChar<15,0,disdata[3]>;//wr_com<0x8f>; wr_dat<disdata[3]>;//显示小数位 writeChar<16,0,disdata[4]>; } else { writeChar<10,0,disdata[0]>;//wr_com<0x8a>;wr_dat<disdata[0]>;//显示百位 writeChar<11,0,disdata[1]>;//wr_com<0x8b>;wr_dat<disdata[1]>;//显示十位 writeChar<12,0,disdata[2]>;//wr_com<0x8c>;wr_dat<disdata[2]>;//显示个位 writeChar<13,0,0X2e>;//wr_com<0x8d>;wr_dat<0x2e>;//显示小数点 writeChar<14,0,disdata[3]>;//wr_com<0x8e>;wr_dat<disdata[3]>;//显示小数位 writeChar<15,0,disdata[4]>; }}5仿真结果设置温度上限为38度,温度下限为8度。1.如图4-5所示。此时温度为6度,低于下限温度,蜂鸣器实现报警,加温器指示灯D3亮,表示加温器工作。图4-5仿真图12.如图4-6所示。此时温度为31度,超过上限温度,蜂鸣器实现报警,降温器指示灯D2亮,表示降温器工作。图4-6仿真图23.如图4-7所示。此时温度为26度,在所设范围内,蜂鸣器没有报警,说明温度正常。图4-7仿真图36总程序#include<reg52.h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedcharsbitDQ=P2^3;//ds18b20与单片机连接口sbitRS=P2^5;sbitRW=P2^6;sbitEN=P2^7;sbitLED1=P3^6;sbitLED2=P3^7;uchardatadisdata[5];uinttvalue,CurrentT=0;//温度值uchartflag;//温度正负标志#defineLCD_BUSP0sbitSetKey=P2^2;sbitUpKey=P2^1;sbitDnKey=P2^0;sbitBEEP=P2^4;unsignedcharAlarmTempLow=10,AlarmTempTop=30,Set=0,NG=0;voiddelayms<uintms> //延时xx毫秒{ uchari; while<ms--> { for<i=0;i<120;i++>; }}voidcommand<uintcom> //LCD写指令{RS=0; //RS为0LCD_BUS=com; //装载指令delayms<5>; //延时5msEN=1; //LCD使能delayms<5>; //延时5msEN=0; //LCD不使能}voidwrite_dat<uchardat> //LCD写数据{RS=1; //RS为1LCD_BUS=dat; //装载数据delayms<5>; //延时5msEN=1; //LCD使能delayms<5>; //延时5msEN=0; //LCD不使能}voidwritestring<ucharx,uchary,uchar*s>//LCD写字符串{ if<y==0>command<0x80+x>;//表示第一行 else command<0xC0+x>;//表示第二行 while<*s> //判断是否字符串的结尾 {write_dat<*s>;//显示当前字符 s++; //字符串地址加1 }}voidwriteChar<ucharx,uchary,uchars>//LCD写字符串{ if<y==0>command<0x80+x>;//表示第一行 else command<0xC0+x>;//表示第二行 {write_dat<s>;//显示当前字符 }}voidLCD_Initial<> //LCD初始化{EN=0; //LCD不使能RW=0; //RW为0command<0x38>; //发送初始化指令command<0x0c>; //发送初始化指令command<0x06>; //发送初始化指令command<0x01>; //发送初始化指令command<0x80+0x02>; //发送LCD初始位置}/*************************DS1820程序****************************/voiddelay_18B20<unsignedinti>//延时1微秒{while<i-->;}voidds1820rst<void>/*ds1820复位*/{ unsignedcharx=0; DQ=1;//DQ复位 delay_18B20<4>;//延时 DQ=0;//DQ拉低 delay_18B20<100>;//精确延时大于480us DQ=1;//拉高 delay_18B20<40>;}uchards1820rd<void>/*读数据*/{ unsignedchari=0; unsignedchardat=0; for<i=8;i>0;i--> { DQ=0;//给脉冲信号 dat>>=1; DQ=1;//给脉冲信号 if<DQ> dat|=0x80; delay_18B20<10>; }return<dat>;}voidds1820wr<ucharwdata>/*写数据*/{ unsignedchari=0;for<i=8;i>0;i-->{ DQ=0; DQ=wdata&0x01; delay_18B20<10>; DQ=1; wdata>>=1;}}unsignedintRead_Temperature<void>/*读取温度值并转换*/{ uchara,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位小数 CurrentT=tvalue; return<tvalue>;}voidDisplay_Temperature<> //显示温度{ ucharflagdat;disdata[0]=tvalue/1000+0x30;//百位数disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30;//个位数disdata[3]=tvalue%10+0x30;//小数位disdata[4]=tvalue%1+0x30;if<tflag==0>flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:- if<tflag==1> { writeChar<10,0,flagdat>;//wr_com<0x8a>;wr_dat<flagdat>;//显示符号位 writeChar<11,0,disdata[0]>;//wr_com<0x8b>;wr_dat<disdata[0]>;//显示百位 writeChar<12,0,disdata[1]>;//wr_com<0x8c>;wr_dat<disdata[1]>;//显示十位 writeChar<13,0,disdata[2]>;//wr_com<0x8d>;wr_dat<disdata[2]>;//显示个位 writeChar<14,0,0X2E>;//wr_com<0x8e>;wr_dat<0x2e>;//显示小数点 writeChar<15,0,disdata[3]>;//wr_com<0x8f>; wr_dat<disdata[3]>;//显示小数位 writeChar<16,0,disdata[4]>; } else { writeChar<10,0,disdata[0]>;//wr_com<0x8a>;wr_dat<disdata[0]>;//显示百位 writeChar<11,0,disdata[1]>;//wr_com<0x8b>;wr_dat<disdata[1]>;//显示十位 writeChar<12,0,disdata[2]>;//wr_com<0x8c>;wr_dat<disdata[2]>;//显示个位 writeChar<13,0,0X2e>;//wr_com<0x8d>;wr_dat<0x2e>;//显示小数点 writeChar<14,0,disdata[3]>;//wr_com<0x8e>;wr_dat<disdata[3]>;//显示小数位 writeChar<15,0,disdata[4]>; }}voidSetFun<void>{ unsignedchari1=0,i2=0,i3=0,i4=0,i5=0,i6=0; if<SetKey==0> { delayms<20>; if<SetKey==0> { if<Set<2> Set++; elseSet=0; } switch<Set> { case0:writestring<0,1,"">;writestring<8,1,"">;break; case1: writestring<0,1,">">;writestring<8,1,"">;break; case2: writestring<0,1,"">;writestring<8,1,">">;break; } while<SetKey==0>; } if<<UpKey==0>&&<Set!=0>> { delayms<20>; if<UpKey==0> { switch<Set> { case1: if<AlarmTempLow<99>AlarmTempLow++;elseAlarmTempLow=99;break; case2: if<AlarmTempTop<99>AlarmTempTop++;elseAlarmTempTop=99;break; } i1=AlarmTempLow/100; //获得温度值的百位 i2=AlarmTempLow%100/10; //获得温度值的十位 i3=AlarmTempLow%10; //获得温度值的个位 i4=AlarmTempTop/100; //获得温度值的百位 i5=AlarmTempTop%100/10; //获得温度值的十位 i6=AlarmTempTop%10; //获得温度值的个位 writestring<5,1,"">; writestring<13,1,"">; if<i1!=0> writeChar<5,1,i1+'0'>; if<<i1==0>&&<i2!=0>>writeChar<5,1,i2+'0'>; if<i1!=0>writeChar<6,1,i2+'0'>; if<<i1==0>&&<i2==0>> writeChar<5,1,i3+'0'>; elseif<<i1==0>&&<i2!=0>> writeChar<6,1,i3+'0'>; if<<i1!=0>> writeChar<7,1,i3+'0'>; if<i4!=0> writeChar<13,1,i4+'0'>; if<<i4==0>&&<i5!=0>>writeChar<13,1,i5+'0'>; if<i4!=0>writeChar<14,1,i5+'0'>; if<<i4==0>&&<i5==0>> writeChar<13,1,i6+'0'>; elseif<<i4==0>&&<i5!=0>> writeChar<14,1,i6+'0'>; if<<i4!=0>>writeChar<15,1,i6+'0'>; while<UpKey==0>; } } if<<DnKey==0>&&<Set!=0>> { delayms<20>; if<DnKey==0> { switch<Set> { case1: if<AlarmTempLow>0>AlarmTempLow--;elseAlarmTempLow=0;break; case2: if<AlarmTempTop>0>AlarmTempTop--;elseAlarmTempTop=0;break; } i1=AlarmTempLow/100; //获得温度值的百位 i2=AlarmTempLow%100/10; //获得温度值的十位 i3=AlarmTempLow%10; //获得温度值的个位 i4=AlarmTempTop/100; //获得温度值的百位 i5=AlarmTempTop%100/10; //获得温度值的十位 i6=AlarmTempTop%10; //获得温度值的个位 writestring<5,1,"">; writestring<13,1,"">; if<i1!=0> writeChar<5,1,i1+'0'>; if<<i1==0>&&<i2!=0>>writeChar<5,1,i2+'0'>; if<i1!=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论