原本想學AVR的,o(︶︿︶)o 唉,交了一年的學費,現在窮的只剩下褲襠了。還好,還有幾天我的腰包又會漲了。嘎嘎。。這段時間就復習復習51單片機吧,之前寫的筆記都不知道放哪了。現在重新看視頻再寫一次增強記憶。
單片機的介紹以及學習必備的一些基礎知識等。
第二集
一、單片機型號解析。
1、例子 AT89S5224PU
AT—生產商標志,表示該器件是ATMEL公司的產品。
89—ATMEL公司的產品89系列家族(內涵Flash存儲器)。
S—表示可在線編程。 還有C表示是CMOS產品、LS表示低電壓2.7V-4V、LV表示低電壓2.7V-6V、LP表示低功耗單時鐘周期指令。
52—表示存儲器的容量是8K,還有53是12K、54是16K、55是20K,51是4K、2051是2K等。
24—表示芯片的最高時鐘頻率為24MHZ。還有33MHZ、20MHZ、16MHZ等。
P—表示DIP封裝。還有 S表示SOIC封裝、 Q表示PQFP封裝、A表示TQFP封裝、J表示PLCC封裝、W表示裸芯片等。
U—表示芯片的產品等級為無鉛工業產品,溫度范圍為-40至+85℃。還有C表示商業產品,溫度范圍為0至+70℃;I表示工業產品,溫度范圍為-40至+85℃;A表示汽車用產品,溫度范圍為-40至+125℃;M表示軍用產品,溫度范圍為-55至+150℃。
二、51單片機內部結構
8位CPU、4K的ROM、128字節RAM、4個8位并行I/O口、一個全雙工串行口,2個16位定時器/計數器,5個中斷源
單片機為TTL電平:高電平+5V 低電平0V 如果要和計算機通訊,因為計算機高電平-12V 低電平+12V 所以計算機與單片機之間通訊需要加電平轉換芯片MAX232。
三、二進制的運算
【與】:兩者都為1(真)才為1真 例: 1&1=1 0&0=0 0&1=0 1&0=0
【或】:兩者只要其中一個為1(真)則為真 例:1|0=1 0|1=1 1|1=1 0|0=0
【非】: 1則0 0則1 例: !1=0 !0=1
第三集
一、C51數據類型
1、sfr:特殊功能寄存器聲明
C51已經為我們定義好的。如reg52.h文件里面的sfr TCON = 0x88; 我們可以直接操作TCON就等于操作0x88這個地址的內容。
2、sfr16:sfr的16位數據聲明
同上。
3、sbit:特殊功能位聲明
C51已經為我們定義好的。如reg52.h文件里面的sbit TR1 = TCON^6; 我們可以直接將 TR1=1 就等于把TCON的第6位置1
4、bit:位變量聲明
二、C51頭文件
通常有:reg51.h reg52.h math.h ctype.h stdio.h stdlib.h absacc.h
常用有:reg51.h reg52.h 里面定義了特殊功能寄存器和位寄存器
math.h 定義常用數學運算
三、宏定義
例:
#define uchar unsigned char
#define uint unsigned int
#define ulint unsigned long int
凡是程序源碼中出現 uchar時,在我們編譯的時候編譯器會把uchar替換成unsigned char,uint 替換成 unsigned int,uling替換成 unsigned long int 方便我們使用。和C的含義一樣。
四、C51運算符
與C語言基本相同
+ - * / (加 減 乘 除)
> >= < <= (大于 大于等于 小于 小于等于)
== != (測試等于 測試不等于)
&& || !(邏輯與 邏輯或 邏輯非) 例:if(Led==0)printf(“Led等于0”);
>> << (位右移 位左移)
& | (按位與 按位或)
^ ~ (按位異或 按位取反)
五、C-51的基本語法
與C一樣
第四集
一、74HC573 鎖存芯片(主要用來擴展單片機的IO口)
74HC573引腳說明:
OE:低電平有效,要使用這個芯片OE必須為低電平 芯片才會工作。
D0 — D7:為輸入 一般接在單片機的IO口
Q0 — Q7:為輸出 外圍芯片、電機、led等
LE:鎖存控制,當LE為高電平時 D引腳輸入的電平狀態會直接影響Q輸出引腳的電平狀態,相當于單片機的IO口可以直接操控Q輸出引腳,即單片機IO==Q==D。當LE為低電平時,無論D引腳的電平狀態怎么變動,Q的電平狀態仍維持不變。相當于Q輸出引腳與單片機的IO口隔離。
真值表
這表格分成兩個部分:INPUTS(輸入)、OUTPUT(輸出)。
L:表示低電平 在INPUTS表示輸入低電平 在OUTPUT表示輸出低電平。
H:表示高電平 在INPUTS表示輸入高電平 在OUTPUT表示輸出高電平。
X:表示無所謂是高電平還是低電平。
Q0:表示維持原來的狀態不變。
Z:高阻態 (接的是高電平則是高電平,接的是低電平則是低電平) 當輸出高阻態時,說明芯片沒有工作。
INPUTS(輸入):
OE:OE上面有一條橫杠代表低電平有效。
LE:鎖存控制。
D:輸入端 即 D0 — D7
OUTPUT(輸出):
Q:輸出端 即 Q0 — Q7
真值表解釋:
第三行:OE=L LE=H D=H Q=H
表示OE為低電平時,LE為高電平即不鎖存,那么D是高電平則Q也是高電平。
第四行:OE=L LE=H D=L Q=L
表示OE為低電平時,LE為高電平即不鎖存,那么D是低電平則Q也是低電平。
第五行:OE=L LE=L D=X Q=Q0
表示OE為低電平時,LE為低電平即鎖存,那么無論D是什么狀態,Q仍保持上一次的狀態。
第六行:OE=H LE=X D=X Q=Z
表示OE為高電平即停用芯片,LE無論是什么狀態,D無論是什么狀態,Q保持高阻態即不起作用。
二、電路圖

