资源描述
单片机设计报告
课 程 设 计
课程名称 单片机课程设计
题目名称 基于89s52的饮水机加热控制系统
学生学院 材料与能源学院
专业班级11级
学号 311000
学生姓名 陈
指导教师 刘
本人制作后发现按钮还是不够稳定,10次可能就有1次按错,不过基本没影响,希望后人完善
2013年12月31日
目录
广东工业大学课程设计任务书 - 2 -
一、课程设计的内容 - 2 -
二、课程设计的要求与数据 - 2 -
三、课程设计应完成的工作 - 3 -
四、课程设计进程安排 - 3 -
五、应收集的资料及主要参考文献 - 3 -
基于STC89C52单片机的高档饮水机加热控制系统设计报告 - 4 -
摘要: - 4 -
关键字 - 4 -
一、引言: - 4 -
1.1概述 - 4 -
1.2 课题意义 - 4 -
1.3设计方案 - 5 -
二.系统总体方案介绍 - 5 -
2.1 系统组成框图 - 5 -
2.2 主要设计软件 - 6 -
三.硬件设计 - 6 -
3.1各部分硬件设计及其原理 - 6 -
3.1.1 STC89C52简介 - 6 -
3.1.2 两位共阳极数码管显示电路设计与原理 - 7 -
3.1.3 时钟振荡电路 - 8 -
3.1.4温度传感器监测电路 - 8 -
3.1.5继电器控制电路 - 9 -
3.1.6加热方式选择电路 - 9 -
3.2 硬件总电路图 - 10 -
四.软件设计 - 11 -
五.心得总结 - 12 -
六.参考文献 - 13 -
七、附录: - 13 -
附录1:源程序 - 13 -
附录二:实物图 - 21 -
广东工业大学课程设计任务书
题目名称
基于AT89S52的高档饮水机加热控制系统
学生学院
材料与能源学院
专业班级
11级
姓 名
陈
学 号
311100
一、 课程设计的内容
用AT89S52单片机制作一饮水机自动断电系统:
1.设计并绘制硬件电路图;
2.绘制PCB板图并焊接好元器件;
3.编写程序并将调试好的程序固化到单片机中
二、课程设计的要求与数据
本系统主要由AT89S52芯片,以及一组温度传感器组成,通过检测水的温度变化,判断煮水次数,同时检测水量的变化,在煮水次数超过一定次数而期间水量未曾变化的情况(即无人用水)下,控制继电器断开加热电源。因为一般饮水机有重复加热功能,会加热煮沸后停止加热,等冷却后继续加热,所以主要是在测量水量变化方面加以完善并配合现有的饮水机加热原理进行改造,为使本系统更人性化和具备实用性,另外添加温差加热工作模式。在满足系统工作断电条件,即煮水次数满足,水量无变化的的条件时,开启这种工作模式。(以下假定一般饮水机自动加热是等水温冷却到70度时开始,室温为t度) 第一阶段:水温下降到40度时,再次加热,若无人用水,停止加热;第二阶段;水温再次下降到t+10度时再次加热,
若无人用水,停止加热;第三阶段:水温下降到t度时,再次加热,若无人用水,停止加热。还可以设置时差加热等其他加热模式使系统更人性化和具有更广的使用范围。
三、课程设计应完成的工作
1. 熟悉仿真软件使用,设计好各模块后电脑上进行仿真
2. 仿真无误后列出清单,购买材料和元件,部分材料需进行加工(除了各种芯片外,了解下有无其他方便的诸如5v电源接口等的器件)
3.根据元件的实际针脚情况,进行二次排线布局,方便焊接
4.焊接
5进行模拟测试
四、课程设计进程安排
序号
设计各阶段内容
地点
起止日期
1
硬件、软件设计
大学城工学三号馆308
12月23~27日
2
焊接电路板
大学城工学三号馆308
12月28~30日
3
软件、硬件调试
大学城工学三号馆308
12月30~1月1日
4
撰写说明书
宿舍
1月1日
5
答辩
大学城工学三号馆105
1月2日
五、应收集的资料及主要参考文献
1、DS18B20驱动运行方法及内部工作原理
2、单片机运行基本接线电路
发出任务书日期: 2013 年 12 月 24 日 指导教师签名:
计划完成日期: 2013 年 1 月2 日 基层教学单位责任人签章:
主管院长签章:
基于STC89C52单片机的高档饮水机加热控制系统设计报告
摘要:本次课程设计的目标是通过52单片机芯片控制温度传感器DS18B20获得温度数据,并结合实际饮水机使用情况和问题,设置多种加热模式,实现不同加热要求。举一反三,通过运用其他传感器,修改一定的程序和电路图,可用于其他电器如洗衣机等的使用。
关键字
加热控制;STC89C52单片机;DS18B20;编程
一、引言:
传感器已经成为现代科技不可缺少的一部分,传感器就像人的五官,可以获得如图像信息,声音信息,压力信息,温度信息等各种外界信息。通过传感器,可以实现机器对外界环境的检测进而做出判断和反应。温度作为各种元器件、机器、动物等正常工作或生活的条件,使得温度的检测和控制非常重要。
1.1概述
本设计是以STC89C52芯片的电路为基础,结合温度监测模块,扩展成为可以控制什么时候进行加热的加热控制系统。本设计针对加热控制系统与饮水机的结合,设计成饮水机加热控制系统,
1.2 课题意义
加热控制系统可以实现对温度的控制,确保环境或物体达到指定的温度或者保持指定的温度,而本设计的加热系统有多重加热模式,其中除了基本的煮沸功能外,还有时间段加热功能、温水功能和智能加热功能,通过后面几个功能,可以实现饮水机的节能工作和防止千滚水的要求,同时又不妨碍正常的饮水。
1.3设计方案
主要的元件有89s52芯片,DS18B20温度传感器芯片,两位数码管,继电器、led灯和按钮。希望达成的目标:
1、 监测环境温度,并显示在数码管上
2、 可以通过按钮,选择4种不同的工作模式(假设室温25度,加热代表继电器导通,待机代表继电器截止)
模式0:先加热到95度,进入待机状态,冷却到65度时加热,并95度时待机,循环下去。
模式1:每隔20分钟加热一次,加热到95度时待机。
模式2:加热到75度后待机,之后当温度低于60度时开始加热,加热到75读待机。即当温度小于60度时就加热到75度,然后冷却到60度就继续加热,循环下去。使温度维持在65度左右。
模式3:首先监测环境温度并记下,然后加热到95度,开始从阶段①逐步走到阶段④。①待机到65度时加热到95度②待机到50度后加热到95度③待机到40度后加热到95度④待机到室温时加热到95度。同时设置出水口开关监测,任何阶段如果有用水的话,加热到95度时重新跳到阶段①(此模式用于省电和防止无人用水时的千滚水现象)
3、 各种工作模式下,可以控制继电器的吸附和放开
4、 各种工作情况由led灯的亮灭反映
二.系统总体方案介绍
2.1 系统组成框图
加热的结构以STC89C52单片机为控制核心、温度监测模块、时钟复位电路、继电器控制模块、数码管显示模块组成、模式选择模块。按键负责选择不同的工作模式,单片机负责接收温度传感器的监测到的温度并处理成10进制数,数码管显示监测到的温度,继电器由温度和当前工作模式决定是否开启。系统组成框图如图2.1所示。
温度传感器
单
片
机
加热模式0
加热模式1
加热模式2
加热模式3
数码管
模式选择
继电器
定时器(模式1)
外部中断(模式3)
图2.1 系统组成框图
2.2 主要设计软件
KEIL编程软件对加热控制系统的程序进行编程并调试
ISIS仿真软件上进行仿真和调试
三.硬件设计
3.1各部分硬件设计及其原理
3.1.1 STC89C52简介
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,2个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。外形及引脚排列如图3.1.1所示
图3.1.1 STC89C52系列单片机
3.1.2 两位共阳极数码管显示电路设计与原理
两位数码管相比两个数码管,可以节省他们之间的连线,更加方便,控制方式只需要控制1或2端为高电平,需要显示的段位为低电平即可,并通过动态显示的方法,使左边的数码管(1)显示10位数,右边(2)显示个位数。需要注意的是,这种数码管的引脚分布与一个数码管不同。使数码管有引脚的一面面正对自己,上面的5个引脚由左到右分别为d,e,c,b,1,下面由左到右为2,f,a,dp.g.
图3.2.1两位共阳极数码管接线图
3.1.3 时钟振荡电路
STC89C52中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英晶体或者陶瓷谐振器一起构成自然振荡器。外接石英晶体及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。对外接电容C1,C2虽然没有什么严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程序及温度稳定性。如果使用石英晶体,电容推荐使用30PF10PF,而如果使用陶瓷振荡器建议选择40PF10PF。石英晶振器电路图如下:
图3.2.3 单片机外部振荡电路
3.1.4温度传感器监测电路
温度传感器的接线非常简单,只需接上vcc和地,并将dq端接到双向口上即可(p2的不行),另外,温度传感器在一开始工作时不稳定,如果需要读取一开始的环境温度的话,需要添加一定的延迟时间(约1s)。
图3.2.4 DS18B20温度传感器接线图
3.1.5继电器控制电路
继电器的工作原理为线圈导通时,线圈会将贴片吸附,使双线开关导通线2,不导通时默认导通线1。为了使驱动继电器,需要用三极管将驱动电流放大,同时为了避免截止时线圈产生较大电流击穿三极管,加入整流二极管。图中电路只需要让三极管B极为0即可导通线圈,为正时截止。
图3.2.1继电器工作接线图
3.1.6加热方式选择电路
加热方式选择电路由简单的按钮1(p3.0)和按钮2(p3.1)以及4个led灯组成。需要通过编程,在按钮1按下时进入工作模式选择模式,通过按钮2切换工作模式,并由4个led灯对应4个不同的工作模式。当选择好工作模式后,再按下按钮1,单片机就会根据编好的程序和选择的工作模式,控制其他工作模块的工作。
图3.2.6工作模式选择模块接线图
3.2 硬件总电路图
总体硬件电路实现功能如下,如图3.3所示,实际接线时led和数码管都需要加上限流电阻,单片机芯片也要接上vcc和地、
图3.3.1 总电路图
四.软件设计
本次课程设计的难点在于DS18B20温度传感器的驱动程序,因此软件设计方面主要讲这个,其余的程序说明会在程序附录里注释说明。
首先需要简单说明下DS18B20的一些主要内部结构,传感器监测到的温度会放在图4.1.1所示的暂存寄存器的0,1字节里,因此读温度就是度这里的温度。而对暂存器的操作指令都放在指定位置,如图4.1.2所示。12精度下,高字节和低字节存放的情况如图4.1.3所示,需要特别注意的是,每个字节里的温度数值是高位在后,低位在前,即如7(110110111)在里面是11101011,在处理时务必小心,同时最高5位表示为0表示数值为正,为1表示数值为负。
图4.1.1 DS18b20暂存寄存器分布
图
图4.1.2 RAM指令表
图4.1.3 12精度温度格式表
该温度传感器的驱动程序一般需要包括初始化子程序,复位子程序,预读数据子程序,预写数据子程序,检测温度并转换成十进制子程序组成。
1、 因为本课程设计主要用18B20的出厂设置,所以无需初始化程序,初始化程序主要用于控制精度,如果选择12位精度则不需要,可以简化许多。(不需要)
2、 复位子程序主要用于检测传感器的好坏
3、 预读子程序用于读取暂存器里的温度
4、 预写子程序用于写入预设的指令
5、监测温度子程序用于执行一次总的`18B20高低字节温度读取过程,并附加计算过程转换成直观的十进制数。
五.心得总结
心得:看书不如练习好,练习不如动手好,这次课程设计,因为上课学习得比较认真,课后也有练习,所以想着最好能做一个题目里没有的课程设计,注意到日常饮水机经常忘记关,所以弄个这样的加热控制系统。
因为只有自己一个人,所以效率很高,不用经过讨论和分工,一切想做就做,所以省了团队合作时的各种麻烦,
通过这次课程设计,主要学习到的还是温度传感器的使用,通过查阅DS18B20的各种资料,觉得温度传感器不是很简单,但通过各种分析、测试和计算,发现很多地方可以省略,所以就将觉得不用的信息和程序忽略。
其实通过这次课程设计,更深一层次的收获还是学会怎样学习器件的使用,比如温度传感器,需要用到什么就获取自己需要的信息就好,其它不相关的可以忽略,以后学习使用其它传感器或者器件,也应该采取这种方法,弄懂了不需要弄懂的东西只是浪费时间。因此最重要的还是确定目标,想达到什么目标,需要使用什么,需要学习什么。
总结:本次课程设计的最终结果比较好,要实现的功能都实现了,只是焊接的时候不熟悉数码管的管脚,查阅了错误的资料,导致焊错,最后焊得很难看,而且双位数码管需要接的限流电阻应该比较小,用了750欧姆的限流电阻结果数码管显示很暗。还有就是5V电源接口的焊接方式不够稳固。
六.参考文献
[1] 《单片机应用及C51程序设计》,机械工业出版社,陈涛
[2] 《C程序设计》,清华大学出版社,谭浩
[2] 《DS18B20全套中文资料》,传诚科技,
七、附录:
附录1:源程序
#include<reg52.h>
#include<intrins.h>
#include<math.h>
#define uc unsigned char
#define ui unsigned int
#define ht 25
#define lt 20
sbit led0=P3^4; //工作模式指示灯
sbit led1=P3^5;
sbit led2=P3^6;
sbit led3=P3^7;
sbit dq=P1^0; //温度传感器
sbit jd=P2^0; //继电器控制
sbit k1=P3^0; // 开关组
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
sbit dj=P1^5; //待机或保温指示灯
sbit jr=P1^6; //加热状态指示灯
sbit g1=P2^7;
sbit g2=P2^6;
char temp=0xff;//温度值
ui t=200;//加热模式1的计时20分钟需要循环次数
ui bs;//加热时长=20*倍数
ui bs0;//用于给bs装初值
uc xz=0;//用于加热模式3返回加热阶段
uc ms=0;//选择的加热模式0123
uc pd;//用于加热模式3中断后的判断
uc tt1;//方式2记录环境温度,ys
char t0;
unsigned char code num[10]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
//-------------延时程序------------------
void delay1us(ui i) //延时2us的延时程序
{
while(i--);
}
void delay1ms(ui i) //延时1ms的延时程序
{ ui j;
while(i--)
{ for(j=0;j<115;j++);
}
}
//----------------数码管显示程序---------------
void smg( )
{ uc a;
uc b;
a=temp/10;
b=temp%10;
g1=1;
P0=~num[a];
delay1ms(5);
g1=0;
g2=1;
P0=~num[b];
delay1ms(5);
g2=0;
}
//-----------温度传感器初始化使用出厂设置所以不用------------
//-----------温度传感器复位检测---------------
void DS_reset()
{uc a;
dq=1;
delay1us(8);
dq=0; //拉低总线
delay1us(80); // 延时480us
dq=1; //释放总线
delay1us(14); // 延时80微秒
a=dq; // 检测温度传感器的脉冲
delay1us(20); // 等待总线恢复
// a值,0为正常,1为故障
}
//-----------------对DS写数据-----------------------------------------
void DS_write(uc dat)
{uc i=0;
for(i=8;i>0;i--)
{dq=0;
dq= dat&0x01;
delay1us(5);
dq=1;
dat>>=1;
}
}
//--------------对DS读数据--------------------------------------
uc DS_read()
{uc i,dat=0;
for(i=8;i>0;i--)
{
dq=0;
dat>>=1;
dq=1;
if(dq)
{dat|=0x80;
}
delay1us(4);
}
return(dat);
}
//----------检测温度-----------------
char temp_read()
{uc a=0,b=0;
char z[8],i=0x01,j;
char k=0;
DS_reset(); //复位
DS_write(0xCC); //括号内的为已经放置的指定指令了
DS_write(0x44);
delay1us(100); //延时一会让其写入
DS_reset();
DS_write(0xCC);
DS_write(0xBE);
delay1us(100);
a=DS_read();//温度高字节放在a
b=DS_read(); //温度的低字节放在b
temp=b<<4; //,12480000,把低字节高四位的数左移4位并补0 ,注意这里原本是高位在后低位在前
//看不懂请查阅内部放置位置资料
temp+=(a&0xf0)>>4;//0000,16,32,64,S 把高字节的低四位后移4位,并加上低字节的高四位
//于是得到权为1,2,4,8,16,32,64,s的二进制数,s为正负判断位
//----------------温度数值转换------------
//把倒放的温度转化为正常的十进制
for(j=0;j<8;j++) //把高位在后低位在前的温度值转换成低位在后高位在前
{z[j]=temp&i;
i=_crol_(i,1);
k=k+z[j];
}
temp=k;//因为前面已经设置温度和k都是有符号的,所以改变好位置后直接就能读了,
//c语言内部有自己转换的程序,不用再编写二进制转为10进制的程序
smg(); //把温度显示在数码管上
return temp;
}
//-----------------加热模式0:普通加热----------
void heat0()
{
uc tt0; //设置tt0来记录环境温度,为方便作业的验收才弄的,实际可去掉
//以下如果有ys字眼的表示都是为验收才设置的
temp_read(); //因为温度传感器在一开始工作时不稳定,所以先预工作一下,隔1S才开始进入工作模式
delay1ms(1000);
tt0=temp_read(); //监测环境温度并记录,ys
jd=0; //jd为0时继电器线圈导通,开始加热
jr=0; //点亮加热led灯,本设计的led灯都低电平时点亮
dj=1; //熄灭待机led灯
while(temp_read()<tt0+2); //达到目标温度时待机,这里实际使用目标温读应设为90-95度
jd=1; //继电器线圈截止
jr=1; //熄灭加热led
dj=0; //点亮待机led
while(1)
{while(temp_read()>tt0+1);//在温度下降到需要开始加热的温度前程序停在这
jd=0;
jr=0;
dj=1;
while(temp_read()<tt0+2);//达到目标温度时待机
jd=1;
jr=1;
dj=0;
}
}
//-------------加热模式1:时间段加热(间隔30*xmin)
void heat1()
{TMOD=0X01;//定时器0的方式1,每50ms中断一次
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
tt1=temp_read();
EA=1;
TR0=1;
ET0=1;
while(1);
}
void tt() interrupt 1
{
t--; //t的值表示进行多少次50ms后开始加热
if(t==0)//t==0时,进入加热工作
{
jd=0;
t=200;//重新给t赋值,为下次计时做准备
jr=0;
dj=1;
}
TH0=(65535-50000)/256; //为定时器重新赋初值
TL0=(65535-50000)%256;
if(temp_read()>tt1+3) //达到上限温度时待机
{jd=1;
jr=1;
dj=0;
}
}
//------------加热模式2:保温65度左右-----
void heat2()
{uc tt2; //用于记录环境温度.ys
dj=0;
temp_read();
delay1ms(1000);
tt2=temp_read(); //把环境温度送给tt2,ys
while(1) //原理与模式0类似,只是目标温度不同
{while(temp_read()>tt2+1);
jd=0;
jr=0;
dj=1;
while(temp_read()<tt2+2);
jd=1;
jr=1;
dj=0;
}
}
//--------------加热模式3:温差智能节能加热-----
void heat3()
{ char i;
uc tt3; //ys
IT1=1;//设置中断
EX1=1;
EA=1;
temp_read();
delay1ms(1000);
tt3=temp_read();
while(1)
{switch(xz)//xz用于判断接下来要执行的阶段
{
case 0:while(temp_read()>tt3+5); //xz为0时阶段0
jd=0;
jr=0;
dj=1;
while(temp_read()<tt3+6);
jd=1;
jr=1;
dj=0;
if(pd==0) //pd用于判断是否经过中断,再返回阶段1,与一开始进入阶段0区分
{ while(temp_read()>tt3+5);
jd=0;
jr=0;
dj=1;
while(temp_read()<tt3+6);
jd=1;
jr=1;
dj=0;
}
xz++; //把xz加1,下面进入阶段1
pd=1; //pd置1,
break; //跳出这次的switch,再进行判断
case 1: //与阶段0主要是需要加热时的温度更低了,即加热间隔时长变长
while(temp_read()>tt3+4&&xz);//当xz为0时即中断过时下面的都不执行,程序回到阶段0
if(xz)
{jd=0;
jr=0;
dj=1;}
while(temp_read()<tt3+6&&xz);
if(xz)
{jd=1;
jr=1;
dj=0;}
if(pd) xz++;
break;
case 2: while(temp_read()>tt3+3&&xz);
if(xz)
{jd=0;
jr=0;
dj=1;}
while(temp_read()<tt3+6&&xz);
if(xz)
{jd=1;
jr=1;
dj=0;}
if(pd) xz++;
break;
case 3: while(temp_read()>tt3&&xz);
if(xz)
{jd=0;
jr=0;
dj=1;}
while(temp_read()<tt3+6&&xz);
if(xz)
{jd=1;
jr=1;
dj=0;}
if(pd) xz++;
while(xz!=0);//系统进入待机状态,不再监测温度和加热
}
}
}
void int1() interrupt 2 //发现有人用水时,重新进入阶段0,模式3重新启动
{
xz=0;
pd=0;
}
//--------------加热模式选择函数-------
void way()
{uc p;
while(1) //监测按键是否被按下
{if(k1==0)//按下功能键时进入选择模式
{delay1ms(15); //不知道为什么弄的都是消抖程序,有很多种,这里是其中一种方式
if(k1==0)
{while(k1==0);
while(k1!=0)
{ if(k2==0)//按下翻页键
{delay1ms(70);
if(k2==0) ms++;//判断翻页键按下时,给ms加1,用于记录已经选择的模式
if(ms>3) ms=0;//就是就是一个ms%=3的指令,ms超过3时回到0,范围只哟0-3
}
switch(ms)//显示当前ms对应的工作模式,并点亮对应led灯
{case 0:led0=0;
led1=1;
led2=1;
led3=1;
p=1;break;
case 1:led0=1;
led1=0;
led2=1;
led3=1;p=1;break;
case 2:led0=1;
led1=1;
led2=0;
led3=1;;p=1;break;
case 3:led0=1;
led1=1;
led2=1;
led3=0;;p=1;break;
}
}
delay1ms(15);
}
}
if(p!=0) break;//用于判断是否有选择了工作模式,有的话跳出这个模式选择程序
}
}
//-----------------主控制函数------------
void main()
{way();//模式选择
switch(ms) //根据ms的值选择对应的工作模式
{case 0:heat0();
case 1:heat1();
case 2:heat2();
case 3:heat3();
}
}
附录二:实物图
相片:
图7.2.1 模式1加热工作情况
图7.2.2模式1待机工作情况
图7.2.2 背面很丑的焊接情况
- 22 -
展开阅读全文