EC11旋轉調溫電烙鐵制作資料
單片機源程序如下:
- /******************************************************************
- 本程序只供學習使用,未經作者許可,不得用于其它任何用途
- 程序結構參考 安徽師范大學 Lyzhangxiang的EasyHW OS結構設計
- Main.C file
- 作者:bg8wj
- 版本:V1.0
- Copyright(C) bg8wj
- /*******************************************************************/
- #include "ioconfig.h"
- #include "includes.h"
- #include "datacomm.h"
- /***********************按鍵定義*************************************************/
- sbit key0=P1^0;
- //sbit key2=P1^1;
- //sbit key3=P3^3;
- #define uint unsigned int
- #define uchar unsigned char
- unsigned char status=0; //按鍵功能選擇定義(bai0,shi1,ge0
- unsigned char ge,shi,bai=2;
- void Init_INT0()
- {
- IT0 = 1;
- EX0 = 1;
- EA = 1;
-
- }
-
- void ISR0() interrupt 0
- {
- if(!status==0){ //防止空轉
- if((P3&0x06) == 0x02)
- {
- DelayMs(1);
- if((P3&0x06) == 0x02)
- if(set_temper==500) //最大值
- {
- set_temper=500;
- }
- else
- {
- set_temper++;
- }
-
- }
- else
- {
- DelayMs(1);
- if((P3&0x06) == 0x00)
- if(set_temper==200) // 最小值
- {
- set_temper=200;
- }
- else
- {
- set_temper--;
- }
-
- }
- }
-
- }
-
- /*****************************按鍵功能函數*************************************/
- void key_1() //選擇變量函數
- {
- key0=1;
- if(key0==0)
- DelayMs(10);
- {
- if(key0==0)
- {
- if(++status>1)status=0; //1bai,2shi,3ge
- }
- while(key0==0);
- }
- }
-
- /************************************************
- PID函數
- *************************************************/
- void PIDInit (struct PID *pp)
- {
- memset ( pp,0,sizeof(struct PID));
- }
- /************************************************
- 增量控制PID函數體
- 51單片機最不擅長浮點數計算,轉換成int型計算
- *************************************************/
- unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint )
- {
- unsigned int dError,Error,pError;
- //增量法計算公式:
- //Pdt=Kp*[E(t)-E(t-1)]+Ki*E(t)+Kd*[E(t)-2*E(t-1)+E(t-2)]
- Error = set_temper - NextPoint; // 偏差E(t)
- pError=Error-pp->LastError; //E(t)-E(t-1)
- dError=Error-2*pp->LastError+pp->PrevError; //E(t)-2*E(t-1)+E(t-2)
- pp->PrevError = pp->LastError;
- pp->LastError = Error;
- return (
- pp->Proportion * pError //比例
- + pp->Integral *Error //積分項
- + pp->Derivative * dError // 微分項
- );
- }
- /************************************************
- PID函數初始化
- *************************************************/
- void PIDBEGIN()
- {
- PIDInit(&spid); // Initialize Structure
- spid.Proportion = 10; // Set PID Coefficients
- spid.Integral = 5;
- spid.Derivative =4;
- }
- /************************************************
- 實時溫度讀取函數
- 從DS18b20中讀取實時溫度
- 返回值放大10倍便于PID計算
- *************************************************/
- int ReadTemperature(void)
- {
- unsigned char TPL=0;
- unsigned char TPH=0;
- unsigned int temperture=0;
- //EA = 0;
- Init_DS18B20();
- WriteOneChar(0xCC); //跳過讀序號列號的操作
- WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
- TPL=ReadOneChar(); //讀溫度低字節
- TPH=ReadOneChar(); //讀溫度高字節
- //啟動下一次溫度轉換
- Init_DS18B20();
- WriteOneChar(0xCC); // 跳過讀序號列號的操作
- WriteOneChar(0x44); // 啟動溫度轉換
- //temperture=(TPH*256+TPL)*0.0625 //真實溫度值 范圍(+125,-55)
- if(TPH&0xfc)
- {
- tp_flag=1; //負溫度標記
- temperture=((TPH<<8)|TPL);
- temperture=((~temperture)+1);
- temperture*=0.625+0.5;
- }
- else
- {
- tp_flag=0;
- //temperture=((TPH<<8)|TPL)*0.0625 //溫度輸出值范圍(125.00,-55.00)
- temperture=((TPH<<8)|TPL)*0.625+0.5; //溫度值放大10(+1250.00,-550.00)
- } // +0.5四舍五入 精度只到小數后一位
- return(temperture);
- }
- /************************************************
- lcd1602顯示函數
- *************************************************/
- void xianshi(void)
- {
- LCD_Write_String(0,0,"NOW TMP:");
- LCD_Write_String(0,1,"SET TMP:");
- }
- /************************************************
- lcd1602顯示實時溫度
- *************************************************/
- void view(unsigned int tmp)
- {
- LCD_Write_Char(15,0,'C');
- LCD_Write_Char(14,0,0xdf);//攝氏溫度符號
- LCD_Write_Char(13,0,zhi[tmp%10]);//小數點后第1位
- LCD_Write_Char(12,0,'.');
- LCD_Write_Char(11,0,zhi[tmp%100/10]);// 個位
- LCD_Write_Char(10,0,zhi[tmp/100]); //十位
- if(0==tmp/1000)LCD_Write_Char(9,0,' ');//百位 如果為零顯示空格
- else
- LCD_Write_Char(9,0,zhi[tmp/1000]);
- if(1==tp_flag)LCD_Write_Char(8,0,'-');//正負溫度符號顯示 負溫度顯示- 0上顯示空格
- else
- LCD_Write_Char(8,0,' ');
- }
- /***********************************************************
- PID溫度控制做動函數
- ***********************************************************/
- void compare_temper() //PID溫度控制輸出函數
- {
- unsigned char i;
-
- if(set_temper>temper)
- {
- if(set_temper-temper>50)//如果控制目標溫度溫與實時溫度差大于5度,(放大10倍)是50
- {
-
- PWM0_set(10); //PWM 輸出高電平占空比最大。即全速加溫
- PWM1_set(10);
- }
- else
- {
- for(i=0;i<10;i++) //5度范圍內PID增量控制,10次周期 即PID積分式中T=10
- {
- rin=ReadTemperature();//PID輸入實時溫度采樣值
- rout = PIDCalc ( &spid,rin ); // PID增量輸出
- }//PID增量輸出范圍(0-255)配合pwm取值范圍
-
- if(rout>=240)rout=240; //保障PWM輸入值10-240 防止pwm出現失調。stc單片機特性。
- if(rout<=20)rout=20;
-
- PWM0_set(255-rout);
- PWM1_set(255-rout);
-
- }
- }
- else if(set_temper<=temper) //目標溫度小于實時溫度pwm輸出低電平最高占空比,關閉加熱。
- {
- PWM0_set(250);
- PWM1_set(250);
- }
- }
- /************************************************
- 系統初始化函數
- *************************************************/
- void Sys_Init()
- {
- PWM_init();
- PIDBEGIN();
- LCD_Init();
- Init_DS18B20();
- LCD_Clear();
- //InitUart1();
- }
- /*************************************************
- 主函數
- **************************************************/
- void main(void)
- {
- Init_INT0();
- Sys_Init(); //系統初始化
- xianshi(); //顯示字符
- PWM0_set(250); //初始化PWM兩路輸出最高低電平占空比,不要加熱 p1.3
- PWM1_set(250); //p1.4
- delay500ms(); //延時稍等芯片初始化
- while(1)
- {
- key_1();
- {
-
- if(status==1){
- bai=(set_temper/100);
- shi=(set_temper%100/10);
- ge=(set_temper%10);
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
EC11-LCD1602顯示.zip
(118.65 KB, 下載次數: 227)
2018-6-6 15:04 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|