2025年4月8日 星期二 乙巳(蛇)年 正月初九 设为首页 加入收藏
rss
您当前的位置:首页 > 电子 > 单片机

MCS-51单片机温度控制系统的设计

时间:11-05来源:作者:点击数:21

一、项目介绍

注塑机是一种常用的制造设备,用于生产塑料制品。在注塑机的工作过程中,溶胶必须达到一定的温度才能被注入模具中进行成型。因此,在注塑机的生产过程中,温度控制是非常重要的一环。

本项目基于MCS-51单片机设计了一款温度控制系统,主控芯片采用STC89C52,温度传感器采用铂电阻。该系统主要应用于注塑机的溶胶射嘴头上进行加热控制,利用继电器控制加热器实现温度加热,控制系统检测温度是否到达设定阀值来控制继电器。

本项目的设计思路是,利用铂电阻温度传感器对溶胶进行实时温度监测,并将监测到的温度值通过LCD显示屏实时显示。控制器采用PID算法对溶胶温度进行精准控制,当温度低于设定阀值时,控制器将通过继电器控制加热器进行加热操作,直到温度达到设定阀值后停止加热操作。

通过本项目的应用,可以实现对注塑机的溶胶温度进行精准控制,从而提高注塑机的生产效率和产品质量。同时,该系统控制方式简单,易于操作和维护,具有较高的实用性和可靠性。

image-20230801114555401

二、技术说明和功能描述

【1】STC89C52单片机作为主控芯片,具有高性能和丰富的外设接口。

【2】铂电阻温度传感器用于测量溶胶射嘴头的温度,并将数据传输给单片机。

【3】继电器用于控制加热器的通断,实现温度加热。

【4】温度控制系统可以根据设定的温度阈值来判断是否需要进行加热,从而控制继电器的状态。

【5】系统可以通过LCD显示屏显示当前温度和设定的目标温度。

【6】当温度超过或低于设定的阈值时,系统可以触发报警装置进行警示。

三、系统设计思路

3.1 硬件选型说明

【1】主控芯片:STC89C52单片机

  • STC89C52是一款具有高性能和丰富外设接口的经典51系列单片机,适合中小型嵌入式系统应用。
  • 它具有8位CPU、8KB的内部FLASH存储器、256字节的RAM、3个定时器/计数器、串行通信接口等功能。
  • 这款单片机运算速度快,响应迅速,可满足本项目对性能和实时性的要求。

【2】温度传感器:铂电阻温度传感器

  • 铂电阻温度传感器是一种常见的温度传感器,具有稳定性好、精度高的特点。
  • 它的工作原理是通过测量电阻值的变化来确定温度变化,传感器的电阻值与温度呈线性关系。
  • 在本项目中,铂电阻温度传感器被用于测量溶胶射嘴头的温度,提供实时的温度数据给单片机进行控制。

【3】继电器:用于控制加热器

  • 继电器是一种电子开关设备,能够在小电流的控制信号下控制大电流的通断。
  • 在本项目中,继电器被用来控制加热器的通断状态,根据温度控制的需要进行加热或停止加热操作。

【4】LCD显示屏:用于显示温度和设定值

  • LCD显示屏是一种常见的数字显示装置,具有低功耗、可视角度广、反应快速等特点。
  • 在本项目中,LCD显示屏用于显示当前实际温度和设定的目标温度阈值,方便操作员进行观察和设置。

【5】按钮开关:用于设定目标温度阈值

  • 按钮开关是一种常用的输入设备,用于实现用户与系统的交互。
  • 在本项目中,按钮开关用于更新设定的目标温度阈值,供操作员根据需要进行调整。

【6】报警装置:用于温度异常警示

  • 报警装置能够发出声音或光信号,用于警示操作员温度超过或低于设定的阈值。
  • 在本项目中,报警装置用于提醒操作员注意温度异常,保证工作安全和质量。

3.2 设计思路

【1】硬件连接:将铂电阻温度传感器连接到单片机的模拟输入端口,将LCD显示屏连接到单片机的数据口,将继电器接在单片机的输出端口,通过继电器控制加热器的电源。

