本文主要是關(guān)于51單片機(jī)的相關(guān)介紹,并著重對(duì)51單片機(jī)的原理及其應(yīng)用進(jìn)行了詳盡的闡述。
51單片機(jī)
51單片機(jī)是對(duì)所有兼容Intel 8031指令系統(tǒng)的單片機(jī)的統(tǒng)稱。該系列單片機(jī)的始祖是Intel的8004單片機(jī),后來隨著Flash rom技術(shù)的發(fā)展,8004單片機(jī)取得了長足的進(jìn)展,成為應(yīng)用最廣泛的8位單片機(jī)之一,其代表型號(hào)是ATMEL公司的AT89系列,它廣泛應(yīng)用于工業(yè)測(cè)控系統(tǒng)之中。很多公司都有51系列的兼容機(jī)型推出,今后很長的一段時(shí)間內(nèi)將占有大量市場(chǎng)。51單片機(jī)是基礎(chǔ)入門的一個(gè)單片機(jī),還是應(yīng)用最廣泛的一種。需要注意的是51系列的單片機(jī)一般不具備自編程能力。
功能
·8位CPU·4kbytes程序存儲(chǔ)器(ROM) (52為8K)
·128bytes的數(shù)據(jù)存儲(chǔ)器(RAM) (52有256bytes的RAM)
·32條I/O口線·111條指令,大部分為單字節(jié)指令
·21個(gè)專用寄存器
·2個(gè)可編程定時(shí)/計(jì)數(shù)器·5個(gè)中斷源,2個(gè)優(yōu)先級(jí)(52有6個(gè))
·一個(gè)全雙工串行通信口
·外部數(shù)據(jù)存儲(chǔ)器尋址空間為64kB
·外部程序存儲(chǔ)器尋址空間為64kB
·邏輯操作位尋址功能·雙列直插40PinDIP封裝
CPU:由運(yùn)算和控制邏輯組成,同時(shí)還包括中斷系統(tǒng)和部分外部特殊功能寄存器;
RAM:用以存放可以讀寫的數(shù)據(jù),如運(yùn)算的中間結(jié)果、最終結(jié)果以及欲顯示的數(shù)據(jù);
ROM:用以存放程序、一些原始數(shù)據(jù)和表格;
I/O口:四個(gè)8位并行I/O口,既可用作輸入,也可用作輸出
T/C:兩個(gè)定時(shí)/記數(shù)器,既可以工作在定時(shí)模式,也可以工作在記數(shù)模式;
五個(gè)中斷源的中斷控制系統(tǒng);
一個(gè)全雙工UART(通用異步接收發(fā)送器)的串行I/O口,用于實(shí)現(xiàn)單片機(jī)之間或單片機(jī)與微機(jī)之間的串行通信;
片內(nèi)振蕩器和時(shí)鐘產(chǎn)生電路,石英晶體和微調(diào)電容需要外接。最佳振蕩頻率為6M—12M。
學(xué)習(xí)
作為一個(gè)初學(xué)者,如何單片機(jī)入門?
實(shí)際上,其實(shí)不需要多少東西,會(huì)簡(jiǎn)單的C語言,知道51單片機(jī)的基本結(jié)構(gòu)就可以了。一般的大學(xué)畢業(yè)生都可以了,自學(xué)過這2門課程的高中生也夠條件。設(shè)備上,一般是建議購買一個(gè)仿真器,例如,的“雙功能下載線”就具有良好的穩(wěn)定性和較快的下載速度,上位機(jī)可擴(kuò)展,可以下載更多的單片機(jī)及嵌入式芯片。通過實(shí)驗(yàn),這樣才可以進(jìn)行實(shí)際的,全面的學(xué)習(xí)。日后在工作上,仿真器也大有用處。還有,一般光有仿真器是不行,還得有一個(gè)實(shí)際的電路,即學(xué)習(xí)板,如圖,即為,單片機(jī)最小系統(tǒng)。
學(xué)習(xí)板以強(qiáng)大的接口為主,單片機(jī)的學(xué)習(xí)分兩方面,一方面是單片機(jī)的原理及內(nèi)部結(jié)構(gòu),另一方面是單片機(jī)的接口技術(shù)。這些都是需要平時(shí)多積累,多動(dòng)手,多思考,這樣才能學(xué)好單片機(jī)技術(shù)。
注:“雙功能下載線”在百度文庫里有詳細(xì)的使用說明,并且上位機(jī)會(huì)定期更新以支持更多的單片機(jī)。
單片機(jī)學(xué)習(xí)的4個(gè)階段
一、整體了解
要知道 單片機(jī)是什么?單片機(jī)有何用?如何系統(tǒng)學(xué)習(xí)單片機(jī)?單片機(jī)系統(tǒng)設(shè)計(jì)的流程是怎樣的,需要掌握哪些輔助軟件?
了解這些之后,我們的學(xué)習(xí)就有了目標(biāo)和方向。
二、揭秘 單片機(jī)很難學(xué),是因?yàn)槠鋬?nèi)部結(jié)構(gòu)、編程語言抽象,且實(shí)際應(yīng)用中與其他電子技術(shù)和元器件知識(shí)相互關(guān)聯(lián),需結(jié)合起來一起設(shè)計(jì)開發(fā)產(chǎn)品。所以,第二階段要了解單片機(jī)的內(nèi)部結(jié)構(gòu)是怎樣的?單片機(jī)開發(fā)經(jīng)常會(huì)用到哪些電子技術(shù)和元器件知識(shí)?如何將一條條編程指令組合成一段段有效的程序?
三、解密 之所以單片機(jī)能成為控制核心,設(shè)計(jì)出包羅萬象的應(yīng)用系統(tǒng)來,是因?yàn)?a target="_blank">開發(fā)者利用了單片機(jī)提供的種種功能及各種外設(shè)。所以,第三階段我們要掌握單片機(jī)的各種功能,再加上諸如傳感器、模數(shù)轉(zhuǎn)換、掃描顯示、串行、中斷的應(yīng)用思維,結(jié)合更多的元器件、電子電路知識(shí),逐個(gè)學(xué)習(xí)、體會(huì)實(shí)際的單片機(jī)系統(tǒng)的秘密。
四、遠(yuǎn)航 通過以上三個(gè)階段,讀者基本就可掌握單片機(jī)的應(yīng)用了。但要設(shè)計(jì)出豐富的單片機(jī)系統(tǒng),解決復(fù)雜的實(shí)際問題,還需要了解更多的外設(shè)知識(shí)及其與單片機(jī)的聯(lián)系(如電動(dòng)機(jī)、各類
存儲(chǔ)器、繼電器、紅外管等)。這些需要不斷的學(xué)習(xí)和積累。有時(shí)候,接到一些開發(fā)任務(wù),就需要你針對(duì)這個(gè)任務(wù)自覺地去搜集、學(xué)習(xí)相關(guān)知識(shí),在實(shí)踐中不斷學(xué)習(xí)和提高。
51單片機(jī)怎么驅(qū)動(dòng)直流電機(jī)c語言
有3種方案:
第一種,通過PWM脈寬調(diào)制輸出方法控制轉(zhuǎn)速,控制占空比的大小可以實(shí)現(xiàn)調(diào)速!
第二種,通過AD轉(zhuǎn)換的方法控制直流電機(jī)的電壓
第三種,用xtr115程控電流源來控制直流電機(jī)(類似第二種方法)
如果以上的驅(qū)動(dòng)能力不夠的話再加上一個(gè)電壓跟隨器!
一下以L298電機(jī)驅(qū)動(dòng)電路為例。
L298是SGS公司的產(chǎn)品,L298N為15個(gè)管角的單塊集成電路,高電壓,高電流,四通道驅(qū)動(dòng),設(shè)計(jì)用L298N來接收DTL或者TTL邏輯電平,驅(qū)動(dòng)感性負(fù)載(比如繼電器,直流和步進(jìn)馬達(dá))和開關(guān)電源晶體管。內(nèi)部包含4通道邏輯驅(qū)動(dòng)電路,其額定工作電流為 1 A,最大可達(dá) 1.5 A,Vss 電壓最小 4.5 V,最大可達(dá) 36 V;Vs 電壓最大值也是 36 V。L298N可直接對(duì)電機(jī)進(jìn)行控制,無須隔離電路,可以驅(qū)動(dòng)雙電機(jī)。
當(dāng)使能端為高電平時(shí),輸入端IN1為PWM信號(hào),IN2為低電平信號(hào)時(shí),電機(jī)正轉(zhuǎn);輸入端IN1為低電平信號(hào),IN2為PWM信號(hào)時(shí),電機(jī)反轉(zhuǎn);;IN1與IN2相 同時(shí),電機(jī)快速停止。當(dāng)使能端為低電平時(shí),電動(dòng)機(jī)停止轉(zhuǎn)動(dòng)。
在對(duì)直流電動(dòng)機(jī)電壓的控制和驅(qū)動(dòng)中,半導(dǎo)體功率器件(L298)在使用上可以分為兩種方式:線性放大驅(qū)動(dòng)方式和開關(guān)驅(qū)動(dòng)方式在線性放大驅(qū)動(dòng)方式。
半導(dǎo)體功率器件工作在線性區(qū)優(yōu)點(diǎn)是控制原理簡(jiǎn)單,輸出波動(dòng)小,線性好,對(duì)鄰近電路干擾小,缺點(diǎn)為功率器件工作在線性區(qū),功率低和散熱問題嚴(yán)重。開關(guān)驅(qū)動(dòng)方式是使半導(dǎo)體功率器件工作在開關(guān)狀態(tài),通過脈調(diào)制(PWM)來控制電動(dòng)機(jī)的電壓,從而實(shí)現(xiàn)電動(dòng)機(jī)轉(zhuǎn)速的控制。
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit MOTOR_A_1=P3^6;
sbit MOTOR_A_2=P3^7;
sbit k1=P1^0; //定義k1為p1.0口
sbit k2=P1^1; //定義k2為p1.1口
sbit k3=P1^2; //定義k3為p1.2口
sbit k4=P1^3; //定義k4為p1.3口
uchar T=0; //定時(shí)標(biāo)記
uchar W=0; //脈寬值 0~100
uchar A=0; //方向標(biāo)記 0,1
uchar k=0; //按鍵標(biāo)記
uchar i=0; //計(jì)數(shù)變量
uchar code table1[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code table2[]={0xfe,0xfb,0xfd,0xf7};
void delayms(uint t);
void disp(void)
{
P2=table2[3];
P0=table1[W]; //顯示占空比個(gè)位
delayms(1); //延時(shí)1ms
P2=0xff; //P0清1
P2=table2[2];
P0=table1[W/100]; //顯示占空比百位
delayms(1); //延時(shí)1ms
P2=0xff; //P0清1
P2=table2[1];
P0=table1[W/10]; //顯示占空比十位
delayms(1); //延時(shí)1ms
P2=0xff; //P0清1
P2=table2[0];
P0=table1[A]; //顯示方向
delayms(1); //延時(shí)1ms
P2=0xff; //P0清1
}
void init(void)
{
//啟動(dòng)中斷
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
//設(shè)置定時(shí)時(shí)間
TH0=0xff;
TL0=0xf6;
}
void timer0() interrupt 1
{
//重置定時(shí)器時(shí)間
TH0=0xff;
TL0=0xf6;
T++; //定時(shí)標(biāo)記加1
disp(); //數(shù)碼管顯示
if(k==0)
{
if(T》W)
MOTOR_A_1 =0;
else
MOTOR_A_1 =1;
}
else
{
if(T》W)
MOTOR_A_2 =0;
else
MOTOR_A_2 =1;
}
if(T==100)
T=0;
}
void delayms(uint t)
{
uchar j;
while(t--)
{
for(j=0;j《250;j++) //循環(huán)250次
{
_nop_(); //系統(tǒng)延時(shí)
_nop_(); //系統(tǒng)延時(shí)
_nop_(); //系統(tǒng)延時(shí)
_nop_(); //系統(tǒng)延時(shí)
}
}
}
void key(void) //按鍵判斷程序
{
if(k1==0) //按鍵1按下
{
while(k1==0); //按鍵1抬起
if(W==100) //如果脈寬為100
W=0; //脈寬置0
else
W+=1; //否則加1
}
else if(k2==0) //按鍵2按下
{
while(k2==0); //按鍵2抬起
if(W==0) //如果脈寬為0
W=100; //脈寬設(shè)置成100
else
W-=1; //否則減1
}
else if(k3==0) //按鍵3按下
{
while(k3==0); //按鍵3抬起
A=!A; //方向標(biāo)記取反
k=!k; //按鍵標(biāo)記取反
}
else if(k4==0) //按鍵4按下
{
while(k4==0); //按鍵4抬起
W=0; //脈寬清0
}
}
void main(void)
{
init(); /////////系統(tǒng)初始化
while(1)
{
if(k==0)
MOTOR_A_2=0;
else
MOTOR_A_1=0;
key(); ////////查詢按鍵
}
}
? ? ? ? 結(jié)語
關(guān)于51單片機(jī)的相關(guān)介紹就到這了,如有不足之處歡迎指正。
評(píng)論