娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年10月05日(星期六)

正在發生

2018年10月05日 | 51單片機溫度PID算法(C程序)

發布者:RadiantGlow 來源: eefocus關鍵字:51單片機  溫度PID算法 手機看文章 掃描二維碼
隨時隨地手機看文章

#include "reg51.h"


#include "intrins.h"


#include "math.h"


#include "string.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) 


sbit data1=P1^0; 


sbit clk=P1^1; 


sbit plus=P2^0; 


sbit subs=P2^1; 


sbit stop=P2^2; 


sbit output=P3^4; 


sbit DQ=P3^3; 


unsigned char flag,flag_1=0; 


unsigned char high_time,low_time,count=0;//占空比調節參數 


unsigned char set_temper=25; 


unsigned char temper; 


unsigned char i; 


unsigned char j=0; 


unsigned int s; 

 

void delay(unsigned char time) 



unsigned char m,n; 


for(n=0;n


for(m=0;m<2;m++){} 


 


void write_bit(unsigned char bitval) 



EA=0; 


DQ=0;  


if(bitval==1) 



_nop_(); 


DQ=1;  



delay(5);  


DQ=1;  


_nop_(); 


_nop_(); 


EA=1; 


 


void write_byte(unsigned char val) 



unsigned char i; 


unsigned char temp; 


EA=0; 


TR0=0; 


for(i=0;i<8;i++)  



temp=val>>i;  


temp=temp&1; 


write_bit(temp);  



delay(7);  


// TR0=1; 


EA=1; 


 


unsigned char read_bit() 



unsigned char i,value_bit; 


EA=0; 


DQ=0;  


_nop_(); 


_nop_(); 


DQ=1;  


for(i=0;i<2;i++){} 


value_bit=DQ; 


EA=1; 


return(value_bit); 


 


unsigned char read_byte() 



unsigned char i,value=0; 


EA=0; 


for(i=0;i<8;i++) 



if(read_bit())  


value|=0x01<


delay(4);  



EA=1; 


return(value); 


 

unsigned char reset() 



unsigned char presence; 


EA=0; 


DQ=0;  


delay(30);  


DQ=1;  


delay(3); 


presence=DQ;  


delay(28);  


EA=1; 


return(presence);  


 

void get_temper() 



unsigned char i,j; 


do 



i=reset();  


} while(i!=0);  


i=0xcc;  


write_byte(i); 


i=0x44;  


write_byte(i); 


delay(180);  


do 



i=reset();  


} while(i!=0); 


i=0xcc;  


write_byte(i); 


i=0xbe;  


write_byte(i); 


j=read_byte(); 


i=read_byte(); 


i=(i<<4)&0x7f; 


s=(unsigned int)(j&0x0f); //得到小數部分 


s=(s*100)/16; 


j=j>>4; 


temper=i|j;  


 


void PIDInit (struct PID *pp) 



memset ( pp,0,sizeof(struct PID)); //全部初始化為0 


 


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_temper() 



unsigned char i; 


if(set_temper>temper) //是否設置的溫度大于實際溫度 



if(set_temper-temper>1) //設置的溫度比實際的溫度是否是大于1度 



high_time=100; //如果是,則全速加熱 


low_time=0; 



else //如果是在1度范圍內,則運行PID計算 



for(i=0;i<10;i++) 



get_temper(); //獲取溫度 


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<=temper) 



if(temper-set_temper>0) 



high_time=0; 


low_time=100; 



else 



for(i=0;i<10;i++) 



get_temper(); 


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 


// {} 


 


void serve_T0() interrupt 1 using 1 



if(++count<=(high_time)) 


output=1; 


else if(count<=100) 



output=0; 



else 


count=0; 


TH0=0x2f; 


TL0=0xe0; 


 


void serve_sio() interrupt 4 using 2 


 




void disp_1(unsigned char disp_num1[6]) 



unsigned char n,a,m; 