【2】温度采集:通过铂电阻温度传感器实时采集溶胶的温度信号,将信号转换为数字信号,通过单片机的模拟输入端口输入到单片机中。

【3】温度控制:使用PID算法对溶胶的温度进行精准控制。PID算法是一种经典的控制算法,通过对比实际温度和设定温度的差异,计算出控制器输出控制信号的大小来控制继电器的开关状态,从而实现对加热器的控制。

【4】温度显示:将温度值通过LCD显示屏实时显示,方便操作人员监测温度变化。

【5】控制器编程:使用C语言编写单片机的控制程序,实现温度采集、PID算法控制、温度显示等功能。

本项目的设计思路是基于MCS-51单片机和PID算法实现温度控制系统,通过铂电阻温度传感器实时采集温度信号,通过PID算法实现温度控制,通过LCD显示屏实现温度显示,最终通过继电器控制加热器实现温度加热控制。

四、代码实现

4.1 温度控制系统实现(PID算法)

使用STC89C52单片机、铂电阻温度传感器、PCF8591模数转换器和PID算法实现温度控制并控制继电器:

  • #include <reg52.h>
  • #define RELAY_PIN P1 // 继电器控制引脚
  • // 温度传感器连接引脚
  • sbit TEMP_SENSOR_PIN = P2^0;
  • // PCF8591模数转换器连接引脚
  • sbit PCF_SDA = P2^1; // I2C数据线
  • sbit PCF_SCL = P2^2; // I2C时钟线
  • sbit PCF_EOC = P2^3; // 转换结束标志
  • // PID参数
  • float kp = 1.0; // 比例系数
  • float ki = 0.5; // 积分系数
  • float kd = 0.2; // 微分系数
  • // 温度目标值
  • float targetTemp = 100.0;
  • // PID控制误差相关变量
  • float error = 0.0;
  • float prevError = 0.0;
  • float integral = 0.0;
  • float derivative = 0.0;
  • // PID控制输出
  • float output = 0.0;
  • // 设置PWM占空比函数
  • void setPwmDutyCycle(unsigned char dutyCycle) {
  • TH0 = 256 - dutyCycle; // 设置高位
  • TL0 = 256 - dutyCycle; // 设置低位
  • }
  • // 定时器0初始化函数
  • void timer0Init() {
  • TMOD = 0x01; // 定时器0工作在模式1(16位定时器)
  • TH0 = 0; // 最初赋初值
  • TL0 = 0;
  • TR0 = 1; // 定时器0开始计时
  • }
  • // I2C总线开始信号函数
  • void i2cStart() {
  • PCF_SDA = 1;
  • PCF_SCL = 1;
  • PCF_SDA = 0;
  • PCF_SCL = 0;
  • }
  • // I2C总线停止信号函数
  • void i2cStop() {
  • PCF_SDA = 0;
  • PCF_SCL = 1;
  • PCF_SDA = 1;
  • }
  • // I2C写数据函数
  • void i2cWriteByte(unsigned char dat) {
  • unsigned char i;
  • for (i = 0; i < 8; i++) {
  • PCF_SDA = (dat & 0x80) ? 1 : 0;
  • PCF_SCL = 1;
  • PCF_SCL = 0;
  • dat <<= 1;
  • }
  • PCF_SCL = 1;
  • PCF_SCL = 0;
  • PCF_SDA = 1;
  • }
  • // 从PCF8591读取温度值
  • unsigned char readTemperatureValue() {
  • unsigned char tempValue;
  • i2cStart();
  • i2cWriteByte(0x90); // PCF8591地址 + 写操作
  • i2cWriteByte(0x00); // 设置输入通道为0
  • i2cStart();
  • i2cWriteByte(0x91); // PCF8591地址 + 读操作
  • tempValue = P0; // 读取温度值
  • i2cStop();
  • return tempValue;
  • }
  • // PID控制函数
  • void performPIDControl() {
  • error = targetTemp - readTemperatureValue(); // 计算误差
  • integral += error; // 积分项
  • derivative = error - prevError; // 微分项
  • output = kp * error + ki * integral + kd * derivative; // PID输出
  • if (output < 0) {
  • output = 0;
  • } else if (output > 255) {
  • output = 255;
  • }
  • setPwmDutyCycle((unsigned char)output); // 设置PWM占空比
  • prevError = error; // 更新上一次误差
  • }
  • void main() {
  • timer0Init(); // 初始化定时器0
  • setPwmDutyCycle(0); // 初始化PWM占空比为0
  • while (1) {
  • performPIDControl(); // 进行PID控制
  • if (readTemperatureValue() >= targetTemp) {
  • RELAY_PIN = 0; // 继电器断开,停止加热
  • } else {
  • RELAY_PIN = 1; // 继电器闭合,进行加热
  • }
  • }
  • }

