1. 程式人生 > >微控制器開發的一點基礎知識點

微控制器開發的一點基礎知識點

電平特性:

常用的邏輯電平有TTL,CMOS,LVTTL,ECL,PECL,GTL,RS-232,RS-422,RS-485,LVDS等。

5V TTL和5V CMOS 是通用的邏輯電平。

TTL和CMOS按邏輯電平可分為:5V系列,3.3V系列,2.5V系列,1.8V系列。

TTL電平訊號系統,+5V等價於邏輯1,0V等價於邏輯0。

CMOS 電平Vcc可達12V,輸出高電平為約0.9Vcc,低電平約為0.1Vcc。CMOS電路中不使用的輸入端不能懸空,否則會造成邏輯混亂。

TTL電路和CMOS電路的邏輯電平關係:VOH,VOL,VIH,VIL

同或的運演算法則:A同或B,相同為1,不同為0.

異或的運演算法則:A異或B,相同為0,不同為1.

C51中的資料型別:

資料型別

關鍵字

所佔位數

表示數的範圍

無符號字元型

Unsigned char

8

0~255

有符號字元型

Char

8

-128~127

無符號整型

Unsigned int

16

0~65535

有符號整型

Int

16

-32768~32767

無符號長整型

Unsigned long

32

0~2(32)-1

有符號長整型

Long

32

-2(31)~2(31)-1

單精度實型

Float

32

3.4e-38~3.4e38

雙精度實型

Double

64

1.7e-308~1.7e308

位型別

Bit

1

0~1

一個位元組=8位。

Sfr----特殊功能暫存器的資料宣告,宣告一個8位的暫存器。

Sfr16------16位特殊功能暫存器的資料宣告。

Sbit------特殊功能位宣告,也就是宣告某一個特殊功能暫存器中的某一位。

Bit------位變數宣告,當定義一個位變數時可以使用此符號。

例如:sfr scon = 0x98;scon是微控制器的序列口控制暫存器,這個暫存器在微控制器記憶體中的地址為0x98.

C51常用的標頭檔案:reg51.h,reg52.h,math.h,ctype.h,stdio.h,stdlib.h,absacc.h,intrins.h。

但通常用的卻只有:reg51.h,reg52.h,math.h.

C51中的運算子:

算術運算子

含義

+

加法

-

減法

*

乘法

/

除法

++

自加

--

自減

%

求餘運算

關係(邏輯)運算子

含義

大於

>=

大於等於

小於

<=

小於等於

==

測試相等

!=

測試不等

&&

||

!

位運算子

含義

&

按位與

|

按位或

^

異或

~

取反

>> 

右移

<< 

左移

C51中的基礎語句:

語句

型別

If

選擇語句

While

迴圈語句

For

迴圈語句

Switch/case

多分支選擇語句

Do-while

迴圈語句

微控制器最小系統能夠執行的必要條件:1電源,2晶振,3復位電路

第一個程式:

#include<reg52.h>//52系列微控制器標頭檔案

Sbit led1 = P1^0;//宣告微控制器P1口的第一位

Void main()//主函式

{

Led1 = 0;//點亮第一個放光二極體

}

排阻:就是一排電阻

認識電阻標號:103表示10*103Ω=10kΩ,150表示15*100Ω=15Ω。1002表示100*102歐姆,1001表示100*101歐姆。

一般的三位數表示5%精度,四位數表示1%精度。

發光二級管的導通電壓為1.7V。

微控制器是不能停止工作的,只要他有電,有晶振在起振,他就會不停的工作。不過我們可以將其設定為休眠狀態或者掉電模式,最大限度的降低他的功耗。

時鐘週期:也稱振盪週期,定義為時鐘頻率的倒數。如12MHz的時鐘週期是1/12M.即1/12μs。

狀態週期:它是時鐘週期的兩倍。

機器週期:微控制器的基本操作週期,在一個操作週期中,微控制器完成一個基本操作。它由12個時鐘週期(6個狀態週期)組成。

指令週期:它是指CPU執行一條指令所需要的時間。一般一個指令週期含有1~4個機器週期。

左移操作:

                                             CY   最高位                      最低位

                           移位前   X    0  1  1   0    1   0  1   1

                                 ………………

                           移位後   0   1   1   0   1    0   1  1   0

右移操作:

                                           最高位                      最低位CY

                           移位前   0  1   1   0  1    0   1  1    X

                                                              ……………………

                           移位後   0  0   1   1  0    1   0  1    1

迴圈左移:

                           移位前    0  1   1   0    1  0   1   1

 

                           移位後    1  1   0   1    0   1  1   0

