资源描述
目录
一、 规定 .................................................................................... 2
二、 前言 .................................................................................... 3
三、 方案分析.................................................................................. 4
四、 实现 .................................................................................. 9
六、结论 ...................................................................................9
七、附录 ...................................................................................10
一、规定
水温控制系统
一、任务
设计并制作一个水温自动控制系统,控制对象为1升水,容器为搪瓷器皿。水温可以在一定范围内设定,并能实现在10℃—70℃量程范围内对每一点温度的自动控制,以保持设定的温度基本保持不变。
二、规定
1、基本规定
(1)可键盘设定控制温度值,设定最小分辨率为0.1℃;
(2)实时测量并显示实际温度。温度测量误差在±0.5 ℃内;
(3)水温控制系统应具有全量程(20℃~80℃)内的升温功能;
(4)任意设定一个温度值,控制系统可以实现该给定温度的恒值自动控制。控制的最大动态误差≤±4℃,静态误差≤±1℃。
2、发挥部分
(1)分段温度控制:50℃恒温3分钟,然后升温至70℃恒温。
(2)恒速温度控制:以每分钟升温2℃的速度,由35℃升温至40℃,然后保持。
(3)显示水温随时间变化的实时曲线
(4)其他。
三、前言
随着社会的发展和科技的进步以及测温仪器在各个领域的应用,智能化是现代温控系统发展的主流方向,特别是今年来,温度控制系统已应用到生活的各个方面,但是温度控制一直是一个未开发的领域,是与人们息息相关的一个问题。针对这种实际情况,设计一个温度控制系统,具有广泛的应用前景和实际意义。
温度是科学技术中最基本的物理量之一。物理、化学、生物等学科都离不开温度,在工业生产等许多领域,温度经常是表征对象和过渡状态的重要物理量。各行各业对温度的规定越来越高,可见温度的测量和控制是非常重要的。
单片机在电子产品中的应用已经越来越广泛,在很多的电子产品中也用到了温度检测和温度控制。随着温度控制器应用越来越广泛,各种试用于不同场和的温度控制器应运而生。
四、方案分析
本次设计重要版块分为温度感应模块,温度显示模块,键盘设定模块和加热控制模块。
一、方案的选择
1.对于温度感应模块有两种方案:
一种是使用普通温度传感器pt100再结合电压放大器和AD转换器将感应到的温度数值转换为数字量存储在某一单元内。但由于该方案电路繁多,线路冗长,所以舍之不用。
第二种是使用温度传感器18B20感应温度,由于该温度传感器内含AD转换器,因此连接简朴,应用方便,故选用该方案。
2.对于温度显示模块有两种方案:
一种是使用静态显示,通过数码管显示被测温度和设定温度。该方案程序简朴,但硬件连接复杂,所需元件数量多,不适合设计应用。
第二种是使用动态显示,通过数码管显示被测温度和设定温度。该方案程序复杂,但硬件连接简朴,所需元件少,但由于无法显示曲线,故不是最佳方案。
第三种是使用液晶屏LCD12864,通过字幕显示模式、温度、曲线。该方案程序复杂,但硬件观测方便,显示清楚,故为最佳方案。
3.对于键盘设定模块有两种方案:
一种是使用线反转法,通过矩阵键盘,一次求出行数和列数,然后求出设定的数值。由于该方案不具有扫描功能,因此不合用于一般的键盘程序,而合用于键盘中断程序。
第二种是使用键盘扫描法,通过矩阵键盘,求出设定的数值,由于该方案具有扫描功能,因此在不使用中断的情况下,使用键盘扫描程序是十分恰当的,本次设计采用的是键盘扫描程序。
4. 对于加热控制元件有两种方案。
一种是使用加热器(俗称热得快),功率约在800W左右,但考虑到功率过大会导致加热太快,不容易控制。
另一种是使用加热棒,功率在250W左右,功率不大,适合简易水温控制系统。
5. 对于控制方法有两种方案。
一种是采用普通的控制方法,即随着水温的变化调节温度,但局限性太小,由于水温变化快,且惯性大,不易调节,故采用普通控制方法显得力不从心。
另一种就是采用PWM控制加PID算法,通过采用PWM可以产生一个PWM波形,而PWM波形的占空比是通过PID算法调节,这样就可以调节加热棒的功率进而控制温度的变化。
二、 硬件的说明
硬件总体框图为:
LCD12864 液晶显示屏
单片机
温度传感器
18B20
继电器
4X4矩阵键盘
加热棒
加热对象1升水
本次设计硬件用到了单片机89C52、温度传感器18B20、加热棒、LCD12864、矩阵式键盘、SSR固态继电器等。
单片机89C52是常用的单片机之一,单片机上有32个P口,其中P0、P1、P2、P3各8个。温度传感器18B20接到单片机的一个P口上,本次设计是P1.3,由于温度传感器18B20可以直接将数据传输给单片机,因此可直接连接。
LCD12864是液晶显示屏,能显示64*128点阵的图像、文字等,功能强大。
矩阵式键盘采用4×4式,分别表达0到15。通过将8个出线端接到P2口上,然后通过P2口控制键盘,键盘的行拉高电阻和5伏电压。
固态继电器SSR是一种动作时间比较快的继电器,有4个接口,2端接5V电压,2端接加热棒。
三、软件的说明
本次程序的主框图为:
开始
中断初始化和LCD初始化
运营键盘输入模块
运营LCD显示模块
运营PID控制模块
检查模式,并分别跳到各模式
返回
开始
PID增量型算法程序框图: 比较程序框图:
开始
检查设定温度是否高于水温
输入设定值M(k)和水温R(k),
若不是,启动PWM加热
若不是,关闭加热
若是,检查设定温度是否高于水温2摄氏度
计算E(k)=R(k)-M(k)
若是,全速加热
计算Pp(k)=Kp*[E(k)- E(k-1)]
计算Pi(k)=Ki*E(k)
结束
计算Pd(k)=Kd[E(k)-2E(k-1)+E(k-2)]
P(k)=Pp(k)+Pi(k)+Pd(k)
E(k-2)=E(k-1),E(k-1)=E(k)
返回
加热控制模块的框图为
开始
检测模式
若为模式3
若为模式2
若为模式1
设定值取35
设定值取50
键盘摄入设定值
若不是
比较程序
比较程序
比较程序
若不是
结束
水温是否达成35摄氏度
水温是否达成50摄氏度
若是,调节PWM参数
若是,连续3分钟定期
3分钟是否已到
设定值取70
若是,设定值取70
比较程序
结束
比较程序
结束
五、实现
本次设计的功能板块分为四块,分别是温度传感器感应模块、键盘输入模块、LCD显示模块、控制温度模块。
调试过程中,出现过不少问题,诸如:
1. 发现温度传感器的温度并不能有效地显示在LCD上
因素:温度传感器的程序有问题,延时没有用好。
解决方法:修改18B20中的延时程序。
2. 发现键盘的数字按下后,键盘没有反映。
因素:程序中键盘的按键辨认方法是线反转法,键盘的键值所相应的行与列不能有效接通。
解决方法:改用扫描法,键盘有了反映。
六、结论
本次设计的题目是水温控制系统,其重要思想是将水温控制在某一个设定的温度左右,误差不超过1度。本次设计所包含的基本功能如下:当有键值输入时,判断模式,假如是模式1,则自动将温度被控对象的温度将被设定在设定值左右,来回往复波动。假如是模式2,则将温度升到50摄氏度,维持3分钟,然后升到70摄氏度维持,假如是模式3,则将温度升到35摄氏度,控制PWM参数,控制在每分钟2摄氏度,升到40摄氏度维持。本次设计中局限性之处就是LCD反映比较慢,误差还不太抱负,有待进一步改善。
本次设计历时2周左右,花费了大量的精力和时间,可以说其中包含了诸多的汗水和付出。通过翻阅书籍和不断地写程序调试,既增长了知识,又增长了经验。其过程中有苦有甜,局限性道也。最后感谢老师的指导和同学的帮助。
七、 附录1原理图
附录2元件明细
序 号
名 称
型号参数
数量
备注
1
LCD
12864
1片
2
键盘按钮
16个
4
SSR
固态继电器
1个
5
加热棒
1个
250瓦
6
三极管
1个
7
单片机
89C52
1片
附录3电路程序
#include <reg51.h> #include <intrins.h>
#include<math.h> #include<string.h>
#define unchar unsigned char #define unint unsigned int
sbit E=P3^0; sbit RW=P3^1; sbit RS=P3^2; sbit CS1=P3^6;
sbit CS2=P3^7; sbit DQ=P1^0; sbit JR=P1^5;
char code table_shuzi[][16]={
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00, // 0
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, //1
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00, //2
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,
0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00, //3
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,
0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00, //4
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,
0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00, //5
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,
0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00, //6
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,
0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00, //7
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00, //8
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00, //9
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00, //.
};
char code table_wenzi[][32]={
0x00,0x10,0x0C,0x04,0x4C,0xB4,0x94,0x05,
0xF6,0x04,0x04,0x04,0x14,0x0C,0x04,0x00,
0x00,0x82,0x82,0x42,0x42,0x23,0x12,0x0A,
0x07,0x0A,0x12,0xE2,0x42,0x02,0x02,0x00, //实
0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,
0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,
0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00, //测
0x40,0x41,0xCE,0x04,0x00,0x80,0x40,0xBE,
0x82,0x82,0x82,0xBE,0xC0,0x40,0x40,0x00,
0x00,0x00,0x7F,0x20,0x90,0x80,0x40,0x43,
0x2C,0x10,0x10,0x2C,0x43,0xC0,0x40,0x00, //设
0x00,0x10,0x0C,0xA4,0x24,0x24,0x25,0xE6,
0x24,0x24,0x24,0x24,0x14,0x0C,0x04,0x00,
0x40,0x20,0x18,0x07,0x08,0x10,0x20,0x7F,
0x42,0x42,0x42,0x42,0x40,0x40,0x00,0x00, //定
0x10,0xD0,0xFF,0x50,0x90,0x04,0xF4,0x54,
0x5F,0x54,0x54,0x5F,0xF4,0x04,0x00,0x00,
0x03,0x00,0xFF,0x00,0x00,0x84,0x85,0x45,
0x35,0x0F,0x15,0x25,0x65,0xC4,0x44,0x00, //模
0x00,0x08,0x88,0x88,0x88,0x88,0x88,0x08,
0xFF,0x08,0x09,0x0E,0x0A,0x08,0x00,0x00,
0x00,0x20,0x60,0x30,0x1F,0x10,0x08,0x08,
0x00,0x07,0x18,0x20,0x40,0x80,0x70,0x00, //式
0x10,0x21,0x86,0x70,0x00,0x7E,0x4A,0x4A,
0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00,0x00,
0x02,0xFE,0x01,0x40,0x7F,0x41,0x41,0x7F,
0x41,0x41,0x7F,0x41,0x41,0x7F,0x40,0x00, //温
0x08,0x08,0x08,0xFF,0x88,0x48,0x00,0x98,
0x48,0x28,0x0A,0x2C,0x48,0xD8,0x08,0x00,
0x02,0x42,0x81,0x7F,0x00,0x00,0x40,0x42,
0x42,0x42,0x7E,0x42,0x42,0x42,0x40,0x00, //控
0x00,0x00,0x02,0x22,0xB2,0xAA,0x66,0x62,
0x22,0x11,0x4D,0x81,0x01,0x01,0x00,0x00,
0x00,0x40,0x21,0x13,0x09,0x05,0x41,0x81,
0x7F,0x01,0x05,0x09,0x13,0x62,0x00,0x00, //系
0x20,0x30,0x2C,0xA3,0x60,0x10,0x84,0xC4,
0xA4,0x9D,0x86,0x84,0xA4,0xC4,0x84,0x00,
0x20,0x22,0x23,0x12,0x12,0x92,0x40,0x30,
0x0F,0x00,0x00,0x3F,0x40,0x41,0x70,0x00, //统
};
char code table_xiaoshuzi[][4]={
0x00,0x7c,0x44,0x7c,//0
0x00,0x00,0x7c,0x00,//1
0x00,0x74,0x54,0x5c,//2
0x00,0x54,0x54,0x7c,//3
0x00,0x3c,0x20,0x7c,//4
0x00,0x5c,0x54,0x74,//5
0x00,0x7c,0x54,0x74,//6
0x00,0x04,0x04,0x7c,//7
0x00,0x7c,0x54,0x7c,//8
0x00,0x5c,0x54,0x7c,//9
0x08,0x08,0x08,0x08,
};
unint bzw0,bzw1,bzw2,sjbz=800,sjbj=1;unint num,qxlie=11,qxpian=1,Temperature;
unint shiwei,gewei,xiaoshu,wda,wdb,wdc,js,set_Temperature, pidz;unchar pwmh,pwml;
struct PID
{ unint Proportion; unint Integral; unint Derivative; unint LastError; unint PrevError; };
struct PID pidfh;
//***********读忙
void readbusy()
{P0=0x00;RS=0;RW=1;E=1;while(P0&0x80);E=0;}
//***********写指令
void writecommand(unchar command)
{readbusy();RS=0;RW=0;P0=command;E=1; _nop_();_nop_(); E=0;}
//***********写数据
void writedate(unchar date)
{readbusy();RS=1; RW=0;P0=date; E=1; _nop_(); _nop_(); E=0; }
//**********设立页
void set_page(unchar page)
{page=0xb8|page;writecommand(page);
}
//*************???
void set_line(unchar line)
{line=0xc0|line;writecommand(line);}
//**************???
void set_lie(unchar lie)
{lie=lie&0x3f;lie=0x40|lie;writecommand(lie);}
void set_onoff(unchar onoff)
{onoff=0x3e|onoff;writecommand(onoff);}
//**************选屏
void selectscreen(unchar screen)
{switch(screen)
{case 0:CS1=1;CS2=1;break;case 1:CS1=1;CS2=0;break;case 2:CS1=0;CS2=1;break;
default: break;}}
//************清屏
void clearscreen(unchar screen)
{unchar i,j;selectscreen(screen);
for(i=0;i<8;i++)
{ set_page(i);set_lie(0);for(j=0;j<64;j++)
{ writedate(0x00); } }}
//************LCD初始化
void InitLCD()
{readbusy();selectscreen(0); set_onoff(0);selectscreen(0); set_onoff(1); selectscreen(0); clearscreen(0); set_line(0);clearscreen(0);writecommand(0xc0);}
//****定期初始化
intids()
{ EA=1;ET0=1;TMOD=0x11; TH0=(65536-5000)/256;TL0=(65536-5000)%256; ET1=1; TR1=1;
TH1=(65536-1000)/256; TL1=(65536-1000)%256; }
//****************延时
void delay(unchar t)
{while(t--);}
//****************复位
void reset()
{ unchar x=0;DQ=1; delay(2);//22usDQ=0; delay(81);//500us左右
DQ=1; delay(2);x=DQ; delay(15);}
//*************应答
void yingda()
{while(DQ); while(~DQ);
{ delay(13);//88us
break; }}
//***********写字节
void write_byte(unchar val)
{unchar i=0;
for(i=8;i>0;i--)
{DQ=1; _nop_();_nop_();_nop_();
DQ=0;_nop_();_nop_(); _nop_(); _nop_();_nop_();//5us DQ=val&0x01; delay(9);
DQ=1; val=val>>1; }
delay(4);}
//**************读字节
unchar read_byte(viod)
{unchar a=0;unchar value=0;
for(a=8;a>0;a--)
{ DQ=1;_nop_(); _nop_();DQ=0;_nop_();_nop_();value=value>>1;
DQ=1; _nop_(); _nop_(); _nop_(); _nop_(); //4us
if(DQ)
{value|=0x80; }
delay(9); //66us}
return(value);}
//**********解决温度
void chuliwendu(unchar gaowei,unchar diwei)
{ Temperature = (diwei + gaowei *256) * (0.0625*10); //Temperature=125
shiwei=Temperature/100; gewei=Temperature/10%10; xiaoshu= Temperature%10; }
//**********???????
void caijiwendu()
{unchar wenh,wenl;
reset();yingda(); write_byte(0xcc); write_byte(0x44); reset(); yingda(); write_byte(0xcc);
write_byte(0xbe); wenl=read_byte(); wenh=read_byte(); chuliwendu(wenh,wenl);
}
//*******************延时
void delay1(unint z)
{unint x,y;
for(x=z;x>0;x--)
for(y=1;y>0;y--);}
//***********键盘扫描
void keyscan()
{unchar temp;P2=0xfe;temp=P2;temp=temp&0xf0;while(temp!=0xf0)
{delay1(1);temp=P2;temp=temp&0xf0;
while(temp!=0xf0)
{temp=P2;switch(temp)
{case 0xee:num=0;js++;break;case 0xde:num=1;js++;break;
case 0xbe:num=2;js++;break;case 0x7e:num=3;js++;break;
}
while(temp!=0xf0)
{temp=P2;temp=temp&0xf0;}}}
P2=0xfd;temp=P2;temp=temp&0xf0;
while(temp!=0xf0)
{delay1(1);temp=P2;temp=temp&0xf0;
while(temp!=0xf0)
{temp=P2;switch(temp)
{case 0xed:num=4;js++;break;case 0xdd:num=5;js++;break;
case 0xbd:num=6;js++;break;case 0x7d:num=7;js++;break;}
while(temp!=0xf0)
{temp=P2;temp=temp&0xf0;}}}
P2=0xfb;temp=P2;temp=temp&0xf0;
while(temp!=0xf0)
{
delay1(1);temp=P2;temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;switch(temp)
{
case 0xeb:num=8; js++;break;case 0xdb:num=9; js++;break;
case 0xbb:num=10;break;case 0x7b:num=11;break;
}
while(temp!=0xf0)
{
temp=P2;temp=temp&0xf0;
}}}
P2=0xf7;temp=P2;temp=temp&0xf0;
while(temp!=0xf0)
{
delay1(1);temp=P2;temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;switch(temp)
{
case 0xe7:num=12;break;case 0xd7:num=13;break;
case 0xb7:num=14;break;case 0x77:num=15;break;
}
while(temp!=0xf0)
{
temp=P2;temp=temp&0xf0;
}}}}
//***************显示1
void display(unchar xp,unchar page,unchar lie,unchar j)
{
unchar i;selectscreen(xp);set_page(page);set_lie(lie);
for(i=0;i<8;i++)
{writedate(table_shuzi[j][i]);
}
set_page(page+1);set_lie(lie);
for(i=0;i<8;i++)
{writedate(table_shuzi[j][i+8]);
}
}
//***************显示2
void displayz(unchar xp,unchar page,unchar lie,unchar j)
{
unchar i;selectscreen(xp);set_page(page);set_lie(lie);
for(i=0;i<16;i++)
{writedate(table_wenzi[j][i]);
}
set_page(page+1);set_lie(lie);
for(i=0;i<16;i++)
{writedate(table_wenzi[j][i+16]);
}
}
//****************显示3
void displays(unchar xp,unchar page,unchar lie,unchar j)
{
unchar i;selectscreen(xp);set_page(page);set_lie(lie);
for(i=0;i<4;i++)
{writedate(table_xiaoshuzi[j][i]);
}}
//*************设定坐标轴
void set_zhou()
{unchar a,b,c,d;selectscreen(1);
for(a=2;a<7;a++)
{set_lie(10); set_page(a);writedate(0xff);
}
set_lie(10);set_page(7);writedate(0x0f);
for(b=2;b<8;b++)
{set_lie(11); set_page(b);writedate(0x08);
}
selectscreen(1);set_lie(12);
for(c=0;c<52;c++)
{set_page(7);writedate(0x08);
}
selectscreen(2);set_lie(0);
for(d=0;d<32;d++)
{set_page(7);writedate(0x08);
}}
//*************显示实测温度
void disnum(unint a,unint b,unint c)
{
display(2,2,4*8,a);display(2,2,5*8,b);display(2,2,6*8,10);display(2,2,7*8,c);
}
//****显示设定温度
void disnum1(unint x,unint y,unint z)
{
display(2,6,4*8,x);display(2,6,5*8,y);display(2,6,6*8,10);display(2,6,7*8,z);
}
//********显示汉字
void disnum2()
{
displayz(1,0,2*16,4);displayz(1,0,3*16,5);displayz(2,0,2*16,0);displayz(2,0,3*16,1);
displayz(2,4,2*16,2);displayz(2,4,3*16,3);
}
//************************显示模式
void disnum3(unint m)
{display(2,0,0*8,m);
}
//**********显示坐标轴数据
void disnum4()
{
displays(1,3,0*4,8);displays(1,3,1*4,0);displays(1,5,0*4,5);displays(1,5,1*4,0);
displays(1,7,0*4,2);displays(1,7,1*4,0);
}
//*******************显示开机画面
void disnum5()
{displayz(1,3,2*16,6);displayz(1,3,3*16,7);displayz(2,3,0*16,8);displayz(2,3,1*16,9);
}
//******************显示图像
void xstu(unchar pian,unchar lie)
{unchar i,a,b,c,d;
a=(int)((shiwei*10+gewei-20)*8/15)+5;b=7-(int)(a/8);c=a%8;
for(d=0x80;c>1;c--)
d=d>>1;
if(b==7)
{for(i=2;i<7;i++)
{selectscreen(pian);set_page(i); set_lie(lie); writedate(0x00);
}
selectscreen(pian);set_page(7);set_lie(lie);writedate(d+8);
}
else
{
for(i=2;i<7;i++)
{ if(i==b)
{ selectscreen(pian);set_page(i);set_lie(lie);writedate(d);
}
else
{ selectscreen(pian);set_page(i);set_lie(lie);writedate(0x00);
} }}}
//***********************曲线
void quxian()
{
if(qxlie==32)
{if(qxpian==2)
{qxlie=11;qxpian=1;
}}
if(qxlie==64)
{if(qxpian==1)
{qxlie=0;qxpian=2;
展开阅读全文