for(n=0;n<6;n++) 



// k=disp_num1[n]; 


for(a=0;a<8;a++) 



clk=0; 


m=(disp_num1[n]&1); 


disp_num1[n]=disp_num1[n]>>1; 


if(m==1) 


data1=1; 


else 


data1=0; 


_nop_(); 


clk=1; 


_nop_(); 




 

void display() 


unsigned char code number[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6}; 


unsigned char disp_num[6]; 


unsigned int k,k1; 


k=high_time; 


k=k00; 


k1=k/100; 


if(k1==0) 


disp_num[0]=0; 


else 


disp_num[0]=0x60; 


k=k0; 


disp_num[1]=number[k/10]; 


disp_num[2]=number[k]; 


k=temper; 


k=k0; 


disp_num[3]=number[k/10]; 


disp_num[4]=number[k]+1; 


disp_num[5]=number[s/10]; 


disp_1(disp_num); 


 

void main() 



unsigned char z; 


unsigned char a,b,flag_2=1,count1=0; 


unsigned char phil[]={2,0xce,0x6e,0x60,0x1c,2}; 


TMOD=0x21; 


TH0=0x2f; 


TL0=0x40; 


SCON=0x50; 


PCON=0x00; 


TH1=0xfd; 


TL1=0xfd; 


PS=1; 


EA=1; 


EX1=0; 


ET0=1; 


ES=1; 


TR0=1; 


TR1=1; 


high_time=50; 


low_time=50; 


PIDInit ( &spid ); // Initialize Structure 


spid.Proportion = 10; // Set PID Coefficients 比例常數 Proportional Const 


spid.Integral = 8; //積分常數 Integral Const 


spid.Derivative =6; //微分常數 Derivative Const 


spid.SetPoint = 100; // Set PID Setpoint 設定目標 Desired Value 


while(1) 




if(plus==0) 



EA=0; 


for(a=0;a<5;a++) 


for(b=0;b<102;b++){} 


if(plus==0) 



set_temper++; 


flag=0; 




else if(subs==0) 



for(a=0;a<5;a++) 


for(b=0;a<102;b++){} 


if(subs==0) 



set_temper--; 


flag=0; 




else if(stop==0) 



for(a=0;a<5;a++) 


for(b=0;b<102;b++){} 


if(stop==0) 



flag=0; 


break; 



EA=1; 



get_temper(); 


b=temper; 


if(flag_2==1) 


a=b; 


if((abs(a-b))>5) 


temper=a; 


else 


temper=b; 


a=temper; 


flag_2=0; 


if(++count1>30) 



display(); 


count1=0; 



compare_temper(); 



TR0=0; 


z=1; 


while(1) 



EA=0; 


if(stop==0) 



for(a=0;a<5;a++) 


for(b=0;b<102;b++){} 


if(stop==0) 


disp_1(phil); 


// break; 



EA=1; 



}


關鍵字:51單片機  溫度PID算法 引用地址:51單片機溫度PID算法(C程序)

上一篇:12864液晶顯示原理(C程序)
下一篇:單片機萬年歷DS1302時鐘芯片的應用

推薦閱讀

我們來看看 timer.c文件中,我們添加的兩個函數的內容:TIM_ICInitTypeDef TIM5_ICInitStructure;//定時器 5通道1 輸入捕獲配置//arr:自動重裝值(TIM2,TIM5 是 32位的!!) psc:時鐘預分頻數void TIM5_CH1_Cap_Init(u32 arr,u16 psc){ GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTy...
特斯拉為了實現全自動駕駛目標,積極開發相關硬件。今年8 月,馬斯克在Hot Chips 大會上,分享特斯拉自行開發的AI 芯片設計細節,并稱其為「全球最強芯片」。特斯拉先前采用的是NVIDIA的芯片。根據cnet等外媒報導,特斯拉自行開發的AI芯片效能是先前NVIDIA芯片的21倍,成本還更低,但離全自動駕駛的目標,特斯拉還有一段很長的路要走。每臺特斯拉都會...
談到醫療機器人,許多人都會起到美國Intuitive surgical公司研發的達芬奇機器人,它是世界第一款手術機器人,代表著機器人在醫療行業應用的重要里程碑。不過,達芬奇仍然是由人類控制的機器系統。隨著人工智能技術的進步發展,醫療行業又發生了巨大的變化。利用機器學習的方法,可以對不同病例進行學習,再結合所有醫學知識庫的知識,能夠快速診斷出病情...

