基于单片机的智能温控系统的设计与实现.docx
《基于单片机的智能温控系统的设计与实现.docx》由会员分享,可在线阅读,更多相关《基于单片机的智能温控系统的设计与实现.docx(17页珍藏版)》请在冰豆网上搜索。
基于单片机的智能温控系统的设计与实现
课程设计报告
设计名称基于单片机的智能温控系统的设计与实现
学校陕西电子科技职业学院
学院电子工程学院
学生姓名王一飞
班级1507
指导教师聂弘颖
时间2017年10月23日
一、概述
随着嵌入式技术、计算机技术、通信技术的不断发展与成熟。
控制系统以其直观、方便、准确、适用广泛而被越来越广泛地应用于工业过程、空调系统、智能楼宇等。
恒温控制系统,控制对象是温度。
温度控制在日常生活及工作领域应用的相当广泛,比如温室、水池、发酵缸、电源等场所的温度控制,而以往温度控制是由人工完成的而且不够重视,其实在很多场所温度都需要监控以防止发生意外。
针对此问题,本系统设计的目的是实现一种可连续高精度调温的温度控制系统,它应用广泛,功能强大,小巧美观,便于携带,是一款既实用又廉价的控制系统。
本项目设计是对温度进行实时监测与控制,设计的温度控制系统实现了基本的温度控制功能:
被控温度范围可以调整,初始范围25<=T<=35。
如果被测温度在25度到35度之间,则既不加热,又不报警;如果被测温度小于25度,则既加热,又报警;如果被测温度大于35度,则报警,不加热。
数码管显示温度,温度精确到整数。
二、方案设计
采用单片机+单总线DS18B20的方案,其中单片机采用51兼容系列
三、详细硬件设计及原件介绍
3.1单片机最小系统
在基于单片机的应用系统中,其核心是单片机的最小系统,而单片机又是最小系统的核心,为了方便起见,采用的单片机型号是:
STC89C52RC,内部资源有:
8KBFLASH,512BSRAM,4个8位I/O,2个TC,1个UART,带ISP和IAP功能。
是近年来流行的低端51单片机。
时钟电路采用12.0M晶体,复位电路采用简单的RC复位电路。
R=10K,C=10uF,详细电路见总体原理图
3.2DS18B20简介
DS18B20是采用“1-wire”一线总线传输数据的集成温度传感器,信息经过单线接口送入DS18B20或从DS18B20送出,因此从中央处理器到DS18B20仅需连接一条线。
可采用外部电源供电,也可采用总线供电方式,此时,把VDD连接在一起作为数字电源。
因为每一个DS18B20有唯一的系列号(siliconserialnumber),因此多个DS18B20可以存在于同一条单线总线上,这允许在许多地方放置温度灵敏器件。
此特性的应用范围包括HVAC环境控制,建筑物、设备或机械内的温度检测。
3.2DS18B20与单片机接口
四、总体原理图见附录1
五、程序设计
1、主程序流程图
六、项目总结
通过对该项目的设计制作,我对简单的单片机控制系统的开发过程有了比较全面的理解,在这次实习中,我的体会有:
1.细心,制作硬件和编写程序,调试程序,都需要细心,否则很容易失败。
2.基础,单片机不是万能的,它需要外部硬件电路的配合,这些电路不复杂,但是要弄明白它的原理,还是要下一番功夫的。
像基础的电子焊接,测量,元件的识别等都是。
3.团队合作,由于时间的关系,每个项目由几个人合作,这时就特别需要团队合作意识。
4.撰写设计文档,对写设计文档总感到是一种累赘——反正实物已经出来了,有没有文档关系不大。
现在需要在设计过程中随时记录一些东西,最后整理成设计文档。
5.将一个大的问题分割成几个相对独立的部分,更容易解决。
附录1:
电路原理图
附录2:
代码:
(1)名称:
温控系统
#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
//#include
#defineucharunsignedchar
#defineuintunsignedint
/******************************************************************/
/*定义端口*/
/******************************************************************/
sbitDQ=P2^7;//ds18b20端口
sbitledj=P1^1;//加热
sbitledb=P1^7;//报警
sbitkeyup=P3^0;//温度加
sbitkeydn=P3^1;//温度减
/******************************************************************/
/*全局变量*/
/******************************************************************/
uinttmax=30;
uinttmin=26;
uinttemp;
ucharshi,ge,temph,i,j,x;
ucharcodetab[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//7段数码管段码表共阳
/******************************************************************/
/*函数声明*/
/******************************************************************/
unsignedintReadWD(void);
voidcsh(void);
unsignedcharReadOneChar(void);
voidWriteOneChar(uchardat);
voiddelay(uinti);
voidxs(ucharshi,ucharge);
voidsjcl();
/******************************************************************/
/*主函数*/
/******************************************************************/
voidmain()
{
//unsignedchartemph;
while
(1)
{
if(keyup==0)
{
for(j=0;j<20;j++)
{
for(i=0;i<20;i++)
{
shi=tmax/10;
ge=tmax%10;
xs(shi,ge);
}
delay(5000);
shi=10;
ge=10;
xs(shi,ge);
if(keyup==0)
{
tmax++;
while(keyup==0);
}
if(keydn==0)
{
tmax--;
while(keydn==0);
}
}
}
elseif(keydn==0)
{
for(j=0;j<20;j++)
{
for(i=0;i<20;i++)
{
shi=tmin/10;
ge=tmin%10;
xs(shi,ge);
}
delay(5000);
shi=10;
ge=10;
xs(shi,ge);
if(keyup==0)
{
tmin++;
while(keyup==0);
}
if(keydn==0)
{
tmin--;
while(keydn==0);
}
}
}
else
{
if(x==0)
{
temp=ReadWD();//定时读取当前温度
temph=temp>>4;
shi=temph/10;//十位温度
ge=temph%10;//个位温度
}
}
xs(shi,ge);//显示温度
sjcl();//数据处理
}
}
/******************************************************************/
/*显示函数*/
/******************************************************************/
voidxs(ucharshi,ucharge)
{
P2=2;
P0=tab[shi];
delay(500);
P2=3;
P0=tab[ge];
delay(500);
P2=4;
P0=0xc6;
delay(500);
}
/******************************************************************/
/*数据处理函数*/
/******************************************************************/
voidsjcl()
{
if(temph>tmax)
{
ledj=1;
ledb=0;
}
elseif(temph>=tmin&&temph<=tmax)
{
ledj=1;
ledb=1;
}
else
{
ledj=0;
ledb=0;
}
}
/******************************************************************/
/*延时函数*/
/******************************************************************/
voiddelay(unsignedinti)//延时函数
{
while(i--);
}
/******************************************************************/
/*初始化*/
/******************************************************************/
voidcsh(void)
{
//unsignedcharx=0;
DQ=1;//DQ复位
delay(8);//稍做延时
DQ=0;//单片机将DQ拉低
delay(80);//精确延时大于480us
DQ=1;//拉高总线
delay(10);
x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay(5);
}
/******************************************************************/
/*读一个字节*/
/******************************************************************/
unsignedcharReadOneChar(void)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ==1)
dat|=0x80;
delay(5);
}
return(dat);
}
/******************************************************************/
/*写一个字节*/
/******************************************************************/
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(5);
}
/******************************************************************/
/*读取温度*/
/******************************************************************/
unsignedintReadWD(void)
{
unsignedchara=0;
unsignedintb=0;
unsignedintt=0;
csh();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
delay(200);
csh();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();//低位
b=ReadOneChar();//高位
b<<=8;
t=a+b;
return(t);
}
(2)名称:
DS18B20温度计,温度值由单片机发给上位机并显示(扩展功能程序)
/*-----------------------------------------------
名称:
18B20温度传感器,温度在上位机显示
公司:
陕西圣弘科技有限公司
编写:
赵进全
日期:
2010.8
------------------------------------------------*/
#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include
//#include
#defineucharunsignedchar
#defineuintunsignedint
/******************************************************************/
/*定义端口*/
/******************************************************************/
sbitDQ=P2^7;//ds18b20端口
/******************************************************************/
/*全局变量*/
/******************************************************************/
uinttemp;
ucharshi,ge,bh;
ucharcodetab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//7段数码管段码表共阳
/******************************************************************/
/*函数声明*/
/******************************************************************/
unsignedintReadWD(void);
voidcsh(void);
unsignedcharReadOneChar(void);
voidWriteOneChar(uchardat);
voiddelay(uinti);
voidxs(ucharshi,ucharge);
/******************************************************************/
/*主函数*/
/******************************************************************/
voidinit_com(void)//串口初始化函数
{
TMOD=0X20;//定时器1定时方式2
//PCON=0X00;
SCON=0X50;//串口方式1,允许接收
TH1=0XFD;//波特率为9600
TL1=0XFD;
TR1=1;
}
voidcomm(char*parr)//串口发送数据函数
{
do
{
SBUF=*parr++;//发送数据
while(!
TI);//数据发送完标志位1
TI=0;//标志清0
}
while(*parr);//保持循环直到字符为'\0'
}
main()//主函数
{
unsignedcharTempH,buff[2];
init_com();
while
(1)
{
temp=ReadWD();//定时读取当前温度
TempH=temp>>4;
shi=TempH%100/10;//十位温度
ge=TempH%100%10;//个位温度
bh=0x39;//显示C符号
xs(shi,ge);
sprintf(buff,"%d",temp>>4);//将整型温度转换成字符型
comm(buff);//将字符型温度由串口发送到上位机
}
}
voidxs(ucharshi,ucharge)
{
P2=1;
P0=tab[shi];
delay(500);
P2=2;
P0=0;
P0=tab[ge];
delay(500);
P0=0;
P2=3;
P0=bh;
delay(500);
P0=0;
}
/******************************************************************/
/*延时函数*/
/******************************************************************/
voiddelay(unsignedinti)//延时函数
{
while(i--);
}
/******************************************************************/
/*初始化*/
/******************************************************************/
voidcsh(void)
{
unsignedcharx=0;
DQ=1;//DQ复位
delay(8);//稍做延时
DQ=0;//单片机将DQ拉低
delay(80);//精确延时大于480us
DQ=1;//拉高总线
delay(10);
x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay(5);
}
/******************************************************************/
/*读一个字节*/
/******************************************************************/
unsignedcharReadOneChar(void)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay(5);
}
return(dat);
}
/******************************************************************/
/*写一个字节*/
/******************************************************************/
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(5);
}
/******************************************************************/
/*读取温度*/
/******************************************************************/
unsignedintReadWD(void)
{
unsignedchara=0;
unsignedintb=0;
unsignedintt=0;
csh();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
delay(200);
csh();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();//低位
b=ReadOneChar();//高位
b<<=8;
t=a+b;
return(t);
}