• 方案介紹
    • 一、項(xiàng)目介紹
    • 二、技術(shù)說(shuō)明和功能描述
    • 三、系統(tǒng)設(shè)計(jì)思路
    • 四、代碼實(shí)現(xiàn)
  • 附件下載
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

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

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

更多詳細(xì)資料請(qǐng)聯(lián)系.docx

共1個(gè)文件

一、項(xiàng)目介紹

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

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

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

通過(guò)本項(xiàng)目的應(yīng)用,可以實(shí)現(xiàn)對(duì)注塑機(jī)的溶膠溫度進(jìn)行精準(zhǔn)控制,從而提高注塑機(jī)的生產(chǎn)效率和產(chǎn)品質(zhì)量。同時(shí),該系統(tǒng)控制方式簡(jiǎn)單,易于操作和維護(hù),具有較高的實(shí)用性和可靠性。

image-20230801114555401

二、技術(shù)說(shuō)明和功能描述

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

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

【3】繼電器用于控制加熱器的通斷,實(shí)現(xiàn)溫度加熱。

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

【5】系統(tǒng)可以通過(guò)LCD顯示屏顯示當(dāng)前溫度和設(shè)定的目標(biāo)溫度。

【6】當(dāng)溫度超過(guò)或低于設(shè)定的閾值時(shí),系統(tǒng)可以觸發(fā)報(bào)警裝置進(jìn)行警示。

三、系統(tǒng)設(shè)計(jì)思路

3.1 硬件選型說(shuō)明

【1】主控芯片:STC89C52單片機(jī)

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

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

  • 鉑電阻溫度傳感器是一種常見(jiàn)的溫度傳感器,具有穩(wěn)定性好、精度高的特點(diǎn)。
  • 它的工作原理是通過(guò)測(cè)量電阻值的變化來(lái)確定溫度變化,傳感器的電阻值與溫度呈線性關(guān)系。
  • 在本項(xiàng)目中,鉑電阻溫度傳感器被用于測(cè)量溶膠射嘴頭的溫度,提供實(shí)時(shí)的溫度數(shù)據(jù)給單片機(jī)進(jìn)行控制。

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

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

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

  • LCD顯示屏是一種常見(jiàn)的數(shù)字顯示裝置,具有低功耗、可視角度廣、反應(yīng)快速等特點(diǎn)。
  • 在本項(xiàng)目中,LCD顯示屏用于顯示當(dāng)前實(shí)際溫度和設(shè)定的目標(biāo)溫度閾值,方便操作員進(jìn)行觀察和設(shè)置。

【5】按鈕開關(guān):用于設(shè)定目標(biāo)溫度閾值

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

【6】報(bào)警裝置:用于溫度異常警示

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

3.2 設(shè)計(jì)思路

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

【2】溫度采集:通過(guò)鉑電阻溫度傳感器實(shí)時(shí)采集溶膠的溫度信號(hào),將信號(hào)轉(zhuǎn)換為數(shù)字信號(hào),通過(guò)單片機(jī)的模擬輸入端口輸入到單片機(jī)中。

【3】溫度控制:使用PID算法對(duì)溶膠的溫度進(jìn)行精準(zhǔn)控制。PID算法是一種經(jīng)典的控制算法,通過(guò)對(duì)比實(shí)際溫度和設(shè)定溫度的差異,計(jì)算出控制器輸出控制信號(hào)的大小來(lái)控制繼電器的開關(guān)狀態(tài),從而實(shí)現(xiàn)對(duì)加熱器的控制。

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

【5】控制器編程:使用C語(yǔ)言編寫單片機(jī)的控制程序,實(shí)現(xiàn)溫度采集、PID算法控制、溫度顯示等功能。

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

四、代碼實(shí)現(xiàn)

4.1 溫度控制系統(tǒng)實(shí)現(xiàn)(PID算法)

使用STC89C52單片機(jī)、鉑電阻溫度傳感器、PCF8591模數(shù)轉(zhuǎn)換器和PID算法實(shí)現(xiàn)溫度控制并控制繼電器:

#include <reg52.h>

#define RELAY_PIN P1   // 繼電器控制引腳

// 溫度傳感器連接引腳
sbit TEMP_SENSOR_PIN = P2^0;

// PCF8591模數(shù)轉(zhuǎn)換器連接引腳
sbit PCF_SDA = P2^1;    // I2C數(shù)據(jù)線
sbit PCF_SCL = P2^2;    // I2C時(shí)鐘線
sbit PCF_EOC = P2^3;    // 轉(zhuǎn)換結(jié)束標(biāo)志

// PID參數(shù)
float kp = 1.0;    // 比例系數(shù)
float ki = 0.5;    // 積分系數(shù)
float kd = 0.2;    // 微分系數(shù)

// 溫度目標(biāo)值
float targetTemp = 100.0;

// PID控制誤差相關(guān)變量
float error = 0.0;
float prevError = 0.0;
float integral = 0.0;
float derivative = 0.0;

// PID控制輸出
float output = 0.0;

// 設(shè)置PWM占空比函數(shù)
void setPwmDutyCycle(unsigned char dutyCycle) {
    TH0 = 256 - dutyCycle;    // 設(shè)置高位
    TL0 = 256 - dutyCycle;    // 設(shè)置低位
}

// 定時(shí)器0初始化函數(shù)
void timer0Init() {
    TMOD = 0x01;    // 定時(shí)器0工作在模式1(16位定時(shí)器)
    TH0 = 0;       // 最初賦初值
    TL0 = 0;
    TR0 = 1;       // 定時(shí)器0開始計(jì)時(shí)
}

