您好,欢迎来到九壹网。
搜索
您的当前位置:首页基于单片机的水温控制系统设计

基于单片机的水温控制系统设计

来源:九壹网


单片机课程设计

课题名称:基于单片机的水温控制系统设计 学 院: 工学院 班 级: 姓 名: 学 号: 指导老师:

第一章 课题介绍

1.1课题名称

基于单片机的温度控制系统 1.2选题背景

单片机温度控制系统是单片机控制的一项简单应用。近几年来单片机因其独特的,方便,快捷的优势被广泛的应用于各个领域之中。它的技术指标有:以ATC52系列单片机为核心部件、以数字电路和模拟电路为硬件基础、以汇编语言为软件实现语言。

1.3功能概述

在该环境温度控制系统中,单片机作为核心部件进行检测控制,增强了设计的通用性,适时性。温度控制分为升温和降温控制,升温控制和降温控制分别采用继电器来控制外部的升温和降温设备。软件部分采用流程图来表示,对各个子程序进行说明,包括控制算法,偏差计算等。控制是否升温或降温。

第二章 系统总体设计及方案

2.1单片机的介绍

随着大规模集成电路的出现及其发展,将计算机的CPU 、RAM 、 ROM 、定时/计数器和多种I/O接口集成在一片芯片上,形成芯片级的计算机,因此单片机早期的含义称为单片微型计算机,直译为单片机 。它的特点主要有:具有优异的性能价格比 、集成度高、体积小、可靠性高 、控制功能强 、低电压、低功耗。

2.2单片机的基本组成

它由 CPU 、存储器(包括 RAM 和 ROM )、I/O接口、定时/计数器、中断控制功能等均集成在一块芯片上,片内各功能通过内部总线相互连接起来。

输入 / 输出引脚 P0、P1、P2、P3 的功能:

P0.0~P0.7(32~39 脚):P0 口是一个 8 位漏极开路型双向 I/O 端口。在访问片外存储器时,它分时作低 8 位地址和 8 位双向数据总线用。在EPROM 编程时,由 P0 输入指令字节,而在验证程序时,则输出指令字节。验证程序时,要求外接上拉电阻。 P0 能以吸收电流的方式驱动8个LSTTL 负载。

P1.0~P1.7(1~8 脚): P1 是一上带内部上拉电阻的 8 位双向 I/O 口。在 EPROM 编程和验证程序时,由它输入低 8 位地址。 P1 能驱动 4 个 LSTTL 负载。

P2.0~P2.7(21~28 脚): P2 也是一上带内部上拉电阻的 8 位双向 I/O 口。在访问外部存储器时,由它输出高 8 位地址。在对 EPROM 编程和程序验证时,由它输入高 8 位地址。 P2 可以驱动 4 个 LSTTL 负载。

P3. 0 ~P3. 7 ( 10~17 脚): P3 也是一上带内部上拉电阻的双向 I/O 口。 在 MCS-52中,这8个引脚还用于专门的第二功能。P3能驱动4个LSTTL负载。

P3.0 RXD(串行口输入)

P3.1 TXD(串行口输出) P3.2 INT0(外部中断 0 输入) P3.3 INT1(外部中断 1 输入) P3.4 T0(定时器 0 的外部输入) P3.5 T1(定时器 1 的外部输入) P3.6 WR(片外数据存储器写选通) P3.7 RD(片外数据存储器读选通) 2.3 设计方案:

采用ATC52单片机作控制器,温度传感器选用DS18B20来设计数字温度计,系统由5个模块组成:主控制器、测温电路、显示电路、控制电路、报警及指示电路。主控制器由单片机ATC52实现,测温电路由DS18B20温度传感器实现,显示电路由液晶显示屏显示,,报警指示电路由蜂鸣器和发光二级管构成,控制电路由按键构成。本设计所使用传感器与传统的相比,具有读数方便,测温范围广,测温准确等特点,其输出温度采用数字显示,主要用于对温度的精度要求较高的场所,或科研实验室使用,并且加有报警装置,超过温度可发出报警信号,还可以调整报警上下限温度。该设计控制器使用单片机ATC51,测温传感器使用DS18B20,用液晶显示屏实现温度显示,能准确达到以上要求。

第三章 电路设计

3.1 时钟电路设计

图 3-1 时钟电路图

3.2系统复位电路

图3-2 复位电路

3.3温度检测电路设计

本次设计所采用的温度传感器为DS18B20,无需A/D转换,因此从主机CPU到DSl8B20仅需一条线,当DS18B20接收到温度转换命令后,开始启动转换。

