基于单片机的智能温控系统的设计与实现.docx

上传人:b****6 文档编号:5888361 上传时间:2023-01-01 格式:DOCX 页数:17 大小:111.82KB
下载 相关 举报
基于单片机的智能温控系统的设计与实现.docx_第1页
第1页 / 共17页
基于单片机的智能温控系统的设计与实现.docx_第2页
第2页 / 共17页
基于单片机的智能温控系统的设计与实现.docx_第3页
第3页 / 共17页
基于单片机的智能温控系统的设计与实现.docx_第4页
第4页 / 共17页
基于单片机的智能温控系统的设计与实现.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

基于单片机的智能温控系统的设计与实现.docx

《基于单片机的智能温控系统的设计与实现.docx》由会员分享,可在线阅读,更多相关《基于单片机的智能温控系统的设计与实现.docx(17页珍藏版)》请在冰豆网上搜索。

基于单片机的智能温控系统的设计与实现.docx

基于单片机的智能温控系统的设计与实现

课程设计报告

 

设计名称基于单片机的智能温控系统的设计与实现

 

学校陕西电子科技职业学院

学院电子工程学院

学生姓名王一飞

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

}

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

当前位置:首页 > 职业教育 > 中职中专

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

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