以上代码是温度控制系统实现代码,使用PID算法根据目标温度和当前温度进行控制,并通过继电器控制加热器的通断。需要通过I2C总线与PCF8591模数转换器进行通信,读取铂电阻温度传感器的数据。

4.2 LCD1602显示屏

下面是使用STC89C52单片机和LCD1602液晶显示屏实现数字显示并封装为函数调用的代码:

  • #include <reg52.h>
  • #define LCD_RS P2_0 // 液晶RS引脚
  • #define LCD_RW P2_1 // 液晶RW引脚
  • #define LCD_EN P2_2 // 液晶EN引脚
  • #define LCD_DATA P0 // 液晶数据总线
  • // 延时函数
  • void delay(unsigned int t) {
  • unsigned int i, j;
  • for (i = 0; i < t; i++) {
  • for (j = 0; j < 110; j++);
  • }
  • }
  • // 液晶写命令函数
  • void lcdWriteCmd(unsigned char cmd) {
  • LCD_RS = 0; // 设置为写命令模式
  • LCD_RW = 0; // 设置为写入模式
  • LCD_DATA = cmd; // 写入命令
  • LCD_EN = 1; // 使能
  • delay(1); // 延时
  • LCD_EN = 0; // 禁止
  • delay(1); // 延时
  • }
  • // 液晶写数据函数
  • void lcdWriteData(unsigned char dat) {
  • LCD_RS = 1; // 设置为写数据模式
  • LCD_RW = 0; // 设置为写入模式
  • LCD_DATA = dat; // 写入数据
  • LCD_EN = 1; // 使能
  • delay(1); // 延时
  • LCD_EN = 0; // 禁止
  • delay(1); // 延时
  • }
  • // 液晶初始化函数
  • void lcdInit() {
  • lcdWriteCmd(0x38); // 设置16x2显示,5x7点阵,8位数据接口
  • lcdWriteCmd(0x0C); // 显示开,光标关闭
  • lcdWriteCmd(0x06); // 光标右移
  • lcdWriteCmd(0x01); // 清屏
  • }
  • // 在液晶上显示数字函数
  • void lcdDisplayNumber(unsigned int num) {
  • unsigned char i;
  • unsigned char buffer[5]; // 缓冲区,最大支持5位数
  • if (num == 0) {
  • lcdWriteData('0'); // 数字0特殊处理
  • return;
  • }
  • for (i = 0; i < 5; i++) {
  • buffer[i] = num % 10; // 从低位到高位依次取余数
  • num /= 10;
  • }
  • for (i = 5; i > 0; i--) {
  • if (buffer[i - 1] != 0 || i == 1) { // 从高位开始显示直到遇到非零数字或者个位数
  • lcdWriteData(buffer[i - 1] + '0'); // 显示数字
  • }
  • }
  • }
  • void main() {
  • lcdInit(); // 初始化液晶
  • while (1) {
  • unsigned int num = 12345; // 要显示的数字
  • lcdWriteCmd(0x80); // 设置光标位置为第一行第一个字符
  • lcdDisplayNumber(num); // 显示数字
  • while (1); // 循环显示
  • }
  • }

以上代码是LCD数字显示程序,使用LCD1602液晶显示屏和STC89C52单片机,通过封装函数调用来实现数字在液晶屏上的显示。需要进行液晶的初始化操作,使用lcdDisplayNumber函数将要显示的数字传入。在main函数中给出了一个例子,以连续循环显示数字12345为示例。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