Vcc3DS18B20 2 1 P3.0

图3-3 DS18B20与STCC52单片机的连接

3.4 温控电路

图3-4 温控电路

3.5 按键电路设计

键盘共有三个键,判断K2-K4键是否按下,可采用软件查询和中断的方法,当某个键按下时,低电平有效。3个键K2-K4的功能定义如表所示。

K2-K4键的定义

按键 K2 K3 K4 键名 功能转换键 加1键 减1键 功能 此键按下,显示温度设定值,按键松开,显示当前温度 设定温度值加1 设定温度值减1

图 3-5 按键电路

3.6主控电路设计

图 3-6 主控电路

第四章 硬件设计

4.1系统结构框图

温度显示电路 ATC51 键盘输入电路 温度控制电路 温度采集电路 图4-1系统硬件总体框图

该系统由核心部件ATC51来处理从键盘输入电路和温度采集电路送入的数据,并通过温度显示电路进行温度显示,由温度控制电路来进行相应的升温或降温的操作。

第五章 软件设计

5.1主程序流程图

根据所学知识,实现本系统的软件部分将使用汇编语言,要配合硬件部分实现输入一个需要恒定的温度值和偏差温度,与从温度传感器所获取的当前实际温度相比较,并向温度控制执行电路发出升温或降温的命令,在这一过程中将随时显示当前温度值和设置的温度值。其主要实现的部分包括:键盘输入、温度采集、数据转换、动态显示、温度控制等。主程序流程图如图5-1所示。

图5-1主程序流程图

5.2读出温度子程序

读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。

图5-2 读温度流程图

第六章 总结

通过做本课题,使我们了解传感器的基本理论知识,更深入的了解单片机的开发应用和PC编程控制。为以后从事单片机软硬件产品的设计开发、PC软件开发打下了良好的基础,树立从事产品研发的信心。同时也培养了我们认真的做事态度。

回顾起此次单片机课程设计,至今我仍感慨颇多,的确,从选题

到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说对单片机汇编语言掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故。

从得到题目到查找资料,从对题目的研究设定到电路图的设计,电路图的设计到程序设计……在这一个充满挑战伴随挫折,充满热情伴随打击的过程中,我们感触颇深,它是对我们的钻研精神,创新精神,面对困难的心态,做事的毅力和耐心的考验。我们在这个过程中深刻的感受到了做设计的意义所在,和我们一样真正投入了身心去做的人也一定会有同样的感触。

参考文献:

[1] 李朝青.单片机原理及接口技术(简明修订版).杭州:北京航空航天大学出版社,1998

[2] 李广弟.单片机基础[M].北京:北京航空航天大学出版社,1994

[3] 江力.单片机原理与应用技术 .清华大学出版社 .2006 [4] 蔡美琴等.MCS一51系列单片机系统及其应用[M].北京:高等教育出版社,1999.

[5] 王树勋.MCS一51单片微型计算机原理与开发.北京:机械工业出版社,1995

[6] 何希才.传感器及其应用电路.北京:电子工业出版社,2001

附录一 主程序

#include

#define uchar unsigned char #define uint unsigned int

sbit DQ=P3^2;//ds18b20与单片机连接口 sbit RS=P1^0;//引脚 sbit RW=P1^1; sbit EN=P1^2; sbit PSB =P1^6; sbit zeng=P3^4; sbit jian=P3^5;

sbit warn=P2^0;//报警指示灯 sbit beep=P1^5;//蜂鸣器

sbit high=P2^7;//温度上限设置指示灯 sbit low=P2^6;//温度下限设置指示灯

unsigned char code str1[]={\"TEMPERATURE: C \unsigned char code str2[]={\" \ bit flag;

uchar data disdata[5]; uint tvalue;//温度值 uchar tflag;//温度正负标志 uint setvalue;//设置温度

/*******************lcd1602程序**************************/ void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)

{unsigned int i,j; for(i=0;ivoid wr_com(unsigned char com)//写指令// { delay1ms(1); RS=0; RW=0; EN=0; P0=com; delay1ms(1); EN=1; delay1ms(1); EN=0; }

void wr_dat(unsigned char dat)//写数据// { RS=1; RW=0; EN=0; P0=dat; delay1ms(1);

EN=1; delay1ms(1); EN=0; }

void lcd_init()//初始化设置// {delay1ms(15);

wr_com(0x38);delay1ms(5); wr_com(0x08);delay1ms(5); wr_com(0x01);delay1ms(5); wr_com(0x06);delay1ms(5); wr_com(0x0c);delay1ms(5); }