史海拾趣

問答坊 | AI 解惑

模擬電路的前途究竟如何

現在數字電路越來越大行其道,模擬電路究竟還有多大的應用空間?有人說,在很大范圍內,數字電路一定會取代模擬電路;但又有人說,模擬電路不可能完全取代數字電路。所以究竟未來模擬電路的空間有多大?…

查看全部問答∨

IGBT 模塊的有關保護問題

摘要:全面論述了IGBT模塊的過流保護、過壓保護與過熱保護的有關問題, 并從實際應用中總結出各種保護方法,這些方法實用性強,保護效果好。…

查看全部問答∨

LED驅動85-265v 爬電距離與電氣距離

爬電距離和電氣間隙的測試也是安規測試中的一個重點和難點,但往往在設計中被忽視掉. 參考標準 IEC60335-1 CL29 IEC60598-1 CL11 IEC600065 CL11 IEC60950-1 CL2.10 ...... 這個議題好,爬電距離與電氣間隙在我腦海中概念一 ...…

查看全部問答∨

急!串口數據為什么丟失

平臺:s3c2440 + wince5 按標準的流驅動模型,編寫了一個UART的測試驅動Dll,開發板UART與PC串口相連 //因無法上網只能寫個大概了,程序大致如下 #define UART_BASE 0xB1004000 #define INT_BASE  0xB0A00000 #define IOP_BASE &n ...…

查看全部問答∨

求一最簡單電路?

剛接觸單片機,找了一個程序,買了一個89c51,5歐電阻,電容,一個晶振,一個發光二極管,一個面包板,5v/1安變壓器,想讓二極管閃起來,請最簡單的電路。謝謝 #include <AT89X51.h> //預處理命令 void main(void) //主函數名 { //這是第一 ...…

查看全部問答∨

求助申請樣片出現問題

如圖: 我記得上次申請,非論壇的活動,不會出現這個,這是怎么回事呢? …

查看全部問答∨

求助———人體紅外感應模塊怎么批量測試

最近用BIS0001做人體紅外感應模塊,模塊是做成功了,但不會批量測試。哪位大神知道批量測試方法,比如用什么設備,要測哪些參數等。急需這方面的信息 …

查看全部問答∨

軟件測試經典資料大推薦(二十五)--嵌入式軟件測試

軟件測試經典資料大推薦(二十五)--嵌入式軟件測試 程序員之間流傳著這樣一句順口溜:有人喜歡創造世界,他們做了開發者;有的人喜歡開發者,他們做了測試員。 什么是軟件測試?軟件測試就是一場本該在用戶面前發生的災難提前在自己面前發生了, ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 曲阳县| 邻水| 武冈市| 日照市| 仁怀市| 长子县| 连平县| 英山县| 桂阳县| 札达县| 嘉黎县| 安阳县| 正镶白旗| 巩留县| 益阳市| 闸北区| 乌苏市| SHOW| 北辰区| 呼玛县| 漠河县| 滦南县| 来安县| 哈尔滨市| 泰宁县| 铅山县| 右玉县| 北辰区| 襄垣县| 遵化市| 九寨沟县| 丽水市| 霞浦县| 西畴县| 宜兰市| 开远市| 延长县| 乾安县| 拉萨市| 凤阳县| 南涧|