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