void display(unsigned char *p)//显示// {

while(*p!='\\0') {

wr_dat(*p); p++; delay1ms(1); } }

init_play()//初始化显示

{ lcd_init(); wr_com(0x80);

display(str1); wr_com(0xc0); display(str2);

}

/*******************ds18b20程序************************/ void delay_18B20(unsigned int i)//延时1微秒 {

while(i--); }

void ds1820rst()/*ds18b20复位*/ { unsigned char x=0;

DQ = 1; //DQ复位 delay_18B20(4); //延时 DQ = 0; //DQ拉低

delay_18B20(100); //精确延时大于480us DQ = 1; //拉高 delay_18B20(40);

}

uchar ds1820rd()/*读数据*/ { 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_18B20(10);

return(dat); }

void ds1820wr(uchar wdata)/*写数据*/ {unsigned char i=0; for (i=8; i>0; i--) { DQ = 0;//给脉冲信号 DQ = wdata&0x01; delay_18B20(10); DQ = 1;//给脉冲信号 wdata>>=1; }

void key_trans() interrupt 2 { flag=1;

}

read_temp()/*读取温度值并转换*/ {uchar a,b; ds1820rst();

ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0x44);//*启动温度转换*/ ds1820rst();

ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0xbe);//*读取温度*/ a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue<<=8; tvalue=tvalue|a;

if(tvalue>0x0&&tvalue<0x032){tflag=0;}

tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数 return(tvalue); }

/********************************************************/ void ds1820disp(uint value)//温度值显示

{ uchar flagdat;

disdata[0]=value/1000+0x30;//百位数

disdata[1]=value%1000/100+0x30;//十位数 disdata[2]=value%100/10+0x30;//个位数 disdata[3]=value%10+0x30;//小数位 if(tflag==0)

flagdat=0x20;//正温度不显示符号

else

flagdat=0x2d;//负温度显示负号: if(disdata[0]==0x30)

{disdata[0]=0x20;//如果百位为0,不显示

if(disdata[1]==0x30)

{disdata[1]=0x20;//如果百位为0,十位为0也不显示 } }

wr_com(0xc0);

wr_dat(flagdat);//显示符号位

wr_com(0xc1);

wr_dat(disdata[0]);//显示百位 wr_com(0xc2);

wr_dat(disdata[1]);//显示十位 wr_com(0xc3);

wr_dat(disdata[2]);//显示个位

wr_com(0xc4);

wr_dat(0x2e);//显示小数点 wr_com(0xc5);

wr_dat(disdata[3]);//显示小数位

}

/********************beep蜂鸣器**********************/ void beeper()//报警函数 { char i; beep=1; for(i=0;i<10;i++)

{beep=!beep;//蜂鸣器报警 delay1ms(100); } }

/*******************interrupt******************/ T0_int() interrupt 1 {read_temp();//读取温度 TH0=(65536-50000)/256; TL0=(65536-50000)%256;

/***************主程序****************************/ void main() { zeng=1;//增1

jian=1;//减1 low=1; high=1;

setvalue=25;//设置初始温度25度 IP=0x04; IE=0x84; TMOD=0x01;

TH0=(65536-1000)/256;//定时器赋初值TH0定时时间为1ms TL0=(65536-1000)%256;// 求余运算,因为低八位最大能装255 ET0=1;// 允许定时器T0中断 TR0=1;// 开定时器

setvalue=setvalue*10;//设置温度扩大10倍 init_play();//初始化显示 while(1) {

if(flag==1) //查询INT1键按下显示设置温度 {ds1820disp(setvalue); //显示设置温度 flag=0; }

else if(zeng==0)//加键按下 {delay1ms(500);

setvalue++;//设置温度加1

if(setvalue>500)//如果设置温度>50度

setvalue=250;//设置温度恢复初始温度25度 ds1820disp(setvalue);//显示设置温度 }

else if(jian==0)//减键按下 { delay1ms(500);

setvalue--;//设置温度减1

if(setvalue<250)//如果设置温度<25度 setvalue=250;//设置温度恢复初始温度25度 ds1820disp(setvalue); }

else {ds1820disp(tvalue);//显示采集温度

if(tvalue>350){high=0;beeper();high=1;}//温度超过35度,蜂鸣器报警

if(tvalue<240){low=0;beeper();low=1;}//温度低于24度,蜂鸣器报警

} } }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务