// I2C總線開始信號(hào)函數(shù)
void i2cStart() {
    PCF_SDA = 1;
    PCF_SCL = 1;
    PCF_SDA = 0;
    PCF_SCL = 0;
}

// I2C總線停止信號(hào)函數(shù)
void i2cStop() {
    PCF_SDA = 0;
    PCF_SCL = 1;
    PCF_SDA = 1;
}

// I2C寫數(shù)據(jù)函數(shù)
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);    // 設(shè)置輸入通道為0
    i2cStart();
    i2cWriteByte(0x91);    // PCF8591地址 + 讀操作
    tempValue = P0;    // 讀取溫度值
    i2cStop();
    return tempValue;
}

// PID控制函數(shù)
void performPIDControl() {
    error = targetTemp - readTemperatureValue();    // 計(jì)算誤差
    integral += error;    // 積分項(xiàng)
    derivative = error - prevError;    // 微分項(xiàng)
    output = kp * error + ki * integral + kd * derivative;    // PID輸出
    if (output < 0) {
        output = 0;
    } else if (output > 255) {
        output = 255;
    }
    setPwmDutyCycle((unsigned char)output);    // 設(shè)置PWM占空比
    prevError = error;    // 更新上一次誤差
}

void main() {
    timer0Init();    // 初始化定時(shí)器0
    setPwmDutyCycle(0);    // 初始化PWM占空比為0

    while (1) {
        performPIDControl();    // 進(jìn)行PID控制

        if (readTemperatureValue() >= targetTemp) {
            RELAY_PIN = 0;    // 繼電器斷開,停止加熱
        } else {
            RELAY_PIN = 1;    // 繼電器閉合,進(jìn)行加熱
        }
    }
}

以上代碼是溫度控制系統(tǒng)實(shí)現(xiàn)代碼,使用PID算法根據(jù)目標(biāo)溫度和當(dāng)前溫度進(jìn)行控制,并通過(guò)繼電器控制加熱器的通斷。需要通過(guò)I2C總線與PCF8591模數(shù)轉(zhuǎn)換器進(jìn)行通信,讀取鉑電阻溫度傳感器的數(shù)據(jù)。

4.2 LCD1602顯示屏

下面是使用STC89C52單片機(jī)和LCD1602液晶顯示屏實(shí)現(xiàn)數(shù)字顯示并封裝為函數(shù)調(diào)用的代碼:

#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    // 液晶數(shù)據(jù)總線

// 延時(shí)函數(shù)
void delay(unsigned int t) {
    unsigned int i, j;
    for (i = 0; i < t; i++) {
        for (j = 0; j < 110; j++);
    }
}

// 液晶寫命令函數(shù)
void lcdWriteCmd(unsigned char cmd) {
    LCD_RS = 0;    // 設(shè)置為寫命令模式
    LCD_RW = 0;    // 設(shè)置為寫入模式
    LCD_DATA = cmd;    // 寫入命令
    LCD_EN = 1;    // 使能
    delay(1);    // 延時(shí)
    LCD_EN = 0;    // 禁止
    delay(1);    // 延時(shí)
}

// 液晶寫數(shù)據(jù)函數(shù)
void lcdWriteData(unsigned char dat) {
    LCD_RS = 1;    // 設(shè)置為寫數(shù)據(jù)模式
    LCD_RW = 0;    // 設(shè)置為寫入模式
    LCD_DATA = dat;    // 寫入數(shù)據(jù)
    LCD_EN = 1;    // 使能
    delay(1);    // 延時(shí)
    LCD_EN = 0;    // 禁止
    delay(1);    // 延時(shí)
}

// 液晶初始化函數(shù)
void lcdInit() {
    lcdWriteCmd(0x38);    // 設(shè)置16x2顯示,5x7點(diǎn)陣,8位數(shù)據(jù)接口
    lcdWriteCmd(0x0C);    // 顯示開,光標(biāo)關(guān)閉
    lcdWriteCmd(0x06);    // 光標(biāo)右移
    lcdWriteCmd(0x01);    // 清屏
}

// 在液晶上顯示數(shù)字函數(shù)
void lcdDisplayNumber(unsigned int num) {
    unsigned char i;
    unsigned char buffer[5];    // 緩沖區(qū),最大支持5位數(shù)

    if (num == 0) {
        lcdWriteData('0');    // 數(shù)字0特殊處理
        return;
    }

    for (i = 0; i < 5; i++) {
        buffer[i] = num % 10;    // 從低位到高位依次取余數(shù)
        num /= 10;
    }

    for (i = 5; i > 0; i--) {
        if (buffer[i - 1] != 0 || i == 1) {    // 從高位開始顯示直到遇到非零數(shù)字或者個(gè)位數(shù)
            lcdWriteData(buffer[i - 1] + '0');    // 顯示數(shù)字
        }
    }
}

void main() {
    lcdInit();    // 初始化液晶

    while (1) {
        unsigned int num = 12345;    // 要顯示的數(shù)字
        lcdWriteCmd(0x80);    // 設(shè)置光標(biāo)位置為第一行第一個(gè)字符
        lcdDisplayNumber(num);    // 顯示數(shù)字

        while (1);    // 循環(huán)顯示
    }
}

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

  • 更多詳細(xì)資料請(qǐng)聯(lián)系.docx
    下載

相關(guān)推薦