环境温度控制系统.docx
《环境温度控制系统.docx》由会员分享,可在线阅读,更多相关《环境温度控制系统.docx(30页珍藏版)》请在冰豆网上搜索。
环境温度控制系统
设计内容与设计要求
设计内容:
本课题要求以单片机为核心设计一个环境温度检测与报警系统,要求测温范围为–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