#include <reg52.h>

#define uchar unsigned char #define uint unsigned int

// 18B20温度传感器相关 sbit DQ = P1^4; // 定义18B20的数据引脚 uchar temp_byte1, temp_byte2, temp_sign; // 存储读取到的温度数据 int temp;

// PID算法参数 float Kp = 0.5, Ki = 0.2, Kd = 0.1; float error, last_error = 0, integral = 0, derivative;

// 目标温度 int target_temp = 25;

// PWM输出相关 sbit PWM = P1^5; // 定义PWM输出引脚 uchar pwm_value = 0; // PWM输出占空比

// 延时函数,用于等待18B20转换完成 void delay(uint us) { while(us--); }

// 18B20初始化函数,发送复位信号并检测18B20是否存在 uchar init_18B20(void) { uchar i; DQ = 1; delay(1); DQ = 0; delay(300); DQ = 1; delay(30); i = DQ; delay(200); return i; }

// 18B20读取温度函数 void read_temp(void) { uchar i; bit j; DQ = 0; delay(1); DQ = 1; delay(1); j = DQ; delay(1); DQ = 0; delay(1); if(j == 0) { DQ = 1; delay(1); DQ = 0; delay(1); for(i=0;i<8;i++) { j = DQ; delay(1); temp_byte1 >>= 1; if(j) temp_byte1 |= 0x80; delay(1); } for(i=0;i<8;i++) { j = DQ; delay(1); temp_byte2 >>= 1; if(j) temp_byte2 |= 0x80; delay(1); } for(i=0;i<8;i++) { j = DQ; delay(1); temp_sign >>= 1; if(j) temp_sign |= 0x80; delay(1); } } }

// PID控制函数 void PID_control(void) { error = target_temp - temp; // 计算误差 integral += error; // 累加误差 derivative = error - last_error; // 计算误差变化率 last_error = error; pwm_value = Kperror + Kiintegral + Kdderivative; // 计算PWM输出占空比 if(pwm_value > 100) pwm_value = 100; // 控制PWM输出占空比范围在0-100之间 if(pwm_value < 0) pwm_value = 0; PWM = 1; // 输出PWM信号 delay(pwm_value10); // 延时,控制PWM输出占空比 PWM = 0; // PWM输出为低电平 delay((100-pwm_value)*10); // 延时,控制PWM输出占空比 }

void main() { while(1) { if(init_18B20()) { read_temp(); // 读取温度传感器数据 temp = temp_byte1; // 将读取到的数据转换为实际温度值 temp = (temp<<8) | temp_byte2; if(temp_sign == 0) temp = temp0.0625; else { temp = (~temp) + 1; temp = temp0.0625; temp = -temp; } PID_control(); // 进行PID控制 } delay(1000); // 等待1秒钟 }

基于8051单片机和18B20传感器的PID恒温控制程序

原文地址: https://www.cveoy.top/t/topic/mX6S 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录