1、 目录 一、 规定 .................................................................................... 2 二、 前言 .................................................................................... 3 三、 方案分析............................................................................
2、 4 四、 实现 .................................................................................. 9 六、结论 ...................................................................................9 七、附录 ...................................................................................10
3、 一、规定 水温控制系统 一、任务 设计并制作一个水温自动控制系统,控制对象为1升水,容器为搪瓷器皿。水温可以在一定范围内设定,并能实现在10℃—70℃量程范围内对每一点温度的自动控制,以保持设定的温度基本保持不变。 二、规定 1、基本规定 (1)可键盘设定控制温度值,设定最小分辨率为0.1℃; (2)实时测量并显示实际温度。温度测量误差在±0.5 ℃内; (3)水温控制系统应具有全量程(20℃~80℃)内的升温功能; (4)任意设定一个温度值,控制系统可以实现该给定温度的恒值自动控制。控制的最大动态误差≤±4℃,静态误差≤±
4、1℃。 2、发挥部分 (1)分段温度控制:50℃恒温3分钟,然后升温至70℃恒温。 (2)恒速温度控制:以每分钟升温2℃的速度,由35℃升温至40℃,然后保持。 (3)显示水温随时间变化的实时曲线 (4)其他。 三、前言 随着社会的发展和科技的进步以及测温仪器在各个领域的应用,智能化是现代温控系统发展的主流方向,特别是今年来,温度控制系统已应用到生活的各个方面,但是温度控制一直是一个未开发的领域,是与人们息息相关的一个问题。针对这种实际情况,设计一个温度控制系统,具有广泛的应用前景和实际意义。 温度是科学技术中最基本的
5、物理量之一。物理、化学、生物等学科都离不开温度,在工业生产等许多领域,温度经常是表征对象和过渡状态的重要物理量。各行各业对温度的规定越来越高,可见温度的测量和控制是非常重要的。 单片机在电子产品中的应用已经越来越广泛,在很多的电子产品中也用到了温度检测和温度控制。随着温度控制器应用越来越广泛,各种试用于不同场和的温度控制器应运而生。 四、方案分析 本次设计重要版块分为温度感应模块,温度显示模块,键盘设定模块和加热控制模块。 一、方案的选择 1.对于温
6、度感应模块有两种方案: 一种是使用普通温度传感器pt100再结合电压放大器和AD转换器将感应到的温度数值转换为数字量存储在某一单元内。但由于该方案电路繁多,线路冗长,所以舍之不用。 第二种是使用温度传感器18B20感应温度,由于该温度传感器内含AD转换器,因此连接简朴,应用方便,故选用该方案。 2.对于温度显示模块有两种方案: 一种是使用静态显示,通过数码管显示被测温度和设定温度。该方案程序简朴,但硬件连接复杂,所需元件数量多,不适合设计应用。 第二种是使用动态显示,通过数码管显示被测温度和设定温度。该方案程序复杂,但硬件连接简朴,所需元件少
7、但由于无法显示曲线,故不是最佳方案。 第三种是使用液晶屏LCD12864,通过字幕显示模式、温度、曲线。该方案程序复杂,但硬件观测方便,显示清楚,故为最佳方案。 3.对于键盘设定模块有两种方案: 一种是使用线反转法,通过矩阵键盘,一次求出行数和列数,然后求出设定的数值。由于该方案不具有扫描功能,因此不合用于一般的键盘程序,而合用于键盘中断程序。 第二种是使用键盘扫描法,通过矩阵键盘,求出设定的数值,由于该方案具有扫描功能,因此在不使用中断的情况下,使用键盘扫描程序是十分恰当的,本次设计采用的是键盘扫描程序。 4. 对于加热控制元件有两种方案。 一种是使用加热器(俗称热得
8、快),功率约在800W左右,但考虑到功率过大会导致加热太快,不容易控制。 另一种是使用加热棒,功率在250W左右,功率不大,适合简易水温控制系统。 5. 对于控制方法有两种方案。 一种是采用普通的控制方法,即随着水温的变化调节温度,但局限性太小,由于水温变化快,且惯性大,不易调节,故采用普通控制方法显得力不从心。 另一种就是采用PWM控制加PID算法,通过采用PWM可以产生一个PWM波形,而PWM波形的占空比是通过PID算法调节,这样就可以调节加热棒的功率进而控制温度的变化。 二、 硬件的说明 硬件总体框图为: LCD12864 液晶显示屏
9、 单片机 温度传感器 18B20 继电器 4X4矩阵键盘 加热棒 加热对象1升水 本次设计硬件用到了单片机89C52、温度传感器18B20、加热棒、LCD12864、矩阵式键盘、SSR固态继电器等。 单片机89C52是常用的单片机之一,单片机上有32个P口,其中P0、P1、P2、P3各8个。温度传感器18B20接到单片机的一个P口上,本次设计是P1.3,由于温度传感器18B20可以直接将数据传输给单片机,因此可直接连接。 LCD12864是液晶显示屏,能显示64*128点阵的图像、文字等,功能强大。
10、矩阵式键盘采用4×4式,分别表达0到15。通过将8个出线端接到P2口上,然后通过P2口控制键盘,键盘的行拉高电阻和5伏电压。 固态继电器SSR是一种动作时间比较快的继电器,有4个接口,2端接5V电压,2端接加热棒。 三、软件的说明 本次程序的主框图为: 开始 中断初始化和LCD初始化 运营键盘输入模块 运营LCD显示模块 运营PID控制模块 检查模式,并分别跳到各模式 返回 开始 PID增量型算法程序框图:
11、比较程序框图: 开始 检查设定温度是否高于水温 输入设定值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) 返回
12、 加热控制模块的框图为 开始 检测模式 若为模式3 若为模式2 若为模式1 设定值取35 设定值取50 键盘摄入设定值 若不是 比较程序 比较程序 比较程序 若不是 结束 水温是否达成35摄氏度 水温是否达成50摄氏度 若是,调节PWM参数 若是,连续3分钟定期 3分钟是否已到 设定值取70 若是,设定值取70 比较程序 结束 比较程序 结束 五、实现 本次设计的功能板块分为四块,分别是温度
13、传感器感应模块、键盘输入模块、LCD显示模块、控制温度模块。 调试过程中,出现过不少问题,诸如: 1. 发现温度传感器的温度并不能有效地显示在LCD上 因素:温度传感器的程序有问题,延时没有用好。 解决方法:修改18B20中的延时程序。 2. 发现键盘的数字按下后,键盘没有反映。 因素:程序中键盘的按键辨认方法是线反转法,键盘的键值所相应的行与列不能有效接通。 解决方法:改用扫描法,键盘有了反映。 六、结论 本次设计的题目是水温控制系统,其重要思想是将水温控制在某一个设定的温度左右,误差不超过1度。本次设计所包含的基本功能如下:当有键值输入
14、时,判断模式,假如是模式1,则自动将温度被控对象的温度将被设定在设定值左右,来回往复波动。假如是模式2,则将温度升到50摄氏度,维持3分钟,然后升到70摄氏度维持,假如是模式3,则将温度升到35摄氏度,控制PWM参数,控制在每分钟2摄氏度,升到40摄氏度维持。本次设计中局限性之处就是LCD反映比较慢,误差还不太抱负,有待进一步改善。 本次设计历时2周左右,花费了大量的精力和时间,可以说其中包含了诸多的汗水和付出。通过翻阅书籍和不断地写程序调试,既增长了知识,又增长了经验。其过程中有苦有甜,局限性道也。最后感谢老师的指导和同学的帮助。 七、 附录1原理图 附
15、录2元件明细
序 号
名 称
型号参数
数量
备注
1
LCD
12864
1片
2
键盘按钮
16个
4
SSR
固态继电器
1个
5
加热棒
1个
250瓦
6
三极管
1个
7
单片机
89C52
1片
附录3电路程序
#include
16、clude
17、0,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,0x1
18、1,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,
19、 //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,0x
20、00,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
21、 //实 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,
22、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,
23、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
24、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,
25、 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
26、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,0x5
27、4,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
28、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(un
29、char 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
30、 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)
31、{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初始化
32、 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;
33、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
34、 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
35、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,
36、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(); yingd
37、a(); 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(t
38、emp!=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!=0
39、xf0) {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) {
40、 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) { d
41、elay1(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
42、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) {
43、 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;
44、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
45、<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
46、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
47、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
48、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)
49、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_
50、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;