迴圈右移:

                           移位前    0  1   1   0    1   0  1   1

                           移位後    1  0   1   1    0  1   0   1

 

PSW暫存器:(ProgramStatus Word)

全稱為程式狀態字標誌暫存器。是一個8位暫存器,位於微控制器內的特殊功能暫存器區,位元組地址D0H,用來存放運算結果的一些特徵,如有無進位,借位等。

D7  D6   D5   D4  D3   D2   D1  D0

PSW   CY  AC   F0    RS1  RS0 OV    -    P  D0H

CY……進位標誌

AC……輔助進位標誌

F0……由使用者使用的一個狀態標誌位

RS1,RS2……4組工作暫存器區選擇控制位

OV……溢位標誌位

P……奇偶標誌位

使用萬用表檢測數碼管的引腳

52微控制器中斷源

INT0……外部中斷0,有P3.2埠線引入,低電平或下降沿引起。

INT1……外部中斷1,有P3.3埠線引入,低電平或下降沿引起。

T0……定時器/計數器0中斷,由T0計數器計滿回零引起。

T1……定時器/計數器1中斷,由T1計數器計滿回零引起。

T2……定時器/計數器2中斷,由T2計數器計滿回零引起。

TI/RI……序列口中斷,串列埠完成一幀字元傳送/接收後引起。

中斷級別

中斷源

預設中斷級別

序號(C語言使用)

入口地址(彙編使用)

INT0……外部中斷0

最高

0

0003H

T0……定時器/計數器0中斷

第2

1

000BH

INT1……外部中斷1

第3

2

0013H

T1……定時器/計數器1中斷

第4

3

001BH

TI/RI……序列口中斷

第5

4

0023H

T2……定時器/計數器2中斷

最低

5

002BH

中斷允許暫存器IE:

位序號

D7

D6

D5

D4

D3

D2

D1

D0

位符號

EA

--

ET2

ES

ET1

EX1

ET0

EX0

位地址

AFH

--

ADH

ACH

ABH

AAH

A9H

A8H

中斷優先順序暫存器IP:

位序號

D7

D6

D5

D4

D3

D2

D1

D0

位符號

--

--

--

PS

PT1

PX1

PT0

PX0

位地址

--

--

--

BCH

BBH

BAH

B9H

B8H

51微控制器內部共有兩個16位可程式設計的定時器/計數器。他們既有定時功能,又有計數功能。即定時器T0和定時器T1。52微控制器內部多一個T2定時器/計數器。通過設定特殊功能暫存器可以選擇啟動定時功能或計數功能。

TH0:定時器/計數器T0的高八位初值。

TH1:定時器/計數器T1的高八位初值。

TL0:定時器/計數器T0的低八位初值。

TL1:定時器/計數器T1的低八位初值。

加1計數器輸入的計數脈衝有兩個來源,一個是由系統的時鐘振盪器輸出脈衝經12分頻後送來;另一個是T0或T1引腳輸入的外部脈衝源,每來一個脈衝,計數器加1.

定時器/計數器工作方式暫存器TMOD:

該暫存器在特殊功能暫存器中,位元組地址為89H,不能位定址。微控制器復位時TMOD全部被清零。

位序號

D7

D6

D5

D4

D3

D2

D1

D0

位符號

GATE

C/

M1

M0

GATE

C/

M1

M0

|             定時器1              |          定時器0               |

由圖可知,高四位用來設定定時器1,低四位用來設定定時器0,對應四位的含義如下:

GATE……門控制位。

C/……定時器模式和計數器模式選擇位。

C/ = 1:為計數器模式;C/ = 0:為定時器模式。

M1M0……工作方式選擇位。

M1

M0

工作方式

0

0

方式0,為13位定時器/計數器

0

1

方式1,為16位定時器/計數器

1

0

方式2,8位初值自動重灌的8位定時器/計數器

1

1

方式3,僅適用於T0,分成兩個計數器,T1停止計數

定時器/計數器控制暫存器TCON:

該暫存器在特殊功能暫存器中,位元組地址為88H,位地址分別是88H~8FH,該暫存器可進行位定址。TCON暫存器用來控制定時器的啟、停,標誌定時器溢位和中斷情況。微控制器復位時TCON全部被清0。TF1、TR1、TF0、TR0位用於定時器/計數器;IE1、IT1、IE0、IT0位用於外部中斷。

位序號

D7

D6

D5

D4

D3

D2

D1

D0

位符號

TF1

TR1

TF0

TR0

IE1

IT1

IE0

IT0

位地址

8FH

8EH

8DH

8CH

8BH

8AH

