《自動(dòng)控制原理》課程設(shè)計(jì)
目錄
1. 系統(tǒng)設(shè)計(jì)方案3
1.1方案一3
1.2 方案二3
1.3方案三3
1.4方案的比較和確定3
2.系統(tǒng)硬件部分設(shè)計(jì)3
2.1 系統(tǒng)硬件電路圖3
2.1.1 單片機(jī)AT89C524
2.1.2單片機(jī)與LCD通信連接4
2.1.3 其他電路模塊及總電路5
3系統(tǒng)軟件部分5
3.1系統(tǒng)的主流程圖如下5
4.溫度控制系統(tǒng)PID調(diào)節(jié)6
4.1 PID控制傳遞函數(shù)6
4.2 PID參數(shù)調(diào)節(jié)方法6
4.3 PID參數(shù)設(shè)定6
5.實(shí)驗(yàn)與調(diào)試7
6.總論8
附 錄8
參 考 文 獻(xiàn)24
1.1方案一 選用鉑電阻溫度傳感器。此類溫度傳感器線性度、穩(wěn)定性等方面性能都很好,但其成本較高。 1.2 方案二 采用熱敏電阻。選用此類元器件有價(jià)格便宜的優(yōu)點(diǎn),但由于熱敏電阻的非線性特性會(huì)影響系統(tǒng)的精度。 1.3方案三 采用DS18B20溫度傳感器。DS18B20是DALLAS公司生產(chǎn)的一線式數(shù)字溫度傳感器,具有3引腳封裝形式;溫度測(cè)量范圍為-55℃~+125℃,可編程為9位~12位A/D轉(zhuǎn)換精度,測(cè)溫分辨率可達(dá)0.0625℃,被測(cè)溫度用符號(hào)擴(kuò)展的16位數(shù)字量方式串行輸出遠(yuǎn)端引入 1.4方案的比較和確定 比較以上三種方案,方案三具有具有體積小、質(zhì)量輕、線形度好、性能穩(wěn)定等優(yōu)點(diǎn)其各方面特性都滿足此系統(tǒng)的設(shè)計(jì)要求的優(yōu)點(diǎn),因此選用方案三。 硬件設(shè)計(jì)包含DS18B20模塊,1602液晶顯示模塊,繼電器模塊,鍵盤輸入模塊和聲光報(bào)警模塊,DS18B20可以被編程,所以箭頭是雙向的,CPU(89C52)首先寫入命令給DS18B20,然后DS18B20開始轉(zhuǎn)換數(shù)據(jù),轉(zhuǎn)換后通89C52來(lái)處理數(shù)據(jù)。數(shù)據(jù)處理后的結(jié)果就顯示到1602液晶上。 2.1系統(tǒng)硬件電路圖 2.1.1 單片機(jī)STC89C52 2.1.2單片機(jī)與LCD通信連接 2.1.3 其他電路模塊及總電路 軟件設(shè)計(jì)的部分采用分層模塊化設(shè)計(jì),主要有鍵盤掃描、按鍵處理程序、數(shù)碼管顯示程序、繼電器控制程序、溫度信號(hào)處理程序、超溫報(bào)警程序。另外以 AT89C52 單片機(jī)為控制核心。利用PID 控制算法提高了水溫的控制精度使用PID 控制算法實(shí)施自動(dòng)控制系統(tǒng)具有控制參數(shù)精度高、反映速度快和穩(wěn)定性好的特點(diǎn)。 3.1系統(tǒng)的主流程圖如下
4.溫度控制系統(tǒng)PID調(diào)節(jié) 4.1 PID控制傳遞函數(shù) 通過(guò)熱電偶采集的被測(cè)溫度偏離所希望的給定值時(shí),PID控制可根據(jù)測(cè)量信號(hào)與給定值的偏差進(jìn)行比例(P)、積分(I)、微分(D)運(yùn)算,從而輸出某個(gè)適當(dāng)?shù)目刂菩盘?hào)給執(zhí)行機(jī)構(gòu),促使測(cè)量值恢復(fù)到給定值,達(dá)到自動(dòng)控制的效果。 4.2 PID參數(shù)調(diào)節(jié)方法及參數(shù)設(shè)定 PID模塊的溫度控制精度主要受P、I、D這三個(gè)參數(shù)影響。其中P代表比例,I代表積分,D代表微分。
比例運(yùn)算(P)
比例控制是建立與設(shè)定值(SV)相關(guān)的一種運(yùn)算,并根據(jù)偏差在求得運(yùn)算值(控制輸出量)。如果當(dāng)前值(PV)小,運(yùn)算值為100%。如果當(dāng)前值在比例帶內(nèi),運(yùn)算值根據(jù)偏差比例求得并逐漸減小直到SV和PV匹配(即,直到偏差為0),此時(shí)運(yùn)算值回復(fù)到先前值(前饋運(yùn)算)。若出現(xiàn)靜差(殘余偏差),可用減小P方法減小殘余偏差。如果P太小,反而會(huì)出現(xiàn)振蕩。
積分運(yùn)算(I)
將積分與比例運(yùn)算相結(jié)合,隨著調(diào)節(jié)時(shí)間延續(xù)可減小靜差。積分強(qiáng)度用積分時(shí)間表示,積分時(shí)間相當(dāng)于積分運(yùn)算值到比例運(yùn)算值在階躍偏差響應(yīng)下達(dá)到的作用所需要的時(shí)間。積分時(shí)間越小,積分運(yùn)算的校正時(shí)間越強(qiáng)。但如果積分時(shí)間值太小,校正作用太強(qiáng)會(huì)出現(xiàn)振蕩。
微分運(yùn)算(D)
比例和積分運(yùn)算都校正控制結(jié)果,所以不可避免地會(huì)產(chǎn)生響應(yīng)延時(shí)現(xiàn)象。微分運(yùn)算可彌補(bǔ)這些缺陷。在一個(gè)突發(fā)的干擾響應(yīng)中,微分運(yùn)算提供了一個(gè)很大的運(yùn)算值,以恢復(fù)原始狀態(tài)。微分運(yùn)算采用一個(gè)正比于偏差變化率(微分系數(shù))的運(yùn)算值校正控制。微分運(yùn)算的強(qiáng)度由微分時(shí)間表示,微分時(shí)間相當(dāng)于微分運(yùn)算值達(dá)到比例運(yùn)算值在階躍偏差響應(yīng)下達(dá)到的作用所需的時(shí)間。微分時(shí)間值越大,微分運(yùn)算的校正強(qiáng)度越強(qiáng)。
5.實(shí)驗(yàn)與調(diào)試 用繼電器模塊來(lái)控制200W“熱得快”來(lái)對(duì)1升水進(jìn)行加熱,用鍵盤設(shè)定需要加熱溫度值,觀察1602所顯示的穩(wěn)定水溫和環(huán)境溫度降低時(shí)溫度控制的靜態(tài)誤差。多次調(diào)試并合設(shè)定PID參數(shù)來(lái)完善系統(tǒng)。 實(shí)物圖: 6.總論 首先,通過(guò)本次應(yīng)用系統(tǒng)設(shè)計(jì),在很大程度上提高了我們的獨(dú)立思考能力和專業(yè)知識(shí)相信在接下來(lái)的日子我們能在已有的基礎(chǔ)上做得更好。我們所設(shè)計(jì)的該系統(tǒng)主要根據(jù)目前省能源的發(fā)展趨勢(shì)和國(guó)內(nèi)實(shí)際的應(yīng)用特點(diǎn)和要求,采用了自動(dòng)化的結(jié)構(gòu)形式,實(shí)現(xiàn)對(duì)水溫的自動(dòng)檢測(cè)和控制。該系統(tǒng)的主要特點(diǎn)是: 1)適用性強(qiáng),用戶只需對(duì)界面參數(shù)進(jìn)行設(shè)置并啟動(dòng)系統(tǒng)正常運(yùn)行便可滿足不同用戶水溫的要求,實(shí)現(xiàn)對(duì)水溫的實(shí)時(shí)監(jiān)控。避免了電力力資源的浪費(fèi),節(jié)省了能源。 2)將單片機(jī)以及溫度傳感器引入對(duì)水溫的分析和處理中,單片機(jī)控制決策無(wú)需建立被控對(duì)象的數(shù)學(xué)模型,系統(tǒng)的適應(yīng)性強(qiáng),適合對(duì)非線性、時(shí)變、滯后系統(tǒng)的控制對(duì)水溫控制系統(tǒng)進(jìn)行控制。 3)系統(tǒng)成本低廉,操作非常簡(jiǎn)單,可擴(kuò)展性強(qiáng),只要稍加改變,即可增加其他使用功能。 通過(guò)對(duì)本設(shè)計(jì)的思考,更加加深了我們對(duì)單片機(jī)的認(rèn)識(shí),熟練了對(duì)單片機(jī)的控制,更對(duì)當(dāng)前的溫度傳感器有了更深刻的認(rèn)識(shí)與了解,但是由于此系統(tǒng)依賴溫度傳感器,因而對(duì)溫度傳感器的穩(wěn)定性,線性等諸多方面有著嚴(yán)格的要求,但是傳感器的性能越好,相對(duì)而言其價(jià)格也就越高,因而在此設(shè)計(jì)中,溫度傳感器覺的還是存在遺憾,由于溫度計(jì)的使用溫度有限所以水溫不能達(dá)到90℃以上。最后由于時(shí)間緊迫,本設(shè)計(jì)還有諸多地方需要改進(jìn),我們會(huì)在接下來(lái)的時(shí)間里繼續(xù)完善該設(shè)計(jì),以期做的更好。 附錄: 部分程序: //main.c: - #include<reg51.h>
- #include"lcd.h"
- #include"temp.h"
- #include"pid.h"
-
- sbit c1=P2^6;
- sbit c2=P2^7;
- sbit beep=P1^3;
-
- sbit K3=P3^2;
- sbit K4=P3^3;
-
- void IntConfiguration();
- void Delay(unsigned int n);
- unsigned char KeyValue=0;
-
- extern float set_temper;
-
-
- /*******************************************************************************
- * 函數(shù)名 : main
- * 函數(shù)功能 : 主函數(shù)
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- *******************************************************************************/
-
- void main()
- {
- extern struct PID spid; // PID Control Structure
-
- LcdInit();
- IntConfiguration();
-
- PIDInit ( &spid );
- spid.Proportion = 10; // Set PID Coefficients
- spid.Integral = 8;
- spid.Derivative =6;
- spid.SetPoint = 100; // Set PID Setpoint
-
- beep=1;
-
- TMOD=0x21;
- TH0=0x2f;
- TL0=0x40;
- //PCON=0X80; //波特率加倍
- //TH1=0XF3; //計(jì)數(shù)器初始值設(shè)置,注意波特率是4800的
- //TL1=0XF3;
- EA=1;
- ET0=1;
- //ES=1;
- TR0=1;
- TR1=1;
-
- c1=0;
- c2=0;
-
- P1=0XFF;
-
- while(1)
- {
- LcdDisplay(Ds18b20ReadTemp());
- LcdDisplay2(set_temper);
- // LcdDisplay3(realtmp);
- /* if((set_temper-realtmp)<1&&(realtmper-set_temp)<1)
- {
- beep=0;
- }
- else
- beep=1; */
- compare_temper();
- // SBUF=Ds18b20ReadTemp();
- // Delay1ms(1);//1s鐘刷一次
- }
- }
-
-
- void IntConfiguration()
- {
- //設(shè)置INT0
- IT0=1;//跳變沿出發(fā)方式(下降沿)
- EX0=1;//打開INT0的中斷允許。
- //設(shè)置INT1
- IT1=1;
- EX1=1;
-
- EA=1;//打開總中斷
- }
- /*******************************************************************************
- * 函數(shù)名 : Delay(unsigned int n)
- * 函數(shù)功能 : 延時(shí)
- * 輸入 : n
- * 輸出 : 無(wú)
- *******************************************************************************/
-
- void Delay(unsigned int n) //延時(shí)50us誤差 0us
- {
- unsigned char a,b;
- for(;n>0;n--)
- {
- for(b=1;b>0;b--)
- for(a=22;a>0;a--);
- }
- }
- /*******************************************************************************
- * 函數(shù)名 : Int0() interrupt 0
- * 函數(shù)功能 : 外部中斷0的中斷函數(shù)
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- *******************************************************************************/
-
- void Int0() interrupt 0 //外部中斷0的中斷函數(shù)
- {
- Delay(1); //延時(shí)消抖
- if(K3==0)
- {
- while(K3==0);
- set_temper++;
- }
- if(set_temper>60.00)
- set_temper=60.00;
- }
- /*******************************************************************************
- * 函數(shù)名 : Int1() interrupt 2
- * 函數(shù)功能 : 外部中斷1的中斷函數(shù)
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- *******************************************************************************/
-
- void Int1() interrupt 2 //外部中斷1的中斷函數(shù)
- {
- Delay(1); //延時(shí)消抖
- if(K4==0)
- {
- while(K4==0);
- set_temper--;
- }
- if(set_temper<40.00)
- set_temper=40.00;
- }
-
-
-
- //pid.c
- #include"pid.h"
- #include"temp.h"
-
- struct PID spid; // PID Control Structure
-
- unsigned int rout; // PID Response (Output)
- unsigned int rin; // PID Feedback (Input)
-
-
-
- int i=0,j=0,flag2=0,tem=0;
-
- sbit output=P1^6;
-
-
- unsigned char flag,flag_1=0;
- unsigned char high_time,low_time,count=0;//占空比調(diào)節(jié)參數(shù)
- float set_temper=40;
-
-
-
- void PIDInit (struct PID *pp)
- {
- high_time=50;
- low_time=50;
- memset ( pp,0,sizeof(struct PID));
-
- }
- /*====================================================================================================
- PID計(jì)算部分
- =====================================================================================================*/
- 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; // 當(dāng)前微分
- pp->PrevError = pp->LastError;
- pp->LastError = Error;
- return (pp->Proportion * Error//比例
- + pp->Integral * pp->SumError //積分項(xiàng)
- + pp->Derivative * dError); // 微分項(xiàng)
- }
- /***********************************************************
- 溫度比較處理子程序
- ***********************************************************/
- void compare_temper()
- {
- unsigned char i;
- extern float realtmp;
- extern unsigned int s;
-
- if(set_temper>realtmp)
- {
- if(set_temper-realtmp>1)
- {
- high_time=100;
- low_time=0;
- //P1=0XFF;
- //mod1=0;
- }
- else
- {
- //P1=0XFF;
- //mod2=0;
- for(i=0;i<10;i++)
- { Ds18b20ReadTemp();
- rin = s; // Read Input
- rout = PIDCalc ( &spid,rin ); // Perform PID Interation
- }
-
- if (high_time<=100)
- high_time=(unsigned char)(rout/800);
- else
- high_time=100;
- low_time= (100-high_time);
- }
- }
- else if(set_temper<=realtmp)
- {
- if(realtmp-set_temper>0)
- {
- //P1=0XFF;
- //mod3=0;
- high_time=0;
- low_time=100;
- //mod2=0;
- }
- else
- {
- //P1=0XFF;
- //mod4=0;
- for(i=0;i<10;i++)
- { Ds18b20ReadTemp();
- rin = s; // Read Input
- rout = PIDCalc ( &spid,rin ); // Perform PID Interation
- }
- if (high_time<100)
- high_time=(unsigned char)(rout/10000);
- else
- high_time=0;
- low_time= (100-high_time);
- }
- }
- // else
- // {}
- }
- /*****************************************************
- T0中斷服務(wù)子程序,用于控制電平的翻轉(zhuǎn) ,40us*100=4ms周期
- ******************************************************/
- void serve_T0() interrupt 1 using 1
- {
- j++;
- if(++count<=(high_time))
- {
- output=1;
- i++;
- }
- else if(count<=100)
- {
- output=0;
- }
- else
- count=0;
- if(j==1000)
- {j=0;flag2=1;tem=i;i=0; }
- TH0=0x2f;
- TL0=0xe0;
- }
- /*****************************************************
- 串行口中斷服務(wù)程序,用于上位機(jī)通訊
- ******************************************************/
- void serve_sio() interrupt 4
- {
- /* EA=0;
- // flag2=0;
- while(!TI); //等待發(fā)送數(shù)據(jù)完成
- TI=0;
- EA=1; */
- }
-
-
-
- //temp.c
- #include"temp.h"
-
- int temp=0;
- unsigned int s;
- //float set_temp=27.00;
- /*******************************************************************************
- * 函數(shù)名 : Delay1ms
- * 函數(shù)功能 : 延時(shí)函數(shù)
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- *******************************************************************************/
-
- void Delay1ms(unsigned int y)
- {
- unsigned int x;
- for(y;y>0;y--)
- for(x=110;x>0;x--);
- }
- /*******************************************************************************
- * 函數(shù)名 : Ds18b20Init
- * 函數(shù)功能 : 初始化
- * 輸入 : 無(wú)
- * 輸出 : 初始化成功返回1,失敗返回0
- *******************************************************************************/
-
- unsigned char Ds18b20Init()
- {
- unsigned int i;
- DSPORT=0; //將總線拉低480us~960us
- i=70;
- while(i--);//延時(shí)642us
- DSPORT=1; //然后拉高總線,如果DS18B20做出反應(yīng)會(huì)將在15us~60us后總線拉低
- i=0;
- while(DSPORT) //等待DS18B20拉低總線
- {
- i++;
- if(i>5000)//等待>5MS
- return 0;//初始化失敗
- }
- return 1;//初始化成功
- }
-
- /*******************************************************************************
- * 函數(shù)名 : Ds18b20WriteByte
- * 函數(shù)功能 : 向18B20寫入一個(gè)字節(jié)
- * 輸入 : com
- * 輸出 : 無(wú)
- *******************************************************************************/
-
- void Ds18b20WriteByte(unsigned char dat)
- {
- unsigned int i,j;
- for(j=0;j<8;j++)
- {
- DSPORT=0; //每寫入一位數(shù)據(jù)之前先把總線拉低1us
- i++;
- DSPORT=dat&0x01; //然后寫入一個(gè)數(shù)據(jù),從最低位開始
- i=6;
- while(i--); //延時(shí)68us,持續(xù)時(shí)間最少60us
- DSPORT=1; //然后釋放總線,至少1us給總線恢復(fù)時(shí)間才能接著寫入第二個(gè)數(shù)值
- dat>>=1;
- }
- }
- /*******************************************************************************
- * 函數(shù)名 : Ds18b20ReadByte
- * 函數(shù)功能 : 讀取一個(gè)字節(jié)
- * 輸入 : com
- * 輸出 : 無(wú)
- *******************************************************************************/
-
-
- unsigned char Ds18b20ReadByte()
- {
- unsigned char byte,bi;
- unsigned int i,j;
- for(j=8;j>0;j--)
- {
- DSPORT=0;//先將總線拉低1us
- i++;
- DSPORT=1;//然后釋放總線
- i++;
- i++;//延時(shí)6us等待數(shù)據(jù)穩(wěn)定
- bi=DSPORT; //讀取數(shù)據(jù),從最低位開始讀取
- /*將byte左移一位,然后與上右移7位后的bi,注意移動(dòng)之后移掉那位補(bǔ)0。*/
- byte=(byte>>1)|(bi<<7);
- i=4; //讀取完之后等待48us再接著讀取下一個(gè)數(shù)
- while(i--);
- }
- return byte;
- }
- /*******************************************************************************
- * 函數(shù)名 : Ds18b20ChangTemp
- * 函數(shù)功能 : 讓18b20開始轉(zhuǎn)換溫度
- * 輸入 : com
- * 輸出 : 無(wú)
- *******************************************************************************/
-
- void Ds18b20ChangTemp()
- {
- Ds18b20Init();
- Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳過(guò)ROM操作命令
- Ds18b20WriteByte(0x44); //溫度轉(zhuǎn)換命令
- Delay1ms(100);
- }
- /*******************************************************************************
- * 函數(shù)名 : Ds18b20ReadTempCom
- * 函數(shù)功能 : 發(fā)送讀取溫度命令
- * 輸入 : com
- * 輸出 : 無(wú)
- *******************************************************************************/
-
- void Ds18b20ReadTempCom()
- {
-
- Ds18b20Init();
- Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳過(guò)ROM操作命令
- Ds18b20WriteByte(0xbe); //發(fā)送讀取溫度命令
- }
- /*******************************************************************************
- * 函數(shù)名 : Ds18b20ReadTemp
- * 函數(shù)功能 : 讀取溫度
- * 輸入 : com
- * 輸出 : 無(wú)
- *******************************************************************************/
-
- int Ds18b20ReadTemp()
- {
- unsigned char tmh,tml;
- Ds18b20ChangTemp(); //先寫入轉(zhuǎn)換命令
- Ds18b20ReadTempCom(); //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
- tml=Ds18b20ReadByte(); //讀取溫度值共16位,先讀低字節(jié)
- tmh=Ds18b20ReadByte(); //再讀高字節(jié)
- temp=tmh;
- temp<<=8;
- temp|=tml;
- s=(unsigned int)(tml&0x0f);
- s=(s*100)/16;
- return temp;
- }
-
-
-
- //LCD.c
- #include"lcd.h"
- /*******************************************************************************
- * 函數(shù)名 : Delay1us
- * 函數(shù)功能 : 延時(shí)函數(shù),延時(shí)1us
- * 輸入 : a
- * 輸出 : 無(wú)
- *******************************************************************************/
- float realtmp=0;
-
- void Delay1us(unsigned int a)
- {
- unsigned int b,c;
- for(c=a;c>0;c--)
- for(b=110;b>0;b--);
- }
- /*******************************************************************************
- * 函數(shù)名 : LcdWriteCom
- * 函數(shù)功能 : 向LCD寫入一個(gè)字節(jié)的命令
- * 輸入 : com
- * 輸出 : 無(wú)
- *******************************************************************************/
-
- void LcdWriteCom(unsigned char com) //寫入命令
- {
- RS=0;
- RW=0;
- GPIO_LCD=com;
- Delay1us(10);
- LCDE=1;
- Delay1us(10);
- LCDE=0;
- }
- /*******************************************************************************
- * 函數(shù)名 : LcdWriteData
- * 函數(shù)功能 : 向LCD寫入一個(gè)字節(jié)的數(shù)據(jù)
- * 輸入 : dat
- * 輸出 : 無(wú)
- *******************************************************************************/
-
- void LcdWriteData(unsigned char dat) //寫入數(shù)據(jù)
- {
- RS=1;
- RW=0;
- GPIO_LCD=dat;
- Delay1us(10);
- LCDE=1;
- Delay1us(10);
- LCDE=0;
- }
- /*******************************************************************************
- * 函數(shù)名 : LcdInit()
- * 函數(shù)功能 : 初始化LCD屏
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- *******************************************************************************/
-
- void LcdInit() //LCD初始化子程序
- {
- LcdWriteCom(0x38); //開顯示
- LcdWriteCom(0x0c); //開顯示不顯示光標(biāo)
- LcdWriteCom(0x06); //寫一個(gè)指針加1
- LcdWriteCom(0x01); //清屏
- LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點(diǎn)
- }
-
- void LcdDisplay(int temp) //lcd顯示
- {
-
- unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
- float tp;
- //初始化LCD
- if(temp< 0) //當(dāng)溫度值為負(fù)數(shù)
- {
- LcdWriteCom(0x80); //寫地址 80表示初始地址
- LcdWriteData('-'); //顯示負(fù)
- //因?yàn)樽x取的溫度是實(shí)際溫度的補(bǔ)碼,所以減1,再取反求出原碼
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
- //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點(diǎn)后面。
-
- }
- else
- {
- LcdWriteCom(0x80); //寫地址 80表示初始地址
- LcdWriteData('+'); //顯示正
- tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
- //如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
- temp=tp*0.0625*100+0.5;
- //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
- //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點(diǎn)后面。
- realtmp=(float)temp/100;
- }
- datas[0] = temp / 10000;
- datas[1] = temp % 10000 / 1000;
- datas[2] = temp % 1000 / 100;
- datas[3] = temp % 100 / 10;
- datas[4] = temp % 10;
-
- LcdWriteCom(0x82); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[0]); //百位
-
-
- LcdWriteCom(0x83); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[1]); //十位
-
- LcdWriteCom(0x84); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[2]); //個(gè)位
-
- LcdWriteCom(0x85); //寫地址 80表示初始地址
- LcdWriteData('.'); //顯示 ‘.’
-
- LcdWriteCom(0x86); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[3]); //顯示小數(shù)點(diǎn)
-
- LcdWriteCom(0x87); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[4]); //顯示小數(shù)點(diǎn)
-
- LcdWriteCom(0x88); //寫地址 80表示初始地址
- LcdWriteData('C');
- }
-
- void LcdDisplay2(float num)
- {
- unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
- int temp;
- // LcdInit(); //初始化LCD
-
- LcdWriteCom(0xC0); //寫地址 80表示初始地址
- LcdWriteData('+'); //顯示正
- temp=num*100+0.5;
- //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
- //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點(diǎn)后面。
-
- datas[0] = temp / 10000;
- datas[1] = temp % 10000 / 1000;
- datas[2] = temp % 1000 / 100;
- datas[3] = temp % 100 / 10;
- datas[4] = temp % 10;
-
- LcdWriteCom(0xC1); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[0]); //百位
-
-
- LcdWriteCom(0xC2); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[1]); //十位
-
- LcdWriteCom(0xC3); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[2]); //個(gè)位
-
- LcdWriteCom(0xC4); //寫地址 80表示初始地址
- LcdWriteData('.'); //顯示 ‘.’
-
- LcdWriteCom(0xC5); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[3]); //顯示小數(shù)點(diǎn)
-
- LcdWriteCom(0xC6); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[4]); //顯示小數(shù)點(diǎn)
-
- LcdWriteCom(0xC7); //寫地址 80表示初始地址
- LcdWriteData('C');
- }
-
- void LcdDisplay3(float num)
- {
- unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
- int temp;
- // LcdInit(); //初始化LCD
-
- LcdWriteCom(0xC8); //寫地址 80表示初始地址
- LcdWriteData('+'); //顯示正
- temp=num*100+0.5;
- //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
- //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點(diǎn)后面。
-
- datas[0] = temp / 10000;
- datas[1] = temp % 10000 / 1000;
- datas[2] = temp % 1000 / 100;
- datas[3] = temp % 100 / 10;
- datas[4] = temp % 10;
-
- LcdWriteCom(0xC9); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[0]); //百位
-
-
- LcdWriteCom(0xCA); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[1]); //十位
-
- LcdWriteCom(0xCB); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[2]); //個(gè)位
-
- LcdWriteCom(0xCC); //寫地址 80表示初始地址
- LcdWriteData('.'); //顯示 ‘.’
-
- LcdWriteCom(0xCD); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[3]); //顯示小數(shù)點(diǎn)
-
- LcdWriteCom(0xCE); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[4]); //顯示小數(shù)點(diǎn)
-
- LcdWriteCom(0xCF); //寫地址 80表示初始地址
- LcdWriteData('C');
- }
復(fù)制代碼
完整的Word格式文檔51黑下載地址:
基于51單片機(jī)的PID調(diào)溫(熱得快).doc
(4.46 MB, 下載次數(shù): 279)
2018-5-30 20:56 上傳
點(diǎn)擊文件名下載附件
|