單片機一些基礎問(wèn)題
8051 系列的一些單片機如8052 有附加的128 字節的內部RAM 位于從80H 開(kāi)始的地址空間中被稱(chēng)為IDATA 因為IDATA 區的地址和SFRs (特殊功能寄存器)的地址是重疊的通過(guò)區分所訪(fǎng)問(wèn)的存儲區來(lái)解決地址重疊問(wèn)題因為IDATA 區只能通過(guò)間接尋址來(lái)訪(fǎng)問(wèn)。8051 的最后一個(gè)存儲空間為64K 和CODE 區一樣采用16 位地址尋址稱(chēng)作外部數據區簡(jiǎn)稱(chēng)XDATA 區這個(gè)區通常包括一些RAM 如SRAM 或一些需要通過(guò)總線(xiàn)接口的外圍器件。
8051 可對存儲區直接或間接尋址這些是典型的尋址方式直接尋址是在指令中直接
包含所須尋址的字節地址直接尋址只能在DATA 區和SFR 中進(jìn)行。
SBUF 串行緩沖區 DPTR 數據指針 MOVX 讀入或寫(xiě)入外部寄存器的數據
fosc (frequency oscillate)晶振頻率
指針寄存器而不是直接使用地址
中斷系統
基本的8051 支持6 個(gè)中斷源兩個(gè)外部中斷兩個(gè)定時(shí)/計數器中斷一個(gè)串行口輸
入/輸出中斷中斷發(fā)生后處理器轉到將五個(gè)中斷入口處之一執行中斷處理程序中斷向
量位于代碼段的最低地址出串行口輸入輸出中斷共用一個(gè)中斷向量
reg51.h 詳細說(shuō)明
是c51(用于單片機開(kāi)發(fā)的一種c語(yǔ)言)的頭文件。類(lèi)似于頭文件AT89X52.h。這兩個(gè)頭文件基本是一樣的,只是在使用時(shí)對位的定義不一樣,at89x52.h文件中對P1.1的操作是寫(xiě)成P1_1;reg52.h文件中的操作則寫(xiě)成P1^1。表示方法不一樣而已。另外前者是特指ATMEL公司的52系列單片機,后者指所有52系列的單片機。
LED3.C(8): error C141: syntax error near '='
在c51單片機里面不可以用#define LED1 P0^1
正確的使用sbit LED1=P0^1;
還有keil編譯器不支持像P0^1=0;或P0^1=1;這樣的賦值
本征庫函數(intrinsic routines)和非本征證庫函數
C51提供的本征函數是指編譯時(shí)直接將固定的代碼插入當前行,而不是用ACALL和LCALL語(yǔ)句來(lái)實(shí)現,這樣就大大提供了函數訪(fǎng)問(wèn)的效率,而非本征函數則必須由ACALL及LCALL調用。
C51的本征庫函數只有9個(gè),數目雖少,但都非常有用,列如下:
_crol_(_cror_):將char型變量循環(huán)向左(右)移動(dòng)指定位數后返回
_iror_(_irol_):將int型變量循環(huán)向左(右)移動(dòng)指定位數后返回
_lrol_(_lror_):將long型變量循環(huán)向左(右)移動(dòng)指定位數后返回
_nop_: 相當于插入NOP “空指令”,在x86的CPU中機器碼為0x90(144)。
_testbit_: 相當于JBC bitvar測試該位變量并跳轉同時(shí)清除。
_chkfloat_: 測試并返回源點(diǎn)數狀態(tài)。
使用時(shí),必須包含#inclucle
如不說(shuō)明,下面談到的庫函數均指非本征庫函數。
TMOD:定時(shí)器/計數器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)
定時(shí)器/計數器模式控制寄存器TMOD是一個(gè)逐位定義的8位寄存器,但只能使用字節尋址,其字節地址為89H。
其格式為:
工作原理
其中低四位(即D0 ~ D3)定義定時(shí)器/計數器T0,高四位(即D4 ~ D7)定義定時(shí)器/計數器T1。各位的說(shuō)明:
Ⅰ,GATE——門(mén)控制。
●GATE=1時(shí),由外部中斷引腳INT0、INT1來(lái)啟動(dòng)定時(shí)器T0、T1。
當INT0引腳為高電平時(shí)TR0置位,啟動(dòng)定時(shí)器T0;
當INT1引腳為高電平時(shí)TR1置位,啟動(dòng)定時(shí)器T1。
●GATE=0時(shí),僅由TR0,TR1置位分別啟動(dòng)定時(shí)器T0、T1。
Ⅱ,C/T——功能選擇位
C/T=0時(shí)為定時(shí)功能,C/T=1時(shí)為計數功能。
置位時(shí)選擇計數功能,清零時(shí)選擇定時(shí)功能。
Ⅲ,M0、M1——方式選擇功能
由于有2位,因此有4種工作方式:
M1M0工作方式功能說(shuō)明
00方式013位定時(shí)器/計數器
01方式116位定時(shí)器/計數器
10方式2自動(dòng)重裝8位定時(shí)器/計數器
11方式3T0分為2個(gè)8位獨立計數器,T1停止計數
TR0,TR1:分別為T(mén)0,T1的運行控制位。1啟動(dòng),0停止。
GATE:門(mén)控制位。GATE=0,由TR0或TR1啟動(dòng)定時(shí)器;GATE=1,只有TR0或TR1為1且INT0 或INT1 為高電平時(shí)才能啟動(dòng)定時(shí)器。
單片機中的TH0 TL0
TH0和TL0是控制定時(shí)/計數器T0的,TH1和TL1是針對T1的。也就是用TH0和TL0中的數來(lái)控制T0到底定時(shí)多久或計數多少再進(jìn)入中斷,TH1和TL1也一樣。
16位定時(shí)器/計數器的高低位,TL0是低八位,TH0=是高八位,當低八位計數記滿(mǎn)了之后,向高八位進(jìn)一位,計數器,由于51單片機是8位機,所以要分成兩個(gè)八位的寄存器來(lái)存儲16位的計數器!
單片機 TH0=0xd8;TL0=0xf0是什么意思
這是為 T0 計數器賦初值,(高位)TH0=0xd8(0xffd8,初始地址為0xffff),(低位)TL0=0xf0(0xfff0)
換成 10 進(jìn)制是:55536
那么 65536-55536=10000
表明 T0 計數器 計數 10000 個(gè)機器周期后溢出。
如果使用 12M 晶振,那么計數 10000 個(gè)機器周期使用 10ms,可以作為定時(shí)用。
由于TH0和TL0已知,那么可得T0寄存器中為:0xFF00(16)=65280(10)
X=65536-T0=65536-65280=256,,X即為定時(shí)機器周期數
如果是12MHz的話(huà),機器周期=1us,那么定時(shí)為256us
如果是6MHz的話(huà),機器周期=2us,那么定時(shí)時(shí)間為512us
機器周期=12*晶振周期,晶振周期=1/晶振頻率
指令周期是看一條指令包含有多少個(gè)機器周期,如_nop_就一個(gè)機器周期
延時(shí)函數delay()
c語(yǔ)言里不是那么算的,編譯的時(shí)候轉匯編了用匯編才算的出,不用糾結這個(gè)的精確延時(shí)的話(huà)也都用定時(shí)器,大致的延時(shí)的話(huà)用軟件去算就行了
void delay_ms(unsigned int x)
{
unsigned int i,j;
for(i=0;i
for(j=0;j125;j++);
}
AJMP
是無(wú)條件跳轉指令之一,叫做絕對跳轉。 主要是用來(lái)改變程序執行的路線(xiàn),到需要的指令或程序去執行。 AJMP的范圍為正負2K單元。使用時(shí)注意跳的目的地和當前地址的距離范圍不能超過(guò)上述值,否則,就會(huì )跳過(guò)不去。
$
$代表它自己所在位置的地址
中斷允許寄存器IE
評論