1、基于单片机的智能温控系统的设计与实现 课 程 设 计 报 告 设计名称 基于单片机的智能温控系统的设计与实现 学 校 陕西电子科技职业学院 学 院 电子工程学院 学生姓名 王一飞 班 级 1507 指导教师 聂弘颖 时 间2017年10月23日 一、概述随着嵌入式技术、计算机技术、通信技术的不断发展与成熟。控制系统以其直观、方便、准确、适用广泛而被越来越广泛地应用于工业过程、空调系统、智能楼宇等。恒温控制系统,控制对象是温度。温度控制在日常生活及工作领域应用的相当广泛,比如温室、水池、发酵缸、电源等场所的温度控制,而以往温度控制是由人工完成的而且不够重视,其实在很多场所温度都需要监控以防止发生
2、意外。针对此问题,本系统设计的目的是实现一种可连续高精度调温的温度控制系统,它应用广泛,功能强大,小巧美观,便于携带,是一款既实用又廉价的控制系统。本项目设计是对温度进行实时监测与控制,设计的温度控制系统实现了基本的温度控制功能:被控温度范围可以调整,初始范围25=T=35。如果被测温度在25度到35度之间,则既不加热,又不报警;如果被测温度小于25度,则既加热,又报警;如果被测温度大于35度,则报警,不加热。 数码管显示温度,温度精确到整数。二、方案设计采用单片机+单总线DS18B20的方案,其中单片机采用51兼容系列 三、详细硬件设计及原件介绍3.1 单片机最小系统在基于单片机的应用系统中
3、,其核心是单片机的最小系统,而单片机又是最小系统的核心,为了方便起见,采用的单片机型号是:STC89C52RC,内部资源有:8KB FLASH ,512B SRAM,4个8位I/O,2个TC,1个UART,带ISP和IAP功能。是近年来流行的低端51单片机。时钟电路采用12.0M晶体,复位电路采用简单的RC复位电路。R=10K,C=10uF,详细电路见总体原理图3.2 DS18B20简介DS18B20是采用“1-wire”一线总线传输数据的集成温度传感器,信息经过单线接口送入DS18B20或从DS18B20送出,因此从中央处理器到DS18B20仅需连接一条线。可采用外部电源供电,也可采用总线供
4、电方式,此时,把VDD连接在一起作为数字电源。因为每一个DS18B20有唯一的系列号(silicon serial number),因此多个DS18B20可以存在于同一条单线总线上,这允许在许多地方放置温度灵敏器件。此特性的应用范围包括HVAC环境控制,建筑物、设备或机械内的温度检测。3.2 DS18B20与单片机接口四、总体原理图见附录1五、程序设计1、主程序流程图六、项目总结通过对该项目的设计制作,我对简单的单片机控制系统的开发过程有了比较全面的理解,在这次实习中,我的体会有:1.细心,制作硬件和编写程序,调试程序,都需要细心,否则很容易失败。2.基础,单片机不是万能的,它需要外部硬件电路
5、的配合,这些电路不复杂,但是要弄明白它的原理,还是要下一番功夫的。像基础的电子焊接,测量,元件的识别等都是。3.团队合作,由于时间的关系,每个项目由几个人合作,这时就特别需要团队合作意识。4.撰写设计文档,对写设计文档总感到是一种累赘反正实物已经出来了,有没有文档关系不大。现在需要在设计过程中随时记录一些东西,最后整理成设计文档。5.将一个大的问题分割成几个相对独立的部分,更容易解决。附录1:电路原理图附录2:代码:(1)名称:温控系统#include /包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/#include#define uchar unsigned char#de
6、fine uint unsigned int/*/* 定义端口 */*/sbit DQ=P27;/ds18b20 端口sbit ledj=P11;/加热sbit ledb=P17;/报警sbit keyup=P30; /温度加sbit keydn=P31; /温度减/*/* 全局变量 */*/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,0x
7、71; /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;j20;j+) for(i=0;i20;i+) shi=tmax/10;
8、 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;j20;j+) for(i=0;i4; shi=temph/10; /十位温度 ge=temph%10; /个位温度 xs(shi,ge); /显示温度 sjcl(); /数据处理/*/* 显示函数 */*/void xs(uchar shi,uchar ge) P2=2; P0
9、=tabshi; delay(500); P2=3; P0=tabge; delay(500); P2=4; P0=0xc6; delay(500);/*/* 数据处理函数 */*/void sjcl() if(temphtmax) ledj=1; ledb=0; else if(temph=tmin&temph0;i-) DQ = 0; / 给脉冲信号 dat=1; DQ = 1; / 给脉冲信号 if(DQ=1) dat|=0x80; delay(5); return(dat);/*/* 写一个字节 */*/void WriteOneChar(unsigned char dat) unsi
10、gned char i=0; for (i=8;i0;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); /跳过读序号列号的操作 WriteO
11、neChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度a=ReadOneChar(); /低位b=ReadOneChar(); /高位b=8;t=a+b;return(t);(2)名称:DS18B20温度计,温度值由单片机发给上位机并显示(扩展功能程序)/*- 名称:18B20温度传感器,温度在上位机显示 公司:陕西圣弘科技有限公司 编写:赵进全 日期:2010.8-*/#include /包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include/#include#define uchar unsigned char#define uint u
12、nsigned int/*/* 定义端口 */*/sbit DQ=P27;/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(
13、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) /串口发送数据函数doSBUF=*parr+; /发送数据while(!TI); /数据发送完标志位1TI=0; /标志清0while(*parr); /保持循环直到字符为0ma
14、in() /主函数 unsigned char TempH,buff2; init_com(); while(1) temp=ReadWD();/定时读取当前温度 TempH=temp4; shi=TempH%100/10; /十位温度 ge=TempH%100%10; /个位温度 bh=0x39; /显示C符号 xs(shi,ge); sprintf(buff,%d,temp4); /将整型温度转换成字符型 comm(buff); /将字符型温度由串口发送到上位机 void xs(uchar shi,uchar ge) P2=1; P0=tabshi; delay(500); P2=2; P
15、0=0; P0=tabge; 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); /精确延时大于 480us DQ = 1; /拉高总线 delay(10); x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 d
16、elay(5);/*/* 读一个字节 */*/unsigned char ReadOneChar(void)unsigned char i=0;unsigned char dat = 0;for (i=8;i0;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;i0;i-) DQ = 0; DQ = dat&0x01; d
17、elay(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);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1