环境温度控制系统.docx

上传人:b****7 文档编号:10338073 上传时间:2023-02-10 格式:DOCX 页数:30 大小:1.76MB
下载 相关 举报
环境温度控制系统.docx_第1页
第1页 / 共30页
环境温度控制系统.docx_第2页
第2页 / 共30页
环境温度控制系统.docx_第3页
第3页 / 共30页
环境温度控制系统.docx_第4页
第4页 / 共30页
环境温度控制系统.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

环境温度控制系统.docx

《环境温度控制系统.docx》由会员分享,可在线阅读,更多相关《环境温度控制系统.docx(30页珍藏版)》请在冰豆网上搜索。

环境温度控制系统.docx

环境温度控制系统

设计内容与设计要求

设计内容:

本课题要求以单片机为核心设计一个环境温度检测与报警系统,要求测温范围为–10~125℃,精度误差在0.1℃以内,LED数码管直读显示,可以由用户自己设定上限温度,如果环境温度超过实际温度或在5秒内温度变化超过5度则会发出声光报警。

设计任务包括控制系统硬件设计和应用程序设计。

要求焊接好开发板,在开发板上进行调试。

设计要求:

1)确定系统设计方案;

2)进行系统的硬件设计;

3)完成必要元器件选择;

4)开发板焊接及测试;

5)系统软件设计及调试;

6)系统联调及操作说明;

7)写说明书;

主要设计条件

1、MCS-51单片机实验操作台1台;

2、PC机及单片机调试软件;

3、开发板1块;

4、制作工具1套;

5、系统设计所需的元器件。

说明书格式

封面

课程设计任务书

目录

第1章概述

第2章课题设计的要求、目的及意义

第3章系统总体方案选择与说明

第4章系统硬件电路设计框图与工作原理

第5章硬件设计

第6章开发板焊接及其测试

第7章软件设计及调试

第8章系统联调及操作说明

第9章总结

附录A系统硬件电路原理图

附录B程序清单

 

参考文献

[1]单片机原理及应用王迎旭主编机械工业出版社2012年

[2]51系列单片机应用与实践教程周向红编北航出版社2008年

[5]智能化集成温度传感器原理与应用沙占友编机械工业出版社2002年

[6]微型计算机原理与接口技术吴秀清编中国科学技术出版社2001

[7]微型计算机接口技术及应用刘乐善编华中理工大学出版社2000

[8]单片机实用技术问答谢宜仁主编人民邮电出版社2002

目录

第1章绪论………………………………………………………………1

第2章系统总体方案设计…………………………………………………2

2.1系统框图……………………………………………………………2

2.2系统结构与设计思路……………………………………………2

第3系统硬件设计……………………………………………………………3

3.1STC89C52模块…………………………………………………………3

3.2数码管模块……………………………………………………………3

3.3按键模块………………………………………………………………4

3.4DS18B20模块…………………………………………………………4

3.5报警模块………………………………………………………………5

3.6I/O分配表……………………………………………………………6

第4章系统软件设计……………………………………………………7

4.1软件设计思路…………………………………………………………7

4.2各程序流程图…………………………………………………………8

第5章硬件调试……………………………………………………………10

第6章总结…………………………………………………………………12

参考文献……………………………………………………………………13

附录…………………………………………………………………………14

附1硬件原理图…………………………………………………………14

附2源程序清单…………………………………………………………15

附2.1main.c清单……………………………………………………15

附2.218B20.c清单……………………………………………………19

附2.3alarm.c清单……………………………………………………20

附2.4delay.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课题设计的意义

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

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

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

第2章系统总体方案设计

2.1系统框图

图2-1系统框图

2.2系统结构与设计思路

系统硬件包括STC89C52RC模块、八段显示数码管模块、DS18B20模块、按键模块、报警模块。

设计好软件,下载进单片机。

启动系统后,DS18B20开始采集温度信号并把信号传给八段数码管显示。

当温度/低于高于系统设定的报警温度后,系统报警,喇叭发声,LED点亮,数码管首位显示H/L。

当温度在5分钟内超过5℃时,数码管显示T,喇叭发声报警。

 

第3章系统硬件设计

3.1STC8952RC模块

图表3-1STC89c52模块

3.2数码管模块

U1为段选锁存器,U2为位选锁存器,数码管的最高位为报警H/L显示,最低位显示“C”,第3~7位显示温度。

图3-2数码管显示模块

3.3按键模块

S1为进入报警温度设置键,S2键为报警温度上调键,点按微调,长按速调,S3为报警温度下调键,操作同S2,S4为退出报警温度设置键。

图3-3按键模块

3.4DS18B20模块

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

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

图2-6高、低位温度寄存器

图中,若S=1,温度为负,temp=(~(tempH<<8+tempL)+1);若S=0,温度为正,temp=tempH<<8+tempL。

图3-6DS18B20模块

3.5报警模块

图3-5报警模块

3.6系统I/O口分配

P0~P7

八段数码管接口

P26

数码管段选

P27

数码管位选

P12

喇叭接口

P15

报警LED接口

P32~P35

S1~S4按键

P36

DS18B20DQ接口

表3-1I/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点亮函数。

4.2各程序流流程图

4.2.1主程序块流程图

图4.1主程序块流程图

4.2.2报警程序块流程图

图4-2报警温度流程图

4.2.3DS18B20程序块流程图

图4-3DS18B20块流程图

第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]XX百科

附录

附1硬件原理图

图附-1硬件接线图

