功能介绍:
0.本系统采用STC89C52作为单片机
1.LCD1602液晶实时显示温度/PID参数/设定的温度上下限/PWM输出/通信地址
2.当温度超过上下限阈值时,蜂鸣器报警
3.采用增量式PID算法控制当前温度。
4.定时向串口发送当前温度
5.可通过串口发送命令更改配置参数
6.采用DC002作为电源接口可直接输入5V给整个系统供电
原理图:
PCB :
主程序:
#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include <stdio.h>
#include "delay.h"
#include "pid.h"
#include "tlc0832.h"
#include "oled_iic.h"
#include "math.h"
/************************* 宏定义 *************************/
#define ON 0
#define OFF 1
#define T25 (273.15+25) //T25
#define Bx (4050.0) //B值
#define Ka (273.15) //绝对零度
#define Rp (10000.0) //ntc串联电阻
#define ntcR25 (10000.0) //25度时电阻
#define FRAME_HEADER 0x1a
#define FRAME_FUCTION_TEMP 0x00 //功能位,温度
#define FRAME_FUCTION_TARGET 0x01 //功能位,目标温度
#define FRAME_FUCTION_KP 0x02 //功能位,Kp
#define FRAME_FUCTION_KI 0x03 //功能位,Ki
#define FRAME_FUCTION_KD 0x04 //功能位,Kd
#define FRAME_FUCTION_TEMP_MIN 0x05 //功能位,温度下限
#define FRAME_FUCTION_TEMP_MAX 0x06 //功能位,温度上限
#define FRAME_FUCTION_ADDR 0x07 //功能位,通信地址
#define FRAME_END 0x3f
/************************* 引脚定义 *************************/
sbit BUZZER = P3^7;
sbit L9110_A = P1^3;
sbit L9110_B = P1^4;
/************************* 变量定义 *************************/
PID_Calibration_Def xdata PID_Calibration; //PID结构体
PID_State_Def xdata PID_State; //PID结构体
float temperature; //实际温度
float f_tempVolt = 0; //温度对应电压
float current = 0;
float Rt = 0;
int xdata tempMin = 20; //温度下限
int xdata tempMax = 50; //温度上限
char xdata dis0[16]; //定义显示区域临时存储数组
bit refreshFlag = 1; //刷新标志
unsigned char setIndex = 0;
unsigned char PWMCnt = 0;
unsigned char address = 0; //通信地址
/************************* 函数声明 *************************/
void Timer0_Init(void); //函数声明
void KeyProcess(void); //按键处理
void Set_PID_Parameter(void); //PID参数初始化
void UART_Init(void); //串口初始化
void UART_SendByte(unsigned char dat); //串口发送单字节数据
// void UART_SendStr(unsigned char *s, unsigned char length); //发送定长度字符串
void SendData(unsigned char address, float temperature); //串口发送数据
void main(void)
{
/************************* 初始化 *************************/
Timer0_Init();
OLED_Init();
OLED_Clear();
UART_Init();
Set_PID_Parameter();
/************************* 主循环 *************************/
while (1)