当前位置:文档之家› 环境温度控制系统

环境温度控制系统

目录第1章绪论 (1)第2章系统总体方案设计 (2)2.1系统框图 (2)2.2系统结构与设计思路 (2)第3 系统硬件设计 (3)3.1 STC89C52模块 (3)3.2数码管模块 (3)3.3按键模块 (4)3.4 DS18B20模块 (4)3.5 报警模块 (5)3.6 I/O分配表 (6)第4章系统软件设计 (7)4.1 软件设计思路 (7)4.2 各程序流程图 (8)第5章硬件调试 (10)第6章总结 (12)参考文献 (13)附录 (14)附1硬件原理图 (14)附 2 源程序清单 (15)附2.1 main.c清单 (15)附2.2 18B20.c清单 (19)附2.3 alarm.c清单 (20)附2.4 delay.c清单 (21)第1章绪论1.1 系统设计要求本课题以单片机和DS18B20为核心设计一个环境温度检测与报警系统,测温范围为—10~125℃,精度误差在0.1℃以内,LED数码管直读显示,可以由用户自己设定上限温度,如果环境温度超过实际温度或在5秒内温度变化超过5度则会发出声光报警。

1.2 系统设计的目的及意义1.2.1课题设计的目的⑴掌握用51单片机控制LED数码管显示字符的方法。

⑵掌握用单片机进行显示系统开发的方法。

⑶掌握单片机软件、硬件调试技术。

⑷了解单线器件DS18B20的驱动方法。

⑸了解LED显示器的一般驱动方法。

1.2.2课题设计的意义随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数字单片机技术入手,一切向着数字化控制,智能化控制方向发展。

本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用。

在本次设计中,主要从功能组合,硬件模块,程序算法等几个方面探讨基于单片机的数字温度计的设计。

第3章系统硬件设计3.1 STC8952RC模块图表3-1 STC89c52模块3.2 数码管模块U1为段选锁存器,U2为位选锁存器,数码管的最高位为报警H/L 显示,最低位显示“C”,第3~7位显示温度。

图3-2 数码管显示模块3.3按键模块S1为进入报警温度设置键,S2键为报警温度上调键,点按微调,长按速调,S3为报警温度下调键,操作同S2,S4为退出报警温度设置键。

图3-3按键模块3.4 DS18B20模块由于DS18B20内部已经把温度的模拟信号转化为数字信号,故只要通过对DS18B20顺序进行初始化、写ROM操作指令、读储存器操作指令来实现温度向单片机的传输。

其中温度寄存器的高8位与低8位如下图示。

图2-6高、低位温度寄存器图中,若S=1,温度为负,temp=(~(tempH<<8+tempL)+1);若S=0,温度为正,temp=tempH<<8+tempL。

图3-6 DS18B20模块3.5报警模块图3-5 报警模块3.6 系统I/O口分配表3-1 I/O口分配第4章系统软件设计4.1 软件设计思路由于软件代码比较长,本系统的软件设计采用模块化编程。

工程分有main.c、18B20.c、delay.c、alram.c等几个C文件。

main.c包括数码管的初始化、温度的处理及温度的显示,其中温度的显示通过定时器1的扫描实现。

18B20.c包括18B20的初始化、读ROM、写命令、读温度。

delay.c 为2ms延时函数。

alarm.c包括喇叭急鸣和LED点亮函数。

第5章硬件调试串口调试软件下载软件采用STC-ISPV478,开机启动单片机,DS18B20读取温度,如下图5-1 实时温度显示设置报警温度为31.70℃,如下图5-2 设置报警温度增加DS18B20周围的温度,使超过报警温度,图如下示图5-3 超温报警此时数码管首位显示H,喇叭发声,LED灯点亮。

总结在这次的课程设计中,结合了所学的单片机和电路知识,设计出满足课程设计要求的温度监测警报与控制系统。

在进行课程设计的过程中,我查阅了很多文献,了解了STCAT89S52、MAX232片、DS18B20温度传感器的功能。

拓展了我们的视野。