單片機的一組P0口要控制8個Led燈,首先需要將LE引腳置1,讓74HC573 的Q輸出端與D輸入端關聯起來。這樣P0口的電平狀態會傳遞給D輸入端進而改變Q的電平狀態。
8個Led的正極接在1k的排阻。相當于每個Led串入一個1k的電阻。這里的電阻起限流作用,硅發光二極管的發光壓降是0.7V;其發光的電流一般為3—10mA,而單片機(控制芯片)的I/O口有一個灌入電流一般為20mA左右(超過這個電流時,單片機內部PN節會被擊穿)。所以加一個1k電阻限流,避免流過Led的電流過大而燒毀Led。
(單片機(控制芯片)的I/O口有一個灌入電流一般為20mA左右;超過這個電流時,單片機內部PN節會被擊穿。一般的繼電器驅動電流在40、50—120mA;一般常用9012的PNP(9013、NPN)三極管作為開關三極管,該三極管的驅動電流可以達到200mA左右,可以用來驅動繼電器。達林頓反向驅動器:ULN2001A—ULN2002A(ST)驅動電流500mA;(給低電平輸出高電平,給高電平輸出低電平))
電阻的取值:
當Led點亮后,Led會有一個電壓。一般情況下紅色直插LED應該是1.7V,剩下3.3V的電壓會加在電阻上。Led需要的電流是3.3ma(0.0033A) 電壓除于電流 3.3V/0.0033A = 1000 歐 = 1K 。(不同的廠家生產的LED的電壓和電流可能略有差別)
我們要讓Led亮,那么首先要明確的是,單片機是TTL電平,高電平為+5V 低電平為0V ,單片機供電也是5V,所以電源正極VCC應該為+5V 負極為0V。Led的正極通過電阻接在VCC,Led的負極接在74HC573的Q輸出端。當單片機的IO口給低電平時即0V,并且74HC573 LE為高電平,那么電流會從VCC→1K電阻→Led→74HC573 Q→74HC573 D→單片機的IO口,此時Led燈亮。
按照上面的電路圖,程序代碼應為:
#include <reg52.h>
sbit Led = P0^0;
sbit LE = P1^6; // 由于51單片機上電,IO口默認為高電平所以這句可省略。
void main()
{
LE = 1; // 由于51單片機上電,IO口默認為高電平所以這句可省略。
Led = 0; // 直接操作P0的0端口 讓第一個Led燈亮
//P0 = 0xFE; // 操作P0一組IO口,0xFE== 11111110 ,P0的0端口置0 其余置1 效果和 Led=0 一樣。不同的是前者操作了一組端口后者只操作了一個端口
P0 = 0x00; // P1端口全部置0 即讓所有的LED燈亮。
while(1); // 程序運行到這里的時候 一直無限循環。因為 Keil 編譯后期產生的匯編代碼中,結尾有一條 LJMP main,就是不同的執行main函數。加上這一條就可以阻止它重復執行上面的代碼。
}