89H

88H

當用定時器的方式1時,即16位定時器,設機器週期為Tcy,定時器產生一次中斷的時間為t,那麼需要技術的個數N = t/Tcy,裝入THX和TLX中的數分別為:

THX = (65536 - N)/256,TLX = (65536 - N)%256。

Tcy =12 * (1/頻率)

中斷服務程式的寫法:

Void 函式名()interrupt中斷號 using 工作組

{

                           中斷服務程式內容

}

中斷函式不能返回任何值,不帶任何引數,中斷號指微控制器中幾個中斷源序號。C51編譯器在編譯程式時會自動分配工作組,故通常省略不寫。

例如:

Void T1_time() interrupt3

{

TH1 = (65536 - 10000)/256;

TL1 = (65536 - 10000)%256;

}

定時器的初始化過程如下:

1、對TMOD賦值,確定T0和T1的工作方式。

2、計算初值,並將初值寫入TH0,TL0或TH1,TL1。

3、中斷方式時,則對IE賦值,開放中斷。

4、使TR0或TR1置位,啟動定時器/計數器定時或計數。

一旦開啟定時器,定時器便開始計數,當計數溢位時,自動進入中斷服務程式執行程式碼,執行完中斷程式後再回到原來出繼續執行,也就是繼續等待。(Page74)

能在主程式中完成的功能就不再中斷函式中寫,若非要在中斷函式中實現功能,那麼一定要高效、簡潔。

7段數碼管的編碼陣列:

在用C語言程式設計時,編碼定義方式如下:   

Unsigned char code table[] = {

0x3f, 0x06, 0x5b, 0x4f,                     

0x66, 0x6d, 0x7d,0x07,                          

0x7f, 0x6f, 0x77,0x7c

0x39, 0x5e, 0x79,0x71};                        

直接定義數字                                          

Unsigned charnum[] = {                              

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,                                    

0x80,0x90,0x7f}                                     

對應的二進位制表示式為:

1100 0000,  1111 1001, 1010 0100,  1011 0000,

1001 1001,  1001 0010, 1000 0010,  1111 1000,

1000 1000,  1001 0000, 0111 1111                           

分別對應於:

0,1,2,3,

4,5,6,7,

8,9,.

即多了一個code關鍵字,code表示編碼的意思。微控制器C語言中定義陣列時是佔用記憶體空間的,而定義編碼時是直接分配到程式空間中,編譯後編碼佔用的是程式儲存空間,而非記憶體空間。

Unsigned char codetable [] = {

0x3f, 0x06, 0x5b, 0x4f,

0x66, 0x6d, 0x7d, 0x07,

 0x7f,0x6f, 0x77, 0x7c,

0x39, 0x5e, 0x79, 0x71};

在編寫中斷程式中,常用到的幾個暫存器為:

TMOD:設定定時器工作方式,

TH0,TL0,TH1,TL1:設定定時器的初始值,

EA:開總中斷,

ET0,ET1:開定時器中斷,

TR0,TR1:啟動定時器;

sbit led0 =P1^0;//要控制的LED燈

sbit led1 =P1^1;//要控制的LED燈

sbit P20 = P2^0;//關閉數碼管

sbit P21 = P2^1;//關閉數碼管

主函式中:

P1 = 0xff;

P20 = 0;

P21 = 0;

STC12C5A60S2微控制器中,P1暫存器表示對應的LED燈,P0暫存器表示對應的數碼管。

使能控制訊號:當電平為1時,表示無效,禁用。

sbit P20=P2^0;//表示點狀數碼管的控制端

sbit P21=P2^1;//表示7段數碼管的控制端

P20 = 0;//表示啟用點狀數碼管

P21 = 1;//表示禁用7段數碼管

輸入輸出埠P0,P1,P2,P3

P1:對埠寫1時,通過內部的上拉電阻吧埠拉到高電位,這是可用作輸入口。P1做輸入口使用時,因為有內部的上拉電阻,那些被外部訊號拉低的引腳會輸出一個電流(IIL)。在對Flash ROM程式設計和程式校驗時,P1接收低8位地址。

P2:對埠寫1時,通過內部上拉電阻把埠拉到高電位,這時可作為輸入口。P2作輸入口使用時,因為有內部的上拉電阻,那些被外部訊號拉低的引腳會輸出一個電流(IIL)。在訪問外部資料儲存器(如執行MOVX @DPTR指令時)P2送出高八位地址。在訪問8位地址的外部資料儲存器(如執行MOVX @R1指令時)P2口引腳上的內容(就是專用暫存器(SFR)區中P2暫存器的內容),在整個訪問期間不會改變。在對Flash ROM程式設計和程式校驗期間,P2也接收高位地址和一些控制訊號。

