2010年3月27日 星期六

8051 review

下面為先前複習8051的一些筆記,主要內容來自以前所買的一本書(例說89S51-C語言)

Memory Structure
● ROM
內建 4K, 外接最大 64K(含內建4K)
有一個角位要指定是否要使用外部記憶體(接高準位或接地)
CPU Reset後,程式將從程式記憶體0000H位置開始執行,如沒遇到跳躍指令,則沿著程式記憶體順序執行
● RAM
資料記憶體與程式記憶體是分開的獨立區塊,因此,兩者的位址並不衝突
內建128bytes, 外接最大 64K
0000H~007FH的128bytes:可直接定址或間接定址
● 暫存器庫
0000H~001FH的32個位址為暫存器庫(Register Bank)
0000H~0007H為 RB0
0008H~000FH為 RB1
0010H~0017H為 RB2
0018H~001FH為 RB3
----------------------------------------------------------------------------------------------------------
每個暫存器庫都包含 R0,R1, ..., R7等8個暫存器,而同一時間只能使用其中一組暫存器庫
----------------------------------------------------------------------------------------------------------
暫存器庫的切換,可以PSW(Program Status Word)的RS1, RS0來決定
----------------------------------------------------------------------------------------------------------
CPU Reset, 系統的堆疊指標SP指向07H位址,所以資料存入堆疊時,將從08H開始。
為了避免衝突或不必要的錯誤,通常會把堆疊指標移到30H以後的位址
----------------------------------------------------------------------------------------------------------
● 可位元定址
0020H~002FH的16個位元組為可位元定址區, 通常存取時是byte為單位
----------------------------------------------------------------------------------------------------------
可位元定址則是指定存取一個位元(bit)
----------------------------------------------------------------------------------------------------------
● 一般資料與堆疊區
0030H~007FH的80個位元組位址為一般資料存取及堆疊區
----------------------------------------------------------------------------------------------------------
由於 CPU Reset 後,堆疊指標指向07H,為了確保資料安全性與程式執行正確,
最好能將堆疊指標移至本區
----------------------------------------------------------------------------------------------------------
● 0080H~00FFH的128bytes為SFR(Special Fucntion Register),可直接定址
這些位置的宣告放在 Keil C 提供的 reg51.h header file (不用特別去記)
----------------------------------------------------------------------------------------------------------
SP(Stack Pointer register), First In Last Out
PCON(Power Control register): 設定CPU電源模式
TCON(Timer/Counter Control register)
TMOD(Timer/Counter Mode Control register)
TL0,TH0為第一組計時/計數器(Timer 0)的計量暫存器
SCON(Serial Port Control register)
IE(Interrupt Enable register)
IP(Interrupt Priority register)

Timing analysis and reset

Clock 是整個系統運作的依據

ex. 8051 定義 clock 為 0 ~ 24 MHz, 表示只要不超過 24 MHz 都是 ok

至於要不要使用最高的頻率,需視程式複雜性而定

機械週期:含幾個 clock pluse (ex. 1 machine cycle contains 12 clock pluse)

12MHz -> 一個clock pluse 週期為 1/12 微秒, 因此1個 machine cycle 含12個 clock pluse = 12 x 1/12 = 1微秒

在8051的所有指令中,只有乘法與除法需要4個machine cycle, 其餘指令都能在1~2個machine cycle 完成

8051 reset: 將高準位加到 reset 接腳超過2微秒

Develop process and tools

「硬體設計」與「軟體設計」並行

硬體設計 target board

軟體設計,然後應用實體模擬器(In-Circuit Emulator, ICE),載入可執行碼,然後在target board進行實體模擬

如果軟、硬體設計無誤,可以實際燒錄

tools: Keil C 的整合開發環境

introduce Keil C

常數:在指定記憶體位置,放置固定不變的資料
變數:在指定記憶體位置裡的資料是可變的

Data Type
char, 8 bit, -128~+127
unsigned char, 8 bit, 0~255
enum, 8/16 bit, -128~127/-32768~32767
short, 16, -32768~32767
unsigned short, 16, 0 ~ 65535
int, 16, -32768~32767
unsigned int, 16, 0~65535
long, 32,
unsigned long, 32,
double, 32
void, 0

8051 Data type
bit, sbit, sfr, sfr16, idata(間接定址)

bit, 1 bit, 0/1 --> 0x20~0x2f之間的位址
sbit, 1 bit, 0/1 --> 0x20~0x2f之間的可位視定址記憶體,或 0x80~0xff的SFR
ex.
char bdata scan;
sbit input_0 = scan^0; (表示第0位元)

ex.
sfr P0=0x80;
sbit P0_0 = P0^0;

sfr, 8 bit, 0~255
sfr16, 16 bit, 0~65535

記憶體形式
code -> 程式記憶體 -> 0x0000~0xffff(64k)
data -> 直接定址的內部資料記憶體 -> 0x00~0x7f (128)
idata -> 間接定址的內部資料記憶體 -> 0x80~0xff (128)
bdata -> 位元定址的內部資料記憶體 -> 0x20~0x2f(16)

void 中斷副程式名稱(void) interrupt 中斷編號 using 暫存器庫
8051 只有使用 0 ~ 4 的中斷編號
0: INT0
1: Timer 0

認識中斷
好端端的幹嘛中斷?其實是為了提升效率!
8051提供5個中斷:外部中斷INT0, INT1, Timer0, Timer1,以及串列埠中斷UART(RI/TI)

外部中斷:TCON, IT0/IT1, IE, IP
計時計數器中斷:若是計時器中斷,CPU將計數內部的時鐘脈波,而提出內部中斷
若是計數器,CPU將計數外部的脈波,而提出內部中斷

0 意見: