随着科学技术的发展,模糊控制的温度控制系统也越来越先进,对温度的控制精度要求也越来越高,模糊控制针对被控对象存在的滞后、时变、非线性等特点,将模糊控制算法引入温度控制系统,改善了系統的控制效果, 在工业电阻温度中有非常好的应用前景。
本毕业设计研究的是基于单片机实现对温度的检测与控制,系统能够实时显示当前的温度值,并可以通过按键设定将要控制的温度值。
首先,本设计系统采用单片机作为信息处理中心,通过传感器,A/D转换器,以及对单片机的编程,完成信号输入检测,温度分析处理及温度显示等功能。利用单片机系统来实现模糊控制的温度控制系统的设计和分析。
其次,系统组成包括传感器,键盘输入,单片机电路,显示电路和LED显示等部分。此次的重点和难点是单片机I/O端口的输出电流难以点亮数码管和模糊控制规则库的建立,本设计通过当检测到当前温度时,单片机计算出误差和误差变化率,在通过查询根据模糊控制规则得出的控制表,找出正确,有效的控制量代码,再按照对应的控制方法发出控制信号,控制电热丝和电风扇执行相应的动作。
最后,对这个毕业设计课题在这一段时间里取得的成就进行总结,并提出和改进了一些模块的功能。
关键词:模糊控制 单片机 传感器 控制量代码
*/
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P1 ^ 4;
sbit SET = P1 ^ 0;
sbit INC_A = P1 ^ 1;
sbit INC_B = P1 ^ 2;
sbit temp_inc = P3 ^ 0;
sbit temp_dec = P3 ^ 1;
sbit GAO = P3 ^ 2;
sbit DI = P3 ^ 3;
sbit NOR = P3 ^ 4;
unsigned char flag, flaga, SET_A = 2, SET_B = 5, e1 = 0;
unsigned char TCNT, U, set_tempA, set_tempB, realtemp, settemp;
/* 行扫描数组 */
uchar code scan[8] = { 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf,
0xbf, 0x7f }; /* row0--row7 */
/* 数码管显示的段码 */
uchar code table[] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F,
0x6F, 0x40, 0x39, 0x00, 0x78, 0x79 }; /* ,-,C,kong,t,e */
uchar code ditab[16] = { 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x06,
0x06, 0x07, 0x08, 0x08, 0x09, 0x09 }; /* 小数显示查询表 */
uchar code fuzzy[21][11] = { { 5, 5, 5, 5, 5, 5, 4, 3, 2, 1, 1 }, { 5, 5, 5, 5, 5, 5, 4, 2, 2, 1, 1 },
{ 5, 5, 5, 5, 5, 5, 4, 2, 2, 1, 1 },
{ 5, 5, 5, 5, 5, 5, 4, 2, 1, 1, 1 },
{ 5, 5, 5, 5, 5, 5, 4, 2, 1, 1, 1 },
{ 5, 5, 5, 5, 5, 5, 4, 2, 1, 1, 1 },
{ 5, 5, 5, 4, 4, 4, 3, 2, 1, 1, 1 },
{ 5, 5, 5, 4, 4, 4, 3, 2, 1, 1, 1 },
{ 5, 5, 4, 4, 4, 3, 2, 2, 1, 0, 0 },
{ 5, 5, 4, 4, 3, 2, 1, 1, 1, 0, 0 },
{ 4, 4, 3, 3, 2, 1, 1, 1, 0, 0, 0 },
{ 3, 3, 2, 2, 1, 1, 1, 0, 0, 0, 0 },
{ 2, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0 },
{ 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0 },
{ 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 } };
uchar dispbuf[8]; /* 显示缓冲区 */
uchar temper[2]; /* 存放温度的数组 */