通过本次的课程设计,加深了我们对单片机的理解,使得我们更加熟悉单片机的程序编写。

特别是通过程序的调试,我们发现了很多程序编写的坏习惯,例如使用中断服务程序时没有保护好相关可能被改变的数据。

我们所设计的温度监测警报与控制系统原理简单,所用到的软器件较少,而且是使用STC89S52单片机来实现控制功能,使得其相关功能或参数可以根据需要进行修改。

参考文献[1] 单片机原理及应用王迎旭主编机械工业出版社 2012年[2] 51系列单片机应用与实践教程周向红编北航出版社 2008年[3] 微型计算机原理与接口技术吴秀清编中国科学技术出版社 2001[4] 微型计算机接口技术及应用刘乐善编华中理工大学出版社 2000[5] 单片机实用技术问答谢宜仁主编人民邮电出版社 2002[6] 百度百科附录附1 硬件原理图图附-1 硬件接线图附2 源程序清单附2.1 Main.c#include <reg52.h>#include "18b20.h"#include"delay.h"#include"alarm.h"#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换#define max 8#define OVERTEMP 34*100 //定义超温报警数值#define LOWTEMP 20*100 //定义低温报警数值sbit duan=P2^6;//定义锁存使能端口 段锁存sbit wei=P2^7;//位锁存sbit baojin=P1^5;sbit set_sign=P3^2;//进入设置sbit up=P3^3;//上调sbit down=P3^4;//下调sbit set_out=P3^5;//退出设置bit ReadTempFlag;//定义读时间标志bit starttempFlag=0; //比较温度标志bit point1;//Hbit point2;//Lbit point3;//水平Tbit point4;//退出设置bit point5;//进入设置extern unsigned char temppoint;unsigned char codetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 显示段码值0~9 unsigned char code boot[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]; //存储显示值的全局变量void Display(unsigned charFirstBit,unsigned char Num);//数码管显示函数void Init_Timer0(void);//定时器初始化void dealdata(int t);signed int set_temp(inttempk,char m);void main (void){int remember[max];signed int temp,tempk;unsigned char i,j,k,m;tempk=OVERTEMP;for(k=0;k<8;k++)//清屏TempData[k]=0xff;Init_Timer0();while(1){point4=1;point5=1;baojin=1;if(point1==1){alarm();TempData[0]=0x89;//显示"H"}if(point2==1){alarm();TempData[0]=0xc7;}if(point3==1){alarm();TempData[0]=0xb9;}if(!set_sign){DelayMs(10);if(!set_sign)tempk=set_temp(tempk,m);//设置报警温度}if (ReadTempFlag) //主循环{ReadTempFlag=0;temp=ReadTemperature();if(starttempFlag==0)//温度处理{remember[i]=temp;i++;}else{for(j=0;j<max;j++){remember[j]=remember[j+1];remember[max-1]=temp;}if(temp>(tempk)){point1=1;point2=0;point3=0;}elsepoint1=0;if(temp<(LOWTEMP)){point1=0;point2=1;point3=0;}elsepoint2=0;if(((remember[max-1]-remember [0])>500||(remember[0]-rememb er[max-1])>500)){point1=0;point2=0;point3=1;}}dealdata(temp);}}}void dealdata(int temp){unsigned char hun,ten,one,dot1,dot2;hun=temp/10000;ten=temp/1000%10;one=temp/100%10;dot1=temp%100/10;dot2=temp%10;// if(temppoint=1)TempData[0]=0x40;//负号标志TempData[7]=0xff;TempData[0]=0xff;if(hun>0)TempData[2]=hun;//table[TempH /100]; //百位elseTempData[2]=0xff;if((hun==0)&&(ten==0))//消隐TempData[3]=0xff;elseTempData[3]=table[ten]; //十位温度TempData[4]=table[one]&0x7f; //个位温度,带小数点TempData[5]=table[dot1];TempData[6]=table[dot2];TempData[7]=0xc6; //显示C符号}void Display(unsigned char FirstBit,unsigned char Num) {static unsigned char i=0;DataPort=0xff; //清空数据,防止有交替重影wei=1; //段锁存DataPort=boot[i+FirstBit]; //取位码wei=0; //位锁存duan=1;DataPort=TempData[i]; //取显示数据,段码duan=0; //段锁存 i++;if(i==Num)i=0; }signed int set_temp (inttempQ,char m){unsigned char key_press_num; up=1; //按键输入端口电平置高down=1;while (point4){if(!set_out){DelayMs(10);if(!set_out)point4=0;}dealdata(tempQ);if(!up) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!up) //再次确认按键是否按下,没有按下则退出{while(!up){key_press_num++;DelayMs(10);//10x200=2000ms=2sif(key_press_num==200)//大约2s{key_press_num=0;//如果达到长按键标准//则进入长按键动作while(!up) //这里用于识别是否按{tempQ+=10;dealdata(tempQ);DelayMs(50);}}}key_press_num=0;tempQ+=10;}}if(!down) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!down) //再次确认按键是否按下,没有//按下则退出{while(!down){key_press_num++;DelayMs(10);if(key_press_num==200) //大约2s{key_press_num=0;while(!down){tempQ-=10;dealdata(tempQ);DelayMs(50);}}}key_press_num=0;tempQ-=10;}}m++;dealdata(tempQ);}return tempQ;}void Init_Timer0(void){TMOD |= 0x01; /TH0=0x00; //给定初值TL0=0x00;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}void Timer0_isr(void) interrupt 1{static unsigned int num,num1; TH0=(65536-2500)/256;//重新赋值2.5msTL0=(65536-2500)%256;Display(0,8); // 调用数码管扫描num++;num1++;if(num==250) //{num=0;ReadTempFlag=1; //读标志位置1}if(num1==2000) starttempFlag=1; }附2.2 18B20.c#include"delay.h"#include"18b20.h"bit Init_DS18B20(void){bit dat=0;DQ = 1; //DQ复位DelayUs2x(5); //稍做延时DQ = 0; //单片机将DQ 拉低DelayUs2x(200); //精确延时大于 480us 小于960usDelayUs2x(200);DQ = 1; //拉高总线DelayUs2x(50); //15~60us 后接收60-240us的存在脉冲dat=DQ; //如果x=0则初始化成功, x=1则初始化失败DelayUs2x(25); //稍作延时返回 return dat;}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;DelayUs2x(25);}return(dat);}void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;DelayUs2x(25);DQ = 1;dat>>=1;}DelayUs2x(25);}unsigned int ReadTemperature(void){unsigned char tempL=0; unsigned int tempH=0; unsigned int temp=0;unsigned char temppoint=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换DelayMs(10);Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度tempL=ReadOneChar(); //低位tempH=ReadOneChar(); //高位tempH<<=8;temp=tempH+tempL;if(temp&0x8000) //判断正负{temppoint=1;//负temp=((~temp)+1);temp*=(0.0625*100);}else{temppoint=0; //正temp*=(0.0625*100);}return(temp);}附2.3 alarm.c#include<reg52.h>#include"delay.h"sbit baojin=P1^5;sbit set_sign=P3^2;sbit laba=P1^2;bit point;void alarm(void){unsigned int k;while(1){ point=0;if(!set_sign){DelayMs(10);if(!set_sign)point=1;}baojin=0; //报警发光 for(k=0;k<200;k++){DelayUs2x(200);laba=!laba }laba=0;//防止一直给喇叭通电造成损坏for(k=0;k<200;k++){DelayMs(1);}if(!point) break;}}附2.4 delay.c#include "delay.h"void DelayUs2x(unsigned char t) {while(--t);}void DelayMs(unsigned char t) { while(t--){//大致延时1mS DelayUs2x(245);DelayUs2x(245); }}电气信息学院课程设计评分表指导教师签名:________________日期:________________ 注:①表中标*号项目是硬件制作或软件编程类课题必填内容;②此表装订在课程设计说明书的最后一页。

相关主题