附2源程序清单

附2.1Main.c

#include

#include"18b20.h"

#include"delay.h"

#include"alarm.h"

#defineDataPortP0//定义数据端口程序中遇到DataPort则用P0替换

#definemax8

#defineOVERTEMP34*100//定义超温报警数值

#defineLOWTEMP20*100//定义低温报警数值

sbitduan=P2^6;//定义锁存使能端口段锁存

sbitwei=P2^7;//位锁存

sbitbaojin=P1^5;

sbitset_sign=P3^2;//进入设置

sbitup=P3^3;//上调

sbitdown=P3^4;//下调

sbitset_out=P3^5;//退出设置

bitReadTempFlag;//定义读时间标志

bitstarttempFlag=0;//比较温度标志

bitpoint1;//H

bitpoint2;//L

bitpoint3;//水平T

bitpoint4;//退出设置

bitpoint5;//进入设置

externunsignedchartemppoint;

unsignedcharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//显示段码值0~9

unsignedcharcodeboot[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//分别对应相应的数码管点亮,即位码

unsignedcharTempData[8];//存储显示值的全局变量

voidDisplay(unsignedcharFirstBit,unsignedcharNum);//数码管显示函数

voidInit_Timer0(void);//定时器初始化

voiddealdata(intt);

signedintset_temp(inttempk,charm);

voidmain(void)

{

intremember[max];

signedinttemp,tempk;

unsignedchari,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

{

remember[j]=remember[j+1];

remember[max-1]=temp;

}

if(temp>(tempk))

{

point1=1;

point2=0;

point3=0;

}

else

point1=0;

if(temp<(LOWTEMP))

{

point1=0;

point2=1;

point3=0;

}

else

point2=0;

if(((remember[max-1]-remember[0])>500||(remember[0]-remember[max-1])>500))

{

point1=0;

point2=0;

point3=1;

}

}

dealdata(temp);

}

}

}

voiddealdata(inttemp)

{

unsignedcharhun,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];//百位

else

TempData[2]=0xff;

if((hun==0)&&(ten==0))//消隐

TempData[3]=0xff;

else

TempData[3]=table[ten];//十位温度

TempData[4]=table[one]&0x7f;//个位温度,带小数点

TempData[5]=table[dot1];

TempData[6]=table[dot2];

TempData[7]=0xc6;//显示C符号

}

voidDisplay(unsignedcharFirstBit,unsignedcharNum)

{

staticunsignedchari=0;

DataPort=0xff;//清空数据,防止有交替重影

wei=1;//段锁存

DataPort=boot[i+FirstBit];//取位码

wei=0;//位锁存

duan=1;

DataPort=TempData[i];//取显示数据,段码

duan=0;//段锁存

i++;

if(i==Num)

i=0;

}

signedintset_temp(inttempQ,charm)

{

unsignedcharkey_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-20ms

if(!

up)//再次确认按键是否按下,没有按下则退出

{

while(!

up)

{

key_press_num++;

DelayMs(10);//10x200=2000ms=2s

if(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-20ms

if(!

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);

}

returntempQ;

}

voidInit_Timer0(void)

{

TMOD|=0x01;/

TH0=0x00;//给定初值

TL0=0x00;

EA=1;//总中断打开

ET0=1;//定时器中断打开

TR0=1;//定时器开关打开

}

voidTimer0_isr(void)interrupt1

{

staticunsignedintnum,num1;

TH0=(65536-2500)/256;//重新赋值2.5ms

TL0=(65536-2500)%256;

Display(0,8);//调用数码管扫描

num++;

num1++;

if(num==250)//

{

num=0;

ReadTempFlag=1;//读标志位置1

}

if(num1==2000)

starttempFlag=1;

}

附2.218B20.c

 

#include"delay.h"

#include"18b20.h"

bitInit_DS18B20(void)

{

bitdat=0;

DQ=1;//DQ复位

DelayUs2x(5);//稍做延时

DQ=0;//单片机将DQ拉低

DelayUs2x(200);//精确延时大于480us小于960us

DelayUs2x(200);

DQ=1;//拉高总线

DelayUs2x(50);//15~60us后接收60-240us的存在脉冲

dat=DQ;//如果x=0则初始化成功,x=1则初始化失败

DelayUs2x(25);//稍作延时返回

returndat;

}

unsignedcharReadOneChar(void)

{

unsignedchari=0;

unsignedchardat=0;

for(i=8;i>0;i--)

{

DQ=0;//给脉冲信号

dat>>=1;

DQ=1;//给脉冲信号

if(DQ)

dat|=0x80;

DelayUs2x(25);

}

return(dat);

}

voidWriteOneChar(unsignedchardat)

{

unsignedchari=0;

for(i=8;i>0;i--)

{

DQ=0;

DQ=dat&0x01;

DelayUs2x(25);

DQ=1;

dat>>=1;

}

DelayUs2x(25);

}

unsignedintReadTemperature(void)

{

unsignedchartempL=0;

unsignedinttempH=0;

unsignedinttemp=0;

unsignedchartemppoint=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.3alarm.c

#include

#include"delay.h"

sbitbaojin=P1^5;

sbitset_sign=P3^2;

sbitlaba=P1^2;

bitpoint;

voidalarm(void)

{

unsignedintk;

while

(1)

{point=0;

if(!

set_sign)

{

DelayMs(10);

if(!

set_sign)

point=1;

}

baojin=0;//报警发光

for(k=0;k<200;k++)

{

DelayUs2x

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1