Ⅰ 51單片機最小系統原理圖,求通俗易懂的講解
我是一名電子信息大專畢業的學生,下面51單片機最小系統的講解,你參考一下
51單片機共有40隻引腳.
下面這個就是最小系統原理圖,就是靠這四個部分,這個單片機就可以運行起來了.
一,一講解:
第一部分:電源組(上圖標記為1的部分)
40腳接電源5V,20腳接電源負極,在單片機裡面,負極也可以叫GND或者」地」,我們在單片機的應用中,習慣說負極為」地」,上面GND就是英文ground的縮寫,翻譯過來就是"地"的意思.
第二部分:晶振組(上圖標記為2的部分)
11.0592M晶振Y1與單片機的18,19腳並聯,因為這兩只腳,就是晶振工作的引腳.
22p電容C2一端接18腳,一端接地.
22p電容C3一端接19腳,一端接地.
這兩個電容,我們在10~30P之間選擇都是可以的,主要作用是,過濾掉晶振部分的高頻信號,讓晶振工作的時候更加穩定.
第三部分:復位組(上圖標記為2的部分)
10u電容C1正極接電源5V,C1負極接單片機的復位腳,第9腳.
1K電阻R17一端接單片機的復位腳,第9腳,一端接地.
就是通過這個10u和1k,就可以讓單片機一供電時,單片機自動復位,從零開始執行程序,這個就是復位的概念.
第四部分:其它功能組(上圖標記為4的部分)
這個腳是存儲器使用選擇腳,當這個腳接"地"時,那麼告訴單片機選擇外部存儲器,當這個腳接"5V"時,說明單片機使用內部存儲器.
因為選擇外部存儲器,太浪費單片機僅有的資源,所以這一腳永遠接電源5V(如上圖所示),使用單片機的內部存儲器,如果內部存儲器不夠容量,最多選擇更高級容量的單片機型號,就可以解決問題了.
詳細看下面的帖子,單片機最小系統的通俗易懂講解:
網頁鏈接
滿意請採納,謝謝!
Ⅱ 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;
}
}
Ⅲ 51單片機 DIV指令的具體演算法
DIV是除法指令,除數放在B寄存器中,被除數放在A寄存器中,DIV執行後結果放在A寄存器中,余數放在B寄存器中
Ⅳ 單片機編程步驟
一、什麼是 nec 單片機
隨著大范疇集成電路的顯現和發展,將計算機的cpu、ram、rom、定時/數器和多種i/o介面集成在一片晶元上,組成晶元級的計較機,因此單片機早期的含義稱為單片微型計較機,直譯為單片機。單片機是一種集成在電路晶元,是採用超大范疇集成電路技能把具有數據處理本事的中心處理器CPU隨機存儲器RAM、只讀存儲器ROM、多種I/O口和間斷系統、 定時器 / 計時器 等成果(大要還包括表現驅動電路、脈寬調制電路、模擬多路轉換器、A/D轉換器等電路)集成到一塊矽片上構成的一個小而完竣的計算機系
二、nec單片機的操縱教程詳解
1、在智能儀器儀表中的操縱:在各類儀器儀表中引入單片機,使儀器儀表智能化,進步測試的自動化程度和精度,簡化儀器儀表的硬體結構,進步其性能價格比。
2、在機電一體化中的操縱:機電一體化產品是指集呆板、微電子技能、計較機技能於一本,具有智能化特徵的電子產品。
3、在實時過程式控制制中的操縱:用單片機實時進行數據處理和控制,使系統保持最佳事變狀態,進步系統的事變從命和產品的品格。
4、在人類生活中的操縱:目前國外各種家用電器已普通採用單片機代替傳統的控制電路。
5、在此外方面的操縱:單片機除以上各方面的操縱,它還遍布操縱於辦公自動化范圍、商業營銷范圍、汽車及通信、計較機外部裝備、暗昧控制等各范圍中。
以上就是為大家整理的關於單片機含義及其具體操縱教程的全部內容了。此外小編還額外為大家整理了單片機的優點:低電壓、低功耗、集成度高、可靠性高、體積小、控製成果強等。希望通過這篇文章能夠給想要了解單片機相關知識的朋友帶來一些幫助。另外大家如果想了解更多單片機的知識可以通過圖書查閱、網路查閱等方式。
Ⅳ pic單片機pid控制演算法參數整定
我這有51的
#include <stdlib.h>
#include "global_varible.h"
/****************************************************************************
* 模塊名: PID
* 描述: PID調節子程序
* 採用PID-PD演算法。在偏差絕對值大於△e時,用PD演算法,以改善動態品質。
* 當偏差絕對值小於△e時,用PID演算法,提高穩定精度。
* PIDout=kp*e(t)+ki*[e(t)+e(t-1)+...+e(1)]+kd*[e(t)-e(t-1)]
*============================================================================
* 入口: 無
* 出口: 無
* 改變: PID_T_Run=加熱時間控制
*****************************************************************************/
void PID_Math(void)
{
signed long ee1; //偏差一階
//signed long ee2; //偏差二階
signed long d_out; //積分輸出
if(!Flag_PID_T_OK)
return;
Flag_PID_T_OK=0;
Temp_Set=3700; //溫度控制設定值37.00度
PID_e0 = Temp_Set-Temp_Now; //本次偏差
ee1 = PID_e0-PID_e1; //計算一階偏差
//ee2 = PID_e0-2*PID_e1+PID_e2; //計算二階偏差
if(ee1 > 500) //一階偏差的限制范圍
ee1 = 500;
if(ee1 < -500)
ee1 = -500;
PID_e_SUM += PID_e0; //偏差之和
if(PID_e_SUM > 200) //積分最多累計的溫差
PID_e_SUM = 200;
if(PID_e_SUM < -200)
PID_e_SUM = -200;
PID_Out = PID_kp*PID_e0+PID_kd*ee1; //計算PID比例和微分輸出
if(abs(PID_e0) < 200) //如果溫度相差小於1.5度則計入PID積分輸出
{
if(abs(PID_e0) > 100) //如果溫度相差大於1度時積分累計限制
{
if(PID_e_SUM > 100)
PID_e_SUM = 100;
if(PID_e_SUM < -100)
PID_e_SUM = -100;
}
d_out = PID_ki*PID_e_SUM; //積分輸出
if(PID_e0 < -5) //當前溫度高於設定溫度0.5度時積分累計限制
{
if(PID_e_SUM > 150)
PID_e_SUM = 150;
if(PID_e_SUM > 0) //當前溫度高於設定溫度0.5度時削弱積分正輸出
d_out >>= 1;
}
PID_Out += d_out; //PID比例,積分和微分輸出
}
else
PID_e_SUM=0;
PID_Out/=100; //恢復被PID_Out系數放大的倍數
if(PID_Out > 200)
PID_Out=200;
if(PID_Out<0)
PID_Out=0;
if(PID_e0 > 300) //當前溫度比設定溫度低3度則全速加熱
PID_Out=200;
if(PID_e0 < -20) //當前溫度高於設定溫度0.2度則關閉加熱
PID_Out=0;
Hot_T_Run=PID_Out; //加熱時間控制輸出
PID_e2 = PID_e1; //保存上次偏差
PID_e1 = PID_e0; //保存當前偏差
}
////////////////////////////////////////////////////////////void PID_Math() end.
Ⅵ 單片機C語言PID自整定演算法
就是一般的排序演算法,與查找演算法一樣,這個的都不會嗎floata[3],max=0;for(i=0;i<=2;i++){printf("Pleaseenterthemark:");scanf("%f",&a[i]);if(maxintsort(intnum[5]);voidmain(){intnumm[5],i,a;for(i=0;i<5;i++)scanf("%d",&numm[i]);sort(numm);//調用排序for(i=0;i<5;i++)printf("%d",numm[i]);}intsort(intnum[5]){intm,n,t;for(m=0;m<4;m++)for(n=m+1;n<5;n++)//冒泡排序{if(num[m]
Ⅶ 單片機的演算法,請問演算法是什麼意思
顧名思義,就是單片機做計算的計算方法,
可以直接使用一些通用的演算法,
但單片機資源少,計算速度也比較慢,所以有時候需要一些針對性的演算法。
Ⅷ 單片機中的PID演算法是什麼意思啊,有什麼用途呢謝謝!
pid就是比例積分微分演算法
Ⅸ 請問單片機驅動TFT彩屏怎樣顯示任意大小的圖片
這個我做過,看他的例子里顯示圖片那個函數是不是有個循環,for(i=0;i<xxx;i++)
XXX就是你要顯示的圖片的長*寬*2;這樣就可以了。有問題找我,ID是我的qq,希望能幫助你