微控制器開發的一點基礎知識點
電平特性:
常用的邏輯電平有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;