P0:當P0作為輸入口使用時,應先向口鎖存器地址(80H)寫入全1,此時P0口的全部引腳浮空,可作為高阻抗輸入。做輸入口使用時要先寫1,這就是準雙向的含義。在CPU訪問片外儲存器(89C51片外EPROM或RAM)時,P0口分時提供低八位地址和八位資料的複用匯流排。在此期間,P0口內部上拉電阻有效。

P3:對埠寫1時,通過內部的上拉電阻把埠拉到高電位,這是可作為輸入口。P3作輸入口使用時,因為有內部的上拉電阻,哪些被外部訊號拉低的引腳會輸出一個電流(IIL)。P3 埠還用於一些複用功能。例如:

埠引腳

複用功能

P3.0

RXD(序列輸入口)

P3.1

TXD(序列輸出口)

P3.2

(外部中斷0)

P3.3

(外部中斷1)

P3.4

T0(定時器0的外部輸入)

P3.5

T1(定時器1的外部輸入)

P3.6

(外部資料儲存器寫選通)

P3.7

(外部資料儲存器讀選通)

有一個問題,為什麼延時在主函式中,時間較長,在子函式中,就變的很短。

例如主函式中有一下語句:for( i =0;i<60000;i++);,當把其抽取為函式後即:

void delayms(uintxms)

{

    uint i;

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

},時間明顯的變短。

AT89C52微控制器電路圖:

流水燈的實現,完全可以依靠移位操作實現。

實際波形在按下與釋放的時候有抖動現象。但我們通常用軟體延時的方法來解決這個問題。

一般在檢測按下時加入去抖動延時,檢測鬆手時就不用了。

ISIS模擬軟體中,常用的部件名稱:電阻 res;按鍵(開關) button;普通電容 cap;極性電容 cap-elec;排阻 respack-7(8);數碼管 7seg;發光二極體 led-(顏色,如red 、green等);晶振 crystal;揚聲器 sounder;電感 inductor;

微控制器的S2,S3,S4,S5為獨立鍵盤,分別於微控制器的P3.4~P3.7相連。

中斷初始化與中斷處理函式:

TMOD = 0x01;//設定定時器0的工作方式為1

    TH0 = (65536-45872)/256;設定初值

    TL0 = (65536-45872)%256;

    TR0=1;             //啟動定時器

    ET0=1;   //開啟定時器0中斷

EA=1;     //開啟總中斷

Void timer0() interrupt 1

{

TH0 = (65536-45872)/256;重設初值

        TL0= (65536-45872)%256;

        Num++;

    If(num == 20)//約1S的時間到了

{

    Num= 0;

              Flag = 1;//設定標誌位,用以處理操作。

}

}

Sfr:特殊功能暫存器宣告

Sfr16:sfr的16位資料宣告

Sbit:特殊功能位宣告

Bit:位變數宣告

Reg51.h,reg51.h,math.h

二極體的接通電流為3mA~10mA,壓降是1.7V。

位操作

Sbit led1 = P1^0;

Led1 = 0;

匯流排操作:

P1 = 0xfd;

微控制器的程式設計的時候,時刻注意時序的概念,有時序的思想。狀態的保持,震動的檢測等。

關閉數碼管的方法:

Sbit P20 = P2^0;

Sbit P21 = P2^1;

P1 = 0xff;

P20 = 0;P21 = 0;//當為1的時候為開啟狀態。

P1 控制著二極體。

P07接了蜂鳴器(參照PCB原理圖)

Sbit beep = P0^7;

Beep = 1;

//P26是段選鎖存端,P27是位選鎖存端。

Sbit dula = P2^0;

Sbit wela = P2^1;

使用數碼管的時候,可以將點陣數碼管摘下。

位選時:

P1 = 0x00;//消除位選混亂殘影

Wela = 1;

P1 = 0x01;//位選訊號,講那個置1.高電平表示啟用。

Wela = 0;

P1 = 0xff;//消除段選混亂殘影

Dula = 1;

P1 = 0xf9;//段選訊號,低電平表示亮。

Dula = 0;

定時器假設頻率為12MHz,12個時鐘週期為一個機器週期,一個機器週期大概為1微秒。計滿TH0和TL0,需要計數為216-1個,大概為65535μs,即65.5ms,如要定時50ms,則需要在TH0和TL0中分別裝入初值,然後再計數50000個,即為50ms。

那麼:TH0 = (65536 –50000)/256;

      TL0 = (65536 – 50000)%256;