温控自动烘焙系统的研究与实现
溫控自動烘焙系統的研究與實現
茶葉自動烘焙系統的研究與實現,研究了茶葉自動烘焙系統的基本原理和系統框圖,通過溫度檢測模塊,能實時檢測三個不同溫度數據,并將數據通過藍牙模塊傳輸到電腦。利用溫度控制電路,采用PID算法、51單片機進行控制及數據處理,能精確實時控制溫度。系統主要51單片機最小系統、藍牙模塊、溫度傳感模塊、驅動顯示電路、輸出控制電路、電源電路、儲存電路、報警電路和按鍵電路輸出等組成。利用所設計出的茶葉自動烘焙系統,對烘焙中的茶葉采集溫度,當時溫度過高時能自動控制停止加溫。此系統具有易控制、工作可靠、測量精度高的優點,可實時檢測、控制。
關鍵詞:溫度檢測,溫度控制,PID算法,數據傳輸
Research and implementation of automatic tea baking system
Automatic tea baking system research and implementation introduces the automatic tea baking system basic principle and system block diagram.The system can real-time monitoring three different temperature data and transmits the data to a computer thought by Bluetooth module.The system is use the temperature control circuit and PID algorithm and 51 single-chip microcomputer control and data processing to accurately control the temperature. The system is mainly composed of 51 single chip microcomputer system, Bluetooth module, temperature sensor module, driver display circuit, output control circuit, power circuit, storage circuit, alarm circuit and key circuit output. The tea automatic baking system is used to collect the temperature of the tea in the baking process. This system has the advantages of easy control, reliable operation, high measurement accuracy, real-time detection and control.
Key Words: Temperature measurement, temperature control, PID algorithm, data transmission
代碼+論文下載地址下載地址
目錄
第1章 緒論 1
1.1 研究背景 1
1.2 研究意義 1
1.3 研究內容 2
第2章 系統硬件電路設計 3
2.1 電路總體方案 3
2.2 單片機最小系統 3
2.2.1 STC89C51芯片 3
2.2.2 復位電路 3
2.2.3 晶振電路 4
2.3 驅動顯示電路及報警電路 4
2.3.1 LCD液晶屏顯示電路 4
2.3.2 蜂鳴器和LED指示 6
2.4 DS18B20溫度傳感器 7
2.5 AT24C01存儲芯片 8
2.6 G5LA-14 繼電器 8
2.7 HC-05藍牙模塊 9
第3章 系統程序設計 11
3.1 主程序 11
3.2 狀態顯示子程序 13
3.3 溫度設定子程序 14
3.4 溫度比較子程序 15
3.5 PID控制器 16
3.6 串口數據傳輸部分程序 1
第4章 系統測試 1
4.1 模塊測試 1
4.2 系統功能 1
結論 2
參考文獻 3
致謝 4
附錄1 部分關鍵源碼及解釋 5
附錄2 系統原理圖 23
附錄3 英文文獻翻譯 28
電路總體方案
電路總體框圖。在設計時我發現藍牙模塊適合傳輸小數據,相對Wifi來說,使用藍牙不需要使用網絡,因此采用藍牙模塊設計。與電腦和手機的連接都很方便。
主程序
主程序的主要功能是負責讀出溫度值、處理溫度值、在LCD液晶屏上顯示溫度值和并控制子程序輸出。按鍵設定溫度,當溫度傳感器故障時,蜂鳴器發聲報警,如果沒有故障則正常顯示,控制繼電器開關。如圖3.1主程序流程圖。
溫度設定子程序
溫度設定子程序用于處理按鍵,用于設定想要設置的溫度值
系統測試
4.1 模塊測試
溫度采集模塊的測試:當實際溫度值變化時,LCD同步顯示實際溫度,采集模塊正常工作。
LCD顯示測試:首先觀察LCD有無外部損壞,接著上電,LCD液晶屏會顯示溫度1、溫度2、溫度3的溫度,按下按鍵,觀察顯示屏上顯示出的設置set1是否變換set2、set3。經測試可LCD顯示屏正常工作。
按鍵測試:按鍵長按時,數據變動一次,按鍵短按時數據根據按按鍵的次數改變,經檢測按鍵正常工作。
蜂鳴器發聲測試:將溫度傳感模塊拔掉模擬溫度傳感器故障,蜂鳴器發出報警的聲音,蜂鳴器正常工作。
溫度控制模塊的測試:設置好設定溫度,當茶葉實際溫度低于設定溫度,繼電器打開,模擬開始加熱茶葉溫度,當茶葉實際溫度等于或高于設定溫度,繼電器關閉,結果說明溫度控制模塊工作正常。
藍牙模塊測試:通過串口能將數據傳輸到電腦和手機上,藍牙模塊正常工作。
4.2 系統功能
開機后再液晶屏上顯示當前的狀態,包括實際溫度與狀態。通過獨立按鍵設置需要達到的溫度值,s3是加鍵,s4是減鍵,s5是確定鍵,s6是設置鍵,按確定鍵后,當實際溫度小于設置溫度時,屏幕顯示加熱與實際溫度,并打開加熱管控制繼電器,當實際溫度高于設置溫度時,顯示恒溫與實際溫度,并關閉加熱管。當溫度傳感器故障時,在屏幕上顯示液位異常,并蜂鳴器報警。不管在任何時候都可以對溫度值進行設置,設置后馬上更新狀態。該畢業設計是一個硬件,里面有包括了單片機最小系統、藍牙模塊、溫度傳感模塊、驅動顯示電路、輸出控制電路、電源電路、儲存電路、報警電路和按鍵電路輸出等各個系統和電路。因此,系統功能還包括復位功能,儲存功能,報警功能,顯示功能等各項。外部繼電器控制好連接了一個加熱管,實際上是由熱得快做出來的,把熱得快剪成兩份,一份帶著插頭,另一份帶著加熱管,分開裝進輸出控制電路里,加熱管由繼電器控制開關,插頭插在220V電源上,給加熱管提供能量,由于安全原因,并沒有直接測試加熱功能。
部分代碼
#include "LCD1602.h"
#include "UART.H"
#include<intrins.h>
#include<math.h>
#include<string.h>
#include <stdio.h>struct PID {
unsigned int SetPoint; // 設定目標 Desired Value
unsigned int Proportion; // 比例常數 Proportional Const
unsigned int Integral; // 積分常數 Integral Const
unsigned int Derivative; // 微分常數 Derivative Const
unsigned int LastError; // Error[-1]
unsigned int PrevError; // Error[-2]
unsigned int SumError; // Sums of Errors
};struct PID spid; // PID Control Structure
unsigned int rout; // PID Response (Output)
unsigned int rin; // PID Feedback (Input)unsigned char high_time,low_time,count=0;//占空比調節參數
unsigned char high_time1,low_time1,count1=0;//占空比調節參數
unsigned char high_time2,low_time2,count2=0;//占空比調節參數sbit bell=P3^6; //蜂鳴器
sbit temper_relay=P2^3; //加熱電磁閥
sbit temper_relay1=P2^4; //加熱電磁閥
sbit temper_relay2=P2^5; //加熱電磁閥uint real_temper=0; //實際溫度值
uint real_temper1=0; //實際溫度值
uint real_temper2=0; //實際溫度值
uchar eeprom_value=0,set_temper=0;//eeprom值與設置溫度值
uchar eeprom_value1=0,set_temper1=0;//eeprom值與設置溫度值
uchar eeprom_value2=0,set_temper2=0;//eeprom值與設置溫度值uchar Temper_Flag=0,keep_temp_flag=0; //溫度檢測與恒溫標志
uchar Temper_Flag1=0,keep_temp_flag1=0; //溫度檢測與恒溫標志
uchar Temper_Flag2=0,keep_temp_flag2=0; //溫度檢測與恒溫標志uchar select_set=0;
uchar set_flag=0; //設置溫度標志
uchar bell_count; //蜂鳴器報警數
uchar time_flag=0;//定時器初始化 50ms
void Time_Init(void)
{TMOD=0X01;TH0=(65536-1000)/256;TL0=(65536-1000)/256;ET0=1;EA=1;TR0=1;
}void PIDInit (struct PID *pp)
{memset ( pp,0,sizeof(struct PID));
}//PID計算部分
unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint )
{
unsigned int dError,Error;
Error = pp->SetPoint - NextPoint; // 偏差
pp->SumError += Error; // 積分
dError = pp->LastError - pp->PrevError; // 當前微分
pp->PrevError = pp->LastError;
pp->LastError = Error;
return (pp->Proportion * Error // 比例項
+ pp->Integral*pp->SumError // 積分項
+ pp->Derivative*dError); // 微分項
}//溫度比較處理子程序
void compare_temper1(void)
{unsigned char i;if((set_temper)>(real_temper/10)){if((set_temper)-(real_temper/10)>1) //相差1度是開始PID調節 {high_time=100; //實際溫度與設置溫度低一度以上時一直開啟加熱low_time=0;}else{for(i=0;i<10;i++) //計算10次{ EA=0; //關中斷,防止影響讀取數據real_temper=DS18B20_Read_Tempereture(1);EA=1;rin = real_temper; // Read Inputrout = PIDCalc ( &spid,rin ); // Perform PID Interation}if (high_time<=100) //換算調整值high_time=(unsigned char)(rout/800);elsehigh_time=100;low_time= (100-high_time);}}else if((set_temper)<=(real_temper/10)) //實際溫度比設置溫度高時關閉加熱{if((set_temper)-(real_temper/10)>0)//來回調整{high_time=0;low_time=100;}else{for(i=0;i<10;i++){ EA=0;real_temper=DS18B20_Read_Tempereture(1);EA=1;rin = real_temper; // Read Inputrout = PIDCalc ( &spid,rin ); // Perform PID Interation}if (high_time<100)high_time=(unsigned char)(rout/10000);elsehigh_time=0;low_time= (100-high_time);}}}//溫度比較處理子程序
//void compare_temper1(void)
//{
// unsigned char i;
// if((set_temper1)>(real_temper1/10))
// {
// if((set_temper1)-(real_temper1/10)>1) //相差1度是開始PID調節
// {
// high_time1=100; //實際溫度與設置溫度低一度以上時一直開啟加熱
// low_time1=0;
// }
// else
// {
// for(i=0;i<10;i++) //計算10次
// {
// EA=0; //關中斷,防止影響讀取數據
// real_temper1=DS18B20_Read_Tempereture(2);
// EA=1;
// rin = real_temper1; // Read Input
// rout = PIDCalc ( &spid,rin ); // Perform PID Interation
// }
// if (high_time1<=100) //換算調整值
// high_time1=(unsigned char)(rout/800);
// else
// high_time1=100;
// low_time1= (100-high_time1);
// }
// }
// else if((set_temper1)<=(real_temper1/10)) //實際溫度比設置溫度高時關閉加熱
// {
// if((set_temper1)-(real_temper1/10)>0)//來回調整
// {
// high_time1=0;
// low_time1=100;
// }
// else
// {
// for(i=0;i<10;i++)
// {
// EA=0;
// real_temper1=DS18B20_Read_Tempereture(2);
// EA=1;
// rin = real_temper1; // Read Input
// rout = PIDCalc ( &spid,rin ); // Perform PID Interation
// }
// if (high_time1<100)
// high_time1=(unsigned char)(rout/10000);
// else
// high_time1=0;
// low_time1= (100-high_time1);
// }
// }
// }
//
//溫度比較處理子程序
//void compare_temper1(void)
//{
// unsigned char i;
// if((set_temper2)>(real_temper2/10))
// {
// if((set_temper2)-(real_temper2/10)>1) //相差1度是開始PID調節
// {
// high_time2=100; //實際溫度與設置溫度低一度以上時一直開啟加熱
// low_time2=0;
// }
// else
// {
// for(i=0;i<10;i++) //計算10次
// {
// EA=0; //關中斷,防止影響讀取數據
// real_temper2=DS18B20_Read_Tempereture(3);
// EA=1;
// rin = real_temper2; // Read Input
// rout = PIDCalc ( &spid,rin ); // Perform PID Interation
// }
// if (high_time2<=100) //換算調整值
// high_time2=(unsigned char)(rout/800);
// else
// high_time2=100;
// low_time2= (100-high_time2);
// }
// }
// else if((set_temper2)<=(real_temper2/10)) //實際溫度比設置溫度高時關閉加熱
// {
// if((set_temper2)-(real_temper2/10)>0)//來回調整
// {
// high_time2=0;
// low_time2=100;
// }
// else
// {
// for(i=0;i<10;i++)
// {
// EA=0;
// real_temper2=DS18B20_Read_Tempereture(3);
// EA=1;
// rin = real_temper2; // Read Input
// rout = PIDCalc ( &spid,rin ); // Perform PID Interation
// }
// if (high_time2<100)
// high_time2=(unsigned char)(rout/10000);
// else
// high_time2=0;
// low_time2= (100-high_time2);
// }
// }
// }
////從EEPROM中讀取溫度設置值
void Read_Set_EEPROM_Value(void)
{set_temper=X24C02_Read(10);set_temper1=X24C02_Read(11);set_temper2=X24C02_Read(12);
}//按鍵處理 溫度值設定
void Set_Temper_Value(void)
{uchar value_temp;value_temp=P3&0x3C; //根據按鍵連接口獲取是否有按鍵按下if(value_temp!=0x3c){_delay_ms(5); //消抖if(value_temp!=0x3c) //再次確認是否有鍵按下{switch(value_temp){case 0x38: //加鍵if(set_flag==1) //只有在設置按鍵按下后有效{if(select_set==1){if(eeprom_value<99) //溫度值上限99度eeprom_value++; //設置溫度值加LCD_write_Num_1(13,1,eeprom_value,2); //顯示設置溫度值}else if(select_set==2){if(eeprom_value1<99) //溫度值上限99度eeprom_value1++; //設置溫度值加LCD_write_Num_1(13,1,eeprom_value1,2); //顯示設置溫度值}else if(select_set==3){if(eeprom_value2<99) //溫度值上限99度eeprom_value2++; //設置溫度值加LCD_write_Num_1(13,1,eeprom_value2,2); //顯示設置溫度值}}break;case 0x34: //減鍵if(set_flag==1) //只有在設置按鍵按下后有效{if(select_set==1){if(eeprom_value>0)//小于下限時 eeprom_value--; //設置溫度值減LCD_write_Num_1(13,1,eeprom_value,2); //顯示設置溫度值}else if(select_set==2){if(eeprom_value1>0)//小于下限時 eeprom_value1--; //設置溫度值減LCD_write_Num_1(13,1,eeprom_value1,2); //顯示設置溫度值}else if(select_set==3){if(eeprom_value2>0)//小于下限時 eeprom_value2--; //設置溫度值減LCD_write_Num_1(13,1,eeprom_value2,2); //顯示設置溫度值}}break;case 0x2c: //確定if(set_flag==1) //只有在設置按鍵按下后有效{set_flag=0; //退出設置LCD_write_str(8,1,"S: ");if(select_set==1){X24C02_Write(10,eeprom_value); //將設置值寫入EEPROM_delay_ms(5); //延遲EEPROM在寫入后不能馬上讀,需要等待一定時間Read_Set_EEPROM_Value(); //讀取EEPROM 重新賦值設置比較值}else if(select_set==2){X24C02_Write(11,eeprom_value1); //將設置值寫入EEPROM_delay_ms(5); //延遲EEPROM在寫入后不能馬上讀,需要等待一定時間Read_Set_EEPROM_Value(); //讀取EEPROM 重新賦值設置比較值}else if(select_set==3){X24C02_Write(12,eeprom_value2); //將設置值寫入EEPROM_delay_ms(5); //延遲EEPROM在寫入后不能馬上讀,需要等待一定時間Read_Set_EEPROM_Value(); //讀取EEPROM 重新賦值設置比較值}select_set=0;}break;case 0x1c: //設置select_set++;if(select_set==4)select_set=1; set_flag=1; //進度設置if(select_set==1){LCD_write_str(8,1,"Set1: ");eeprom_value=X24C02_Read(10); //讀取EEPROM中的值進行設置LCD_write_Num_1(13,1,eeprom_value,2); //顯示設置初始值}else if(select_set==2){LCD_write_str(8,1,"Set2: ");eeprom_value1=X24C02_Read(11); //讀取EEPROM中的值進行設置LCD_write_Num_1(13,1,eeprom_value1,2); //顯示設置初始值}else if(select_set==3){LCD_write_str(8,1,"Set3: ");eeprom_value2=X24C02_Read(12); //讀取EEPROM中的值進行設置LCD_write_Num_1(13,1,eeprom_value2,2); //顯示設置初始值} break;}}while(value_temp!=0x3c)value_temp=P3&0x3C; //松手檢測}
}//故障檢測
void InDetect(void)
{if(DS18B20_Init(1)!=0) //溫度傳感器故障{Temper_Flag=1; //置標志}else {Temper_Flag=0;}if(DS18B20_Init(2)!=0) //溫度傳感器故障{Temper_Flag1=1; //置標志}else {Temper_Flag1=0;}if(DS18B20_Init(3)!=0) //溫度傳感器故障{Temper_Flag2=1; //置標志}else {Temper_Flag2=0;}if((real_temper/10)<set_temper) //實際溫度與設置溫度比較{keep_temp_flag=0;}else{keep_temp_flag=1;}if((real_temper1/10)<set_temper1) //實際溫度與設置溫度比較{keep_temp_flag1=0;}else{keep_temp_flag1=1;}if((real_temper2/10)<set_temper2) //實際溫度與設置溫度比較{keep_temp_flag2=0;}else{keep_temp_flag2=1;}
}//狀態顯示
void State_Display(void)
{InDetect(); //故障檢測if(set_flag==0)//沒有設置時顯示{if((Temper_Flag==1)||(Temper_Flag1==1)||(Temper_Flag2==1)){LCD_write_str(10,1,"Error "); //溫度異常}else{if((keep_temp_flag==0)||(keep_temp_flag1==0)||(keep_temp_flag2==0)){LCD_write_str(10,1,"Hot ");//加熱}else{LCD_write_str(10,1,"Normal"); //正常}}}
}//輸出蜂鳴器與繼電器控制
void Output_Control(void)
{if((Temper_Flag==1)||(Temper_Flag1==1)||(Temper_Flag2==1))//溫度故障時報警{bell_count=4;}else bell_count=0;
}//設備初始化函數
void Device_Init(void)
{Time_Init();Init_uart();LCD_init();DS18B20_Init(1);DS18B20_Init(2);DS18B20_Init(3);LCD_write_str(0,0,"T1:");LCD_write_str(9,0,"T2:");LCD_write_str(0,1,"T3:");LCD_write_str(8,1,"S: ");Read_Set_EEPROM_Value();
}//主函數
int main(void)
{ Device_Init(); //設備初始化PIDInit ( &spid ); // 初始化PIDspid.Proportion = 10; // Set PID Coefficientsspid.Integral = 8;spid.Derivative =6;spid.SetPoint = 100; // Set PID Setpointwhile(1){if(time_flag==1){time_flag=0;if((Temper_Flag==0)) //溫度傳感器無故障時{EA=0;real_temper=DS18B20_Read_Tempereture(1); //讀取溫度值EA=1;LCD_write_Num(3,0,real_temper,4); //顯示溫度值printf("Temper1_Value=%f\r\n",real_temper/10.0); }else{LCD_write_str(3,0,"Eor "); //溫度傳感器有故障時printf("Temper1_Value=Error!\r\n");}if((Temper_Flag1==0)) //溫度傳感器無故障時{EA=0;real_temper1=DS18B20_Read_Tempereture(2); //讀取溫度值EA=1;LCD_write_Num(12,0,real_temper1,4); //顯示溫度值printf("Temper2_Value=%f\r\n",real_temper1/10.0); }else {LCD_write_str(12,0,"Eor "); //溫度傳感器有故障時printf("Temper2_Value=Error!\r\n");}if((Temper_Flag2==0)) //溫度傳感器無故障時{EA=0;real_temper2=DS18B20_Read_Tempereture(3); //讀取溫度值EA=1;LCD_write_Num(3,1,real_temper2,4); //顯示溫度值printf("Temper3_Value=%f\r\n",real_temper2/10.0); }else {LCD_write_str(3,1,"Eor "); //溫度傳感器有故障時printf("Temper3_Value=Error!\r\n");}printf("==================================\r\n");}State_Display();Set_Temper_Value();compare_temper1();//compare_temper2();//compare_temper3();Output_Control(); }
}//定時器中斷
void Time0(void) interrupt 1
{static uchar count=0;static uint m=0;TH0=(65536-1000)/256;TL0=(65536-1000)/256;m++;count++;//count1++;//count2++;if(m==1000) //1S計時{m=0;time_flag=1;if(bell_count>0){bell=~bell;//蜂鳴器標志取反bell_count--;//次數減少 }else bell=1;//次數到達時關閉蜂鳴器}if(count<=(high_time))temper_relay=0;else if(count<=100){temper_relay=1;}elsecount=0;// if(count1<=(high_time1))
// temper_relay1=0;
// else if(count<=100)
// {
// temper_relay1=1;
// }
// else
// count1=0;
//
// if(count2<=(high_time2))
// temper_relay2=0;
// else if(count2<=100)
// {
// temper_relay2=1;
// }
// else
// count2=0;
電路圖
系統設計圖和電源模塊:
溫度控制模塊
總結
以上是生活随笔為你收集整理的温控自动烘焙系统的研究与实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于RFID的防伪系统设计
- 下一篇: 除了成绩,93%的美国大学招生官最注重申