定位演算法c語言
❶ c語言程序設計
第一章 程序設計的基本概念
第一節 C語言的發展歷史與特點
第二節 程序與程序設計
第三節 演算法與演算法的描述
第四節 C語言的上機操作
思考題與習題
第二章 C語言程序設計基礎
第一節 C語言的程序結構
第二節 數據類型
第三節 運算符與表達式
思考題與習題
第三章 C程序控制結構
第一節 C程序的三種基本控制結構
第二節 順序結構
第三節 選擇結構
第四節 循環結構
思考題與習題
第四章 數組
第一節 數組與數組元素的概念
第二節 一維數組
第三節 二維數組及多維數組
第四節 字元串與字元數組
思考題與習題
第五章 指針
第一節 指針與指針變數的概念
第二節 指針變數的定義和引用
第三節 指針變數與數組
思考題與習題
第六章 函數
第一節 函數的定義
第二節 函數的嵌套調用
第三節 數組作為函數參數
第四節 指針與函數
第五節 變數的使用范圍與存儲類別
第六節 不同文件中的函數使用
思考題與習題
第七章 編譯預處理
第一節 宏定義
第二節 文件包含
第三節 條件編譯
思考題與題
第八章 結構體與共用體
第一節 結構體基礎
第二節 結構體數組
第三節 結構體指針
第四節 鏈表
第五節 位段
第六節 共用體
第七節 枚舉類型與自定義類型
思考題與習題
第九章 文件
第一節 文件概述
第二節 文件的打開與關閉
第三節 文件的讀/寫
第四節 文件的定位
思考題與習題
第十章 程序設計方法
第一節 程序設計的基本概念
第二節 結構化程序設計方法
第三節 程序效率
第四節 程序設計風格
思考題與習題
附錄
附錄A C語言實驗
附錄B 標准ABSII碼表
附錄C C語言中的關鍵字
附錄D 運算符的優先順序與結合性
❷ 很簡單的C語言貪心演算法,用map做的,但我對map有個問題
改成 pw.insert(make_pair(5,10));
❸ 數據結構與演算法分析 —— C 語言描述:開放定址法
分離鏈接散列演算法的缺點是需要指針,由於給新單元分配地址需要時間,因此這就導致演算法的速度多少有些緩慢,同時演算法實際上還要求實現另一種數據結構。除使用鏈表解決沖突外,開放定址散列法(open addressing hashing)是另外一種用鏈表解決沖突的方法。在開放定址散列演算法系統中,如果有沖突發生,那麼就要嘗試選擇另外的單元,直到找出空的單元為止。更一般地,單元 相繼試選,其中 ,且 。函數 F 是沖突解決方法,因為所有的數據都要置入表內,所以開放定址散列法所需要的表要比分離鏈接散列用的表大。一般說來,對開放定址散列演算法來說,裝填因子應該低於 。開放定址散列法有三種常用的沖突解決辦法:
在線性探測法中,函數 F 是 的線性函數,典型的情形是 。這相當於逐個探測每個單元(必要時可以繞回)以查找出一個空空單元。即插入一個第一個沖突關鍵字,它將被放入下一個空閑地址,即地址 0,該地址是開放的。之後插入的沖突關鍵字,會對表進行試選,只要表足夠大,總能夠找到一個自由單元,但是如此花費的時間是相當多的。更糟的是,即使表相對較空,這樣占據的單元也會開始形成一些區塊,其結果稱為一次聚集(primary clustering),於是,散列到區塊中的任何關鍵字都需要多次試選單元才能解決沖突,然後該關鍵字被添加到相應的區塊中。
可以證明,使用線性探測的預期探測次數對於插入和不成功的查找來說大約為 ,而對於成功的查找來說則是 。略加思考不難得出,成功查找應該比不成功查找平均花費較少的時間。
如果聚算不算是問題,那麼對應的公式就不難得到。我們假設有一個很大的表,並設每次探測都與前面的探測無關。對於隨機沖突解決辦法而言,這些假設是成立的,並且當 不是非常接近 1 時也是合理的。首先,我們導出在一次不成功查找中探測的期望次數,而這正是直到我們找到一個空單元的探測次數。由於空單元所佔的份額為 ,因此我們預計要探測的單元數是 。一次成功查找的探測次數等於該特定元素插入時所需要的探測次數。當一個元素被插入時,可以看成是一次不成功查找的結果。因此,我們可以使用一次不成功查找的開銷來計算一次成功查找的平均開銷。
需要指出, 在 0 到當前值之間的變化,因此早期的插入操作開銷較少,從而降低平均開銷。我可以通過使用積分計算插入時間平均值的方法來估計平均值,如此得到
這些公式顯然優於線性探測相應的公式,聚集不僅是理論上的問題,而且實際上也發生在具體的實現中。線性探測的預計探測次數與 呈正比,即 越小,插入操作平均次數越少。
平方探測是消除線性探測中一次聚集問題的沖突解決辦法。平方探測就是沖突函數為二次函數的探測方法。流行的選擇是 。
對於線性探測,讓元素幾乎填滿散列表並不是個好主意,因為此時表的性能會降低。對於平方探測情況甚至更糟:一旦表被填滿超過一半,當表的大小不是素數時甚至在表被填滿超過一半之前,就不能保證一次找到一個空單元了。這是因為最多有一半的表可以用作解決沖突的備選位置。
定理:如果使用平方探測,且表的大小是素數,那麼當表至少有一半是空的時候,總能夠插入一個新的元素。
哪怕表有比一半多一個的位置被填滿,那麼插入都有可能失敗(雖然這是非常難以見到的,但是把它記住很重要。)。另外,表的大小是素數也非常重要,如果表的大小不是素數,則備選單元的個數可能會銳減。
在開放定址散列表中,標準的刪除操作不能施行,因為相應的單元可能已經引起過沖突,元素繞過它存在了別處。例如,如果我們刪除一個沖突的中間元素,那麼實際上所有其他的 Find 常式都將不能正確運行。因此,開放定址散列表需要懶惰刪除,雖然在這種情況下並不存在真正意義上的懶惰。
開放定址散列表的類型聲明如下,這里,我們不用鏈表數組,而是使用散列表項單元的數組,與在分離鏈接散列中一樣,這些單元也是動態分配地址的。
初始化開放定址散列表的常式如下,由分配空間(第1~10行)及其後將每個單元的 Info 域設置為 Empty 組成。
使用平方探測散列法的 Find 常式如下。如果分裂鏈接散列法一樣, 將返回 Key 在散列表中的位置。如果 Key 不出現,那麼 Find 將返回最後的單元。該單元就是當需要時,Key 將被插入的地方。此外,因為被標記了 Empty,所以表達 Find 失敗很容易。為了方便起見,我們假設散列表的大小至少為表中元素個數的兩倍,因此平方探測方法總能夠實現。否則,我們就要在第 4 行前測試 。在下面的常式中,標記為刪除的那些元素被認為還在表內,這可能引起一些問題,因為該表可能提前過滿。
第 4~6 行為進行平方探測的快速方法。由平方解決函數的定義可知, ,因此,下一個要探測的單元可以用乘以 2(實際上就是進行一位二進制移位)並減 1 來確定。如果新的定位越過數組,那麼可以通過減去 TableSize 把它拉回到數組范圍內。這比通常的方法要快,因為它避免了看似需要的乘法和除法。注意一條重要的警告:第 3 行的測試順序很重要,切勿改變它。
下面的常式是插入。正如分離鏈接散列方法那樣,若 Key 已經存在,則我們就什麼也不做。其他工作只是簡單的修改。否則,我們就把要插入的元素放在 Find 常式指出的地方。
雖然平方探測排除了一次聚集,但是散列到同一位置上的那些元素將探測相同的備選單元。這叫做二次聚集(secondary clustering)。二次聚集是理論上的一個小缺憾,模擬結果指出,對每次查找,它一般要引起另外的少於一半的探測。
雙散列(double hashing)能夠解決平方探測中的二次聚集問題,不過也需要花費另外的一些乘法和除法形銷。對於雙散列,一種流行的選擇是 。這個公式是說,我們將第二個散列函數應用到 X 並在距離 , 等處探測。 選擇的不好將會是災難性的。
在雙散列時,保證表的帶下為素數是非常重要的。假設我們在插入一個關鍵字的時候,發現它已經引發沖突,就會選擇備選位置,如果表的大小不是素數,那麼備選單元就很有可能提前用完。然後,如果雙散列正確實現,則模擬表明,預期的探測次數幾乎和隨機沖突解決方法的情形相同。這使得雙散列理論上很有吸引力,不過,平方探測不需要使用第二個散列函數,從而在實踐中可能更簡單並且更快。
❹ C語言程序設計
這個也不是很全,但是大體功能有了,你改進一下嘛,我運行過的可以!
希望對你有所幫助!
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10 /*定義常量SIZE便於以後的修改*/
struct student /*定義一個結構體數組存放學生的信息*/
{
int number; /*學號*/
char name[20];/*名字*/
float score[3];/*分數*/
float average;/*平均分*/
}stu[SIZE];
void menu();/*調用菜單函數*/
void write();/*讀入信息*/
void save();/*保存stud.dat文件函數*/
void open();/*檢查喊姿是否正確保存*/
void inturn (struct student c[]);/*用於對學生的信息按平均分排序的函數*/
void save2();/*將排序後的信息存入studsort.dat文件中*/
void read();/*讀取studsort.dat文件文件中第2 4 6 8 10個學生的信息*/
void main()
{
int choice;/*用戶選擇變數*/
printf("*******************************************************************************\n");
printf("* *\n");
printf("* Hwadee &學生成績文件管理& Hwadee *\n");
printf("* *\n");
printf("*******************************************************************************\n\n\n");
printf("******************************●●歡迎使用●●*********************************");
system("pause");
while (1)
{
menu();/*調用菜單函數形成操作界面*/
printf("請選擇:\t");
scanf("%d", &choice);
if ( choice == 0 )
{
system("cls");
printf("\n\n\t\t\t\t謝謝使用!!!\n\n\t\t\t\t\t\t\t\t指導老師: 梁凱\n\n\t\t\t\t\t\t\t\t 學生:萬超\n");
break;
}
switch(choice) /*多重選擇實現功能不同的功能*/
{
case 1:
write();
break;
case 2:
system("cls");
save();
break;
case 3:
system("pause");
system("cls");
open();
break;
case 4:
system("cls");
printf("排序前的學生信息:\n");
open();
inturn(stu);
save2();
break;
case 5:
system("cls");
read();
break;
default:
printf("\n無此項功能!\n請重新輸入\n");
}
}
}
void menu()
{
printf("\n1*****輸入學生信息\t\t2*****將信息存入文件stud.dat中\n");
printf("3*****檢查文件襪簡數據\告滲褲t\t4*****將學生信息排序並存入文件studsort.dat中\n");
printf("5*****讀取文件studsort.dat中的第 2 4 6 8 10個學生的信息\n");
printf("0*****退出系統\n\n\n");
}
/**********************************************************************\
函數名稱:
write
功能描述:
完成將學生信息寫入
函數參數:
i stu
返回值:
無
模塊歷史:
\*********************************************************************/
void write()
{
int i;/*計數變數*/
stu[i].average = 0;/*初始化結構體成員 average*/
printf("請你輸入學生的信息\n");
printf("學號\t姓名\t語文\t數學\t英語\t\n");
for (i=0; i<SIZE;i++)
{
scanf("%d\t",&stu[i].number);
if (stu[i].number == 0)/*不需輸入信息時輸入0即可*/
break;
scanf("%s\t%f\t%f\t%f",&stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);
stu[i].average = (stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3;/*計算平均成績*/
}
}
/**********************************************************************\
函數名稱:
save
功能描述:
將寫入的信息讀入文件中
函數參數:
FILE *fp i
返回值:
無
模塊歷史:
\*********************************************************************/
void save()
{
FILE *fp;/*定義文件指針用於向文件讀入數據*/
int i;
if ((fp=fopen("stud.dat","wb")) == NULL)
{
printf("cannot open file\n");
return;
}
for (i=0;i<SIZE;i++)
if (fwrite(&stu[i],sizeof(struct student),1,fp) != 1)
printf("file write error\n");
fclose(fp);
printf("\n信息保存成功!恭喜!!\n\n");
}
/**********************************************************************\
函數名稱:
open
功能描述:
用於檢查讀入文件的數據是否正確
函數參數:
FILE *cp i
返回值:
無
模塊歷史:
\*********************************************************************/
void open()
{
int i;
FILE *cp;
cp = fopen ("stud.dat","rb");
printf("保存在stud.dat文件中的信息:\n\n");
printf("學號\t姓名\t數學\t語文\t英語\t平均分\n\n");
for (i=0;i<SIZE;i++)
{
fread(&stu[i],sizeof(struct student),1,cp);
printf("%d\t%s\t%.1f\t%.1f\t%.1f\t%.1f\n\n\n",stu[i].number, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].average );
}
fclose (cp);
}
/**********************************************************************\
函數名稱:
inturn
功能描述:
用於對結構體數組中的元素排序
函數參數:
into i,j,k
struct student temp
返回值:
無
模塊歷史:
\*********************************************************************/
void inturn(struct student m[])
{
int i,j,k;/*計數變數*/
struct student temp;/*中間變數 類型為結構體*/
for(i=0; i<SIZE-1; i++) /*運用冒泡排序對結構體數組進行排序*/
for (j=i+1; j<SIZE; j++)
{
if( m[i].average < m[j].average )
{
temp = m[i];
m[i] = m[j];
m[j] = temp;
}
}
printf("\n排序後的學生信息:\n\n");
printf(" 學號\t姓名\t數學\t語文\t英語\t平均分\n");
for (i=0; i<SIZE; i++)
{
printf("第%d名 %d\t%s\t%.1f\t%.1f\t%.1f\t%.1f\n\n\n",i+1, stu[i].number, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].average );
}/*輸出排序後的學生信息*/
}
/**********************************************************************\
函數名稱:
save2
功能描述:
將排序後的學生信息讀入到另外的文件中
函數參數:
FILE *mp
i
返回值:
無
模塊歷史:
\*********************************************************************/
void save2()
{
FILE *mp;
int i;
if ((mp=fopen("studsort.dat","wb"))==NULL)
{
printf("cannot open file\n");
return;
}
for (i=0;i<SIZE;i++)
if (fwrite(&stu[i], sizeof(struct student), 1, mp) != 1)
printf("file write error\n");
fclose(mp);/*讀取完畢關閉文件*/
}
/**********************************************************************\
函數名稱:
read
功能描述:
讀出另外文件中的信息
函數參數:
FILE *tp
i
返回值:
無
模塊歷史:
\*********************************************************************/
void read()
{
int i=1;
FILE *tp;
tp = fopen ("studsort.dat", "rb" );
printf("studsort.dat文件中偶數號碼學生的信息如下:\n\n");
printf("學號\t姓名\t數學\t語文\t英語\t平均分\n\n");
for (i = 1;i<SIZE;i += 2)
{
fseek(tp,i*sizeof(struct student),0);/*fseek函數可以根據用戶所需對文件開頭的偏移量來讀取文件的數據。
k*sizeof(struct student)是指將位置指針移到當前位置k個位元組處*/
fread(&stu[i],sizeof(struct student),1,tp);
/*注意:必須使用fseek函數定位後才能根據自己所需讀出數據,但是只用fseek函數不用fread,
只是把數據列印到屏幕上而並沒有從文件中讀取。這是一個常見性問題*/
printf("%d\t%s\t%.1f\t%.1f\t%.1f\t%.1f\n", stu[i].number, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].average );
}
fclose (tp);/*讀取完畢關閉文件*/
}
❺ 8位單片機PID控制PWM的演算法如何實現,C語言計算
PID控制在8位單片機中仍然有廣泛的應用,比如溫度控制,利用比例、積分、微分補償來做恆溫補償控制,當然由於有這些數學處理,用C語言相對方便一些,以下是一個具體的實例。
#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=35;
unsigned char temper;
unsigned char i;
unsigned char j=0;
unsigned int s;
/***********************************************************
延時子程序,延時時間以12M晶振為准,延時時間為30us×time
***********************************************************/
void delay(unsigned char time)
{
unsigned char m,n;
for(n=0;n<time;n++)
for(m=0;m<2;m++){}
}
/***********************************************************
寫一位數據子程序
***********************************************************/
void write_bit(unsigned char bitval)
{
EA=0;
DQ=0; /*拉低DQ以開始一個寫時序*/
if(bitval==1)
{
_nop_();
DQ=1; /*如要寫1,則將匯流排置高*/
}
delay(5); /*延時90us供DA18B20采樣*/
DQ=1; /*釋放DQ匯流排*/
_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); /*延時120us後*/
// TR0=1;
EA=1;
}
/***********************************************************
讀一位數據子程序
***********************************************************/
unsigned char read_bit()
{
unsigned char i,value_bit;
EA=0;
DQ=0; /*拉低DQ,開始讀時序*/
_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<<i;
delay(4); /*延時80us以完成此次都時序,之後再讀下一數據*/
}
EA=1;
return(value);
}
/***********************************************************
復位子程序
***********************************************************/
unsigned char reset()
{
unsigned char presence;
EA=0;
DQ=0; /*拉低DQ匯流排開始復位*/
delay(30); /*保持低電平480us*/
DQ=1; /*釋放匯流排*/
delay(3);
presence=DQ; /*獲取應答信號*/
delay(28); /*延時以完成整個時序*/
EA=1;
return(presence); /*返回應答信號,有晶元應答返回0,無晶元則返回1*/
}
/***********************************************************
獲取溫度子程序
***********************************************************/
void get_temper()
{
unsigned char i,j;
do
{
i=reset(); /*復位*/
} while(i!=0); /*1為無反饋信號*/
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; /*獲取的溫度放在temper中*/
}
/*====================================================================================================
Initialize PID Structure
=====================================================================================================*/
void PIDInit (struct PID *pp)
{
memset ( pp,0,sizeof(struct PID)); //全部初始化為0
}
/*====================================================================================================
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_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
// {}
}
/*****************************************************
T0中斷服務子程序,用於控制電平的翻轉 ,40us*100=4ms周期
******************************************************/
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
{
/* EA=0;
RI=0;
i=SBUF;
if(i==2)
{
while(RI==0){}
RI=0;
set_temper=SBUF;
SBUF=0x02;
while(TI==0){}
TI=0;
}
else if(i==3)
{
TI=0;
SBUF=temper;
while(TI==0){}
TI=0;
}
EA=1; */
}
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=k%1000;
k1=k/100;
if(k1==0)
disp_num[0]=0;
else
disp_num[0]=0x60;
k=k%100;
disp_num[1]=number[k/10];
disp_num[2]=number[k%10];
k=temper;
k=k%100;
disp_num[3]=number[k/10];
disp_num[4]=number[k%10]+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;
}
}