• 方案介紹
    • 一、項目介紹
    • 二、技術說明和功能描述
    • 三、系統(tǒng)設計思路
    • 四、代碼實現
  • 附件下載
  • 相關推薦
申請入駐 產業(yè)圖譜

MCS-51單片機溫度控制系統(tǒng)的設計

04/29 11:35
867
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

更多詳細資料請聯系.docx

共1個文件

一、項目介紹

注塑機是一種常用的制造設備,用于生產塑料制品。在注塑機的工作過程中,溶膠必須達到一定的溫度才能被注入模具中進行成型。因此,在注塑機的生產過程中,溫度控制是非常重要的一環(huán)。

本項目基于MCS-51單片機設計了一款溫度控制系統(tǒng),主控芯片采用STC89C52溫度傳感器采用鉑電阻。該系統(tǒng)主要應用于注塑機的溶膠射嘴頭上進行加熱控制,利用繼電器控制加熱器實現溫度加熱,控制系統(tǒng)檢測溫度是否到達設定閥值來控制繼電器。

本項目的設計思路是,利用鉑電阻溫度傳感器對溶膠進行實時溫度監(jiān)測,并將監(jiān)測到的溫度值通過LCD顯示屏實時顯示。控制器采用PID算法對溶膠溫度進行精準控制,當溫度低于設定閥值時,控制器將通過繼電器控制加熱器進行加熱操作,直到溫度達到設定閥值后停止加熱操作。

通過本項目的應用,可以實現對注塑機的溶膠溫度進行精準控制,從而提高注塑機的生產效率和產品質量。同時,該系統(tǒng)控制方式簡單,易于操作和維護,具有較高的實用性和可靠性。

image-20230801114555401

二、技術說明和功能描述

【1】STC89C52單片機作為主控芯片,具有高性能和豐富的外設接口。

【2】鉑電阻溫度傳感器用于測量溶膠射嘴頭的溫度,并將數據傳輸給單片機。

【3】繼電器用于控制加熱器的通斷,實現溫度加熱。

【4】溫度控制系統(tǒng)可以根據設定的溫度閾值來判斷是否需要進行加熱,從而控制繼電器的狀態(tài)。

【5】系統(tǒng)可以通過LCD顯示屏顯示當前溫度和設定的目標溫度。

【6】當溫度超過或低于設定的閾值時,系統(tǒng)可以觸發(fā)報警裝置進行警示。

三、系統(tǒng)設計思路

3.1 硬件選型說明

【1】主控芯片:STC89C52單片機

  • STC89C52是一款具有高性能和豐富外設接口的經典51系列單片機,適合中小型嵌入式系統(tǒng)應用。
  • 它具有8位CPU、8KB的內部FLASH存儲器、256字節(jié)的RAM、3個定時器/計數器、串行通信接口等功能。
  • 這款單片機運算速度快,響應迅速,可滿足本項目對性能和實時性的要求。

【2】溫度傳感器:鉑電阻溫度傳感器

  • 鉑電阻溫度傳感器是一種常見的溫度傳感器,具有穩(wěn)定性好、精度高的特點。
  • 它的工作原理是通過測量電阻值的變化來確定溫度變化,傳感器的電阻值與溫度呈線性關系。
  • 在本項目中,鉑電阻溫度傳感器被用于測量溶膠射嘴頭的溫度,提供實時的溫度數據給單片機進行控制。

【3】繼電器:用于控制加熱器

  • 繼電器是一種電子開關設備,能夠在小電流控制信號下控制大電流的通斷。
  • 在本項目中,繼電器被用來控制加熱器的通斷狀態(tài),根據溫度控制的需要進行加熱或停止加熱操作。

【4】LCD顯示屏:用于顯示溫度和設定值

  • LCD顯示屏是一種常見的數字顯示裝置,具有低功耗、可視角度廣、反應快速等特點。
  • 在本項目中,LCD顯示屏用于顯示當前實際溫度和設定的目標溫度閾值,方便操作員進行觀察和設置。

【5】按鈕開關:用于設定目標溫度閾值

  • 按鈕開關是一種常用的輸入設備,用于實現用戶與系統(tǒng)的交互。
  • 在本項目中,按鈕開關用于更新設定的目標溫度閾值,供操作員根據需要進行調整。

【6】報警裝置:用于溫度異常警示

  • 報警裝置能夠發(fā)出聲音或光信號,用于警示操作員溫度超過或低于設定的閾值。
  • 在本項目中,報警裝置用于提醒操作員注意溫度異常,保證工作安全和質量。

3.2 設計思路

【1】硬件連接:將鉑電阻溫度傳感器連接到單片機的模擬輸入端口,將LCD顯示屏連接到單片機的數據口,將繼電器接在單片機的輸出端口,通過繼電器控制加熱器的電源。

【2】溫度采集:通過鉑電阻溫度傳感器實時采集溶膠的溫度信號,將信號轉換為數字信號,通過單片機的模擬輸入端口輸入到單片機中。

【3】溫度控制:使用PID算法對溶膠的溫度進行精準控制。PID算法是一種經典的控制算法,通過對比實際溫度和設定溫度的差異,計算出控制器輸出控制信號的大小來控制繼電器的開關狀態(tài),從而實現對加熱器的控制。

【4】溫度顯示:將溫度值通過LCD顯示屏實時顯示,方便操作人員監(jiān)測溫度變化。

【5】控制器編程:使用C語言編寫單片機的控制程序,實現溫度采集、PID算法控制、溫度顯示等功能。

本項目的設計思路是基于MCS-51單片機和PID算法實現溫度控制系統(tǒng),通過鉑電阻溫度傳感器實時采集溫度信號,通過PID算法實現溫度控制,通過LCD顯示屏實現溫度顯示,最終通過繼電器控制加熱器實現溫度加熱控制。

四、代碼實現

4.1 溫度控制系統(tǒng)實現(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;    // 繼電器閉合,進行加熱
        }
    }
}

以上代碼是溫度控制系統(tǒng)實現代碼,使用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];    // 緩沖區(qū),最大支持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);    // 循環(huán)顯示
    }
}

以上代碼是LCD數字顯示程序,使用LCD1602液晶顯示屏和STC89C52單片機,通過封裝函數調用來實現數字在液晶屏上的顯示。需要進行液晶的初始化操作,使用lcdDisplayNumber函數將要顯示的數字傳入。在main函數中給出了一個例子,以連續(xù)循環(huán)顯示數字12345為示例。

  • 更多詳細資料請聯系.docx
    下載

相關推薦