51單片機特殊功能寄存器總結

顯示相關

共陰極數碼管表

P0引腳值 顯示值
0x3f 0
0x06 1
0x5b 2
0x4f 3
0x66 4
0x6d 5
0x7d 6
0x07 7
0x7f 8
0x6f 9
0x77 A
0x7c B
0x39 C
0x5e D
0x79 E
0x71 F
0x00 無顯示

數碼管表的C語言代碼:

unsigned char code table[] = {
	0x3f, 0x06, 0x5b, 0x4f,
	0x66, 0x6d, 0x7d, 0x07,
	0x7f, 0x6f, 0x77, 0x7c,
	0x39, 0x5e, 0x79, 0x71,
};

數碼管顯示兩位數字的C語言代碼:

sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;

uchar code table[] = {
	0x3f, 0x06, 0x5b, 0x4f,
	0x66, 0x6d, 0x7d, 0x07,
	0x7f, 0x6f, 0x77, 0x7c,
	0x39, 0x5e, 0x79, 0x71,
};

void delayms(uint z) {
	uint x, y;
	for (x = z; x > 0; x--) {
		for (y = 110; y > 0; y--) {};
	}
}

void display(uchar shi, uchar ge) {
	dula = 0;
	P0 = table[shi];
	dula = 1;
	dula = 0;
	wela = 0;
	P0 = 0x7e;
	wela = 1;
	wela = 0;
	delayms(5);

	dula = 0;
	P0 = table[ge];
	dula = 1;
	dula = 0;
	wela = 0;
	P0 = 0x7d;
	wela = 1;
	wela = 0;
	delayms(5);
}

中斷相關

IE寄存器:中斷允許寄存器

IE寄存器: 中斷允許寄存器.字節地址爲A8H,可以位尋址.

位序號 D7 D6 D5 D4 D3 D2 D1 D0
位符號 EA ET2 ES ET1 EX1 ET0 EX0
位地址 AFH ADH ACH ABH AAH A9H A8H
  • EA: 全局中斷允許位
    • EA=1時,打開全局中斷控制.在此條件下,由各個中斷控制位確定相應中斷的打開或關閉.
    • EA=0時,關閉全部中斷.
  • ET2: 定時器/計數器2中斷允許位
  • ET2=1時,打開T2中斷.
    • ET2=0時,關閉T2中斷.
  • ES: 串行口中斷允許位
    • ES=1時,打開串行口中斷.
    • ES=0時,關閉串行口中斷.
  • ET1: 定時器/計數器1中斷允許位
    • ET1=1時,打開T1中斷.
    • ET1=0時,關閉T1中斷.
  • EX1: 外部中斷1中斷允許位
    • EX1=1時,打開外部中斷1中斷.
    • EX1=0時,關閉外部中斷1中斷.
  • ET0: 定時器/計數器0中斷允許位
    • ET0=1時,打開T0中斷.
    • ET0=0時,關閉T0中斷.
  • EX0: 外部中斷0中斷允許位
    • EX0=1時,打開外部中斷0中斷.
    • EX0=0時,關閉外部中斷0中斷.

IP寄存器:中斷執行優先級寄存器

IP寄存器: 中斷執行優先級寄存器.字節地址爲B8H,可以位尋址.

位序號 D7 D6 D5 D4 D3 D2 D1 D0
位符號 PS PT1 PX1 PT0 PX0
位地址 BCH BBH BAH B9H B8H
  • PS: 串行口中斷優先級控制位
    • PS=1,串行口中斷定義爲高優先級中斷.
    • PS=0,串行口中斷定義爲低優先級中斷.
  • PT1: 定時器/計數器1中斷優先級控制位
    • PT1=1時,定時器/計數器1中斷定義爲高優先級中斷.
    • PT1=0時,定時器/計數器1中斷定義爲低優先級中斷.
  • PX1: 外部中斷1中斷優先級控制位
    • PX1=1時,外部中斷1定義爲高優先級中斷.
    • PX1=0時,外部中斷1定義爲低優先級中斷.
  • PT0: 定時器/計數器0中斷優先級控制位.
    • PT0=1時,定時器/計數器0中斷定義爲高優先級中斷.
    • PT0=0時,定時器/計數器0中斷定義爲低優先級中斷.
  • PX0: 外部中斷0中斷優先級控制位.
    • PX0=1時,外部中斷0定義爲高優先級中斷.
    • PX0=0時,外部中斷0定義爲低優先級中斷.

51單片機的中斷向量表

中斷號 中斷源 向量地址 查詢優先級 允許位 標誌位
復位 0x0000 0(最高)
0 外部中斷0 0x0003 1 EX0 IE0
1 定時器0 0x000B 2 ET0 TF0
2 外部中斷1 0x0013 3 EX1 IE1
3 定時器1 0x001B 4 ET1 TF1
4 串口 0x0023 5 ES RI/TI
5 定時器2(5x系列新增的) 0x002B 6 ET2 TF2/EXF2
….

定時器相關

定時器0和定時器1

定時器/計數器

寄存器 地址 功能
TH1 8DH 定時器/計數器1(高8位)
TH0 8CH 定時器/計數器0(高8位)
TL1 8BH 定時器/計數器1(低8位)
TL0 8AH 定時器/計數器0(低8位)

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

TMOD寄存器: 定時器/計數器工作方式寄存器.字節地址爲89H,不能位尋址.

位序號 D7 D6 D5 D4 D3 D2 D1 D0
位符號 GATE C/T M1 M0 GATE C/T M1 M0
控制的定時器 定時器1 定時器0
  • GATE: 門控制位

    • GATE=0時,定時器/計數器啓動與停止僅受TCON寄存器中的TRX(X=0/1)來控制.
    • GATE=1時,定時器/計數器啓動與停止由TCON寄存器中的TRX(X=0/1)和外部中斷引腳(INT0INT1)上的電平狀態共同控制.
  • C/T: 定時器模式和計數器模式選擇位

    • C/T=1時爲計數器模式
    • C/T=0時爲定時器模式
  • M1,M0: 工作方式選擇位

    M1 M0 工作方式 計數位 THX初值 TLX初值
    0 0 方式0,13位定時器/計數器 THX全8位和TLX的低5位 (8192N)/32(8192-N)/32 (8192N)%32(8192-N)\%32
    0 1 方式1,16位定時器/計數器 THX的全8位和TLX的全8位 (65535N)/256(65535-N)/256 (65535N)%256(65535-N)\%256
    1 0 方式2,8位初值自動重裝的8位定時器/計數器 TLX用於計數(THX作爲常數緩衝) 256N256-N 256N256-N
    1 1 (僅適用於T0)方式3,分爲兩個8位計數器
    此時TH0佔用定時器中斷1,T1不應當使用中斷
    TH0全8位佔用定時器中斷1
    TL0全8位佔用定時器中斷0
    256N1256-N_1 256N2256-N_2

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

TCON寄存器: 定時器/計數器控制寄存器.字節地址爲88H,可以位尋址.

位序號 D7 D6 D5 D4 D3 D2 D1 D0
位符號 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
位地址 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H
  • TF1: 定時器1溢出標誌位.當定時器1計滿溢出時,由硬件將TF1置1,並申請中斷;進入中斷服務程序後,由硬件自動清零.

    若使用定時器的中斷,該位完全不用人爲操作,但使用軟件查詢方式的話,查詢到該位置1後,就需要用軟件清零.

  • TR1: 定時器1運行控制位: TR=1表示啓動定時器,需要配合GATEINT1.

    • GATE=1,且INT1爲高電平時,TR1置1啓動定時器1.
    • GATE=0時,TR1置1啓動定時器1.
  • TF0: 定時器0溢出標誌位,功能和用法同TF1.

  • TR0: 定時器0運行控制位,功能和用法同TR1.

  • IE1: 外部中斷1請求標誌位.

    • IT1=0時,爲電平觸發方式,每個機器週期的S5P2採樣INT1引腳,若INT1腳爲高電平,則置1;否則IE1清0.
    • IT1=0時,爲跳變沿觸發方式,當第一個機器週期採樣到INT1爲低電平時,將IE1置1,表示外部中斷1正在向CPU請求中斷.當CPU響應,轉向中斷服務程序時,IE1由硬件清零.
  • IT1: 外部中斷1觸發方式選擇位.

    • IT1=0時,爲電平觸發方式,引腳INT1上的低電平有效.
    • IT1=1時,爲跳變沿觸發方式,引腳INT1上的電平從高到低的負跳變有效.
  • IE0: 外部中斷0請求標誌位,功能和用法同IE1.

  • IT0: 外部中斷0觸發方式選擇位,功能和用法同IT1.

定時器/計數器2

T2CON:定時器/計數器2控制寄存器

T2CON: 定時器/計數器2控制寄存器.字節地址爲C8H,可以位尋址.

位序號 D7 D6 D5 D4 D3 D2 D1 D0
位符號 TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 DP/RL2
  • TF2: 定時器2溢出標誌位.當定時器2計滿溢出時置1,必須由軟件清0.當RCLK=1或TCLK=1時,TF2將不會置位.

  • EXF2: 定時器2外部標誌.

    EXEN2=1且-(單片機的P1.1口)的負跳變產生捕獲或重裝時,EXF2置1.定時器2中斷使能時,EXF2=1將使CPU進入定時器2的中斷服務程序.EXF2必須由軟件清0.在遞增/遞減計數器模式(DCEN=1)中,EXF2不會引起中斷.

  • RCLK: 接收時鐘標誌.

    • RCLK=1時,將定時器2的溢出脈衝作爲串行口模式1或模式3的接收時鐘.
    • RCLK=0時,將定時器1的溢出脈衝作爲串行口模式1或模式3的接收時鐘.
  • TCLK: 發送時鐘裝置.

  • TCLK=1時,將定時器2的溢出脈衝作爲串行口模式1或模式3的發送時鐘.

    • TCLK=0時,將定時器1的溢出脈衝作爲串行口模式1或模式3的發送時鐘.
  • EXEN2: 定時器2外部使能裝置.

    • EXEN2=1且定時器2未能作爲串行口時鐘時,允許-的負跳變產生捕獲或重裝.
    • EXEN2=0時,T2EX的跳變對定時器2無效.
  • TR2: 定時器2啓動/停止控制位.

    • TR2=1時啓動定時器2.
    • TR2=1時停止定時器2.
  • C/T2: T2的定時器/計數器選擇位.

    • C/T2=1時,T2爲外部事件計數器(下降沿觸發).
    • C/T2=0時,T2爲內部定時器.
  • CP/RL2: 捕獲/重裝標誌.

    • CP/RL2=1且EXEN2=1時,T2EX的負跳變產生捕獲.
    • CP/RL2=0且EXEN2=0時,定時器2溢出或T2EX的負跳變都可以使定時器自動重裝.當RCLK=1或TCLK=1時,該位無效且定時器強制爲溢出時自動重裝.

定時器/計數器2的工作模式如下:

RCLK+TCLK CP/RL2 TR2 模式
0 0 1 16位自動重裝
0 1 1 16位捕獲
1 1 波特率發生器
0 關閉

T2MOD:計數器2模式控制寄存器

T2MOD: 計數器2模式控制寄存器,用來設定計數器2自動重裝模式遞增或遞減模式.字節地址爲C9H,不能位尋址.

位序號 D7 D6 D5 D4 D3 D2 D1 D0
位符號 –- –- T2OE DCEN
  • T2OE: T2輸出使能位.
  • DCEN: 向下計數使能位.
    • DCEN=0時,計數器2向上計數.
    • DCEN=1時,計數器2通過T2EX確定遞增或遞減計數.

串口相關

PCON:電源管理寄存器

PCON: 電源管理寄存器,管理單片機的電源部分.字節地址爲87H,不能位尋址.

位序號 D7 D6 D5 D4 D3 D2 D1 D0
位符號 SMOD (SMOD0) (LVDF) (P0F) GF1 GF0 PD IDL
  • SMOD: 與串口通信波特率有關。
    • SMOD=0: 串口方式1,2,3時,波特率正常.
    • SMOD=1: 串口方式1,2,3時,波特率加倍.
  • (SMOD0),(LVDE),(P0F): STC單片機特有的功能,其他單片機保留未使用.
  • GF1,GF0: 兩個通用工作標誌位,用戶可以自由使用.
  • PD: 掉電模式設定位
    • PD=0: 單片機處於正常工作狀態.
    • PD=1: 單片機進入掉電(Power Down)模式,可由外部中斷低電平觸發或由下降沿觸發或硬件復位模式喚醒,進入掉電模式後,外部晶振停振,CPU,定時器,串行口全部停止工作,只有外部中斷繼續工作.
  • IDL: 空閒模式設定位
    • IDL=0: 單片機處於正常工作狀態.
    • IDL=1: 單片機進入空閒(Idle)模式,除CPU不工作外,其餘仍繼續工作,在空閒模式由任一個中斷或硬件復位喚醒.

SCON:串行口控制寄存器

SCON: 串行口控制寄存器.字節地址爲98H,可位尋址.

位序號 D7 D6 D5 D4 D3 D2 D1 D0
位符號 SM0 SM1 SM2 REN TB8 RB8 TI RI
  • SM1,SM0: 工作方式選擇位

    SM0 SM1 工作方式 波特率(設系統晶振頻率爲foscf_{osc})
    0 0 方式0,同步移位寄存器方式(通常用於擴展I/O口) fosc/12f_{osc}/12
    0 1 方式1,10位異步收發(8位數據),波特率可變 (2SMOD/32)×(T1T2)(2^{SMOD}/32) \times (T1或T2溢出率)
    1 0 方式2,11位異步收發(9位數據),波特率固定 (2SMOD/64)×fosc(2^{SMOD}/64) \times f_{osc}
    1 1 方式3,11位異步收發(9位數據),波特率可變 (2SMOD/32)×(T1T2)(2^{SMOD}/32) \times (T1或T2溢出率)
  • SM2: 多機通信控制位,主要用於方式2和方式3.

    • 當接收機的SM2=1時,可以利用收到的RB8來控制是否激活RI (RB8=0時不激活RI,收到的信息丟棄;RB8=1時收到的數據進入SBUF,並激活RI,進而在中斷服務中將數據從SBUF讀走).
    • 當接收機SM2=0時,不論收到的RB8是0還是1.均可以使收到的數據進入SBUF,並激活RI(即此時RB8不具有控制RI激活的功能).

    通過控制SM2,可以實現多機通信.在方式0時,SM2必須是0.在方式1時,若SM2=1,則只有接收到有效停止位時,RI才置1.

  • REN: 允許串行接收位

    • REN=1時,允許串行口接收數據.
    • REN=0時,禁止串行口接收數據.
  • TB8: 方式2和方式3中發送數據的第9位.

    • 在方式2和方式3中,TB8是發送數據的第9位.可以用軟件規定其作用:用做數據的奇偶校驗位,或在多機通信中作爲地址幀/數據幀的標誌位.
    • 在方式0和方式1中,TB8位未用.
  • RB8: 方式2和方式3中接收數據的第9位.

    • 在方式2和方式3中,RB8是接收數據的第9位.
    • 在方式1時,若SM2=0,則RB8是接收到的停止位.
  • TI: 發送中斷標誌位

    在方式0下串行發送第8位數據結束時,或在其他方式下串行發送停止位的開始時,由內部硬件使TI置1,向CPU發出中斷申請.在中斷服務程序中,必須用軟件將其清0,取消此中斷申請.

  • RI: 接收中斷標誌位
    在方式0下串行接收第8位數據結束時,或在其他方式下串行接收停止位的中間時,由內部硬件使RI置1,向CPU發出中斷申請.在中斷服務程序中,必須用軟件將其清0,取消此中斷申請.

串口方式1下的定時器1初值

使用串口方式1定時器1方式2產生常用波特率時,TL1TH1中所裝入的值.

波特率(bps) 晶振(MHz) 初值
(SMOD=0) (SMOD=1)
300 11.0592 0xA0 0x40
600 11.0592 0xD0 0xA0
1200 11.0592 0xE8 0xD0
1800 11.0592 0xF0 0xE0
2400 11.0592 0xF4 0xE8
3600 11.0592 0xF8 0xF0
4800 11.0592 0xFA 0xF4
7200 11.0592 0xFC 0xF8
9600 11.0592 0xFD 0xFA
14400 11.0592 0xFE 0xFC
19200 11.0592 –- 0xFD
28800 11.0592 0xFF 0xFE

I2C總線

I2C總線的時序

SDA表示數據線,SCL表示時鐘線.

  • SCL爲高電平期間,SDA上的電位變化表示控制信號.
  • SCL爲低電平期間,SDA上的電位變化表示數據信號.

模擬I2C總線時序的代碼:

  1. 總線初始化: 將總線都拉高以釋放總線.

    void init() {
    	SCL = 1;
    	delay();
    	SDA = 1;
    	delay();
    }
    
  2. 發送啓動信號(由主機發送): 在SCL爲高電平期間,SDA出現下降沿則爲啓動信號.

    void start() {
    	SDA = 1;
    	delay();
    	SCL = 1;
    	delay();
    	SDA = 0;
    	delay();
    }
    
  3. 接收應答信號(由從機發送,主機接收): 在SCL爲高電平期間,接收設備將SDA拉爲低電平,表示數據傳輸正確.

    void respons() {
    	unsigned char i = 0;
        SCL = 1;
    	delay();
        while ((SDA == 1) && (i < 255)) {	// 等待從器件應答,若超時則處理下一位
    		i++;
    	}
    	SCL = 0;
    	delay();
    }
    
  4. 發送停止信號(由主機發送): 在SCL爲高電平期間,SDA出現上升沿則爲停止信號.

    void stop() {
    	SDA = 0;
    	delay();
    	SCL = 1;
    	delay();
    	SDA = 1;
    	delay();
    }
    
  5. 發送一字節的數據(由主機發送)

    void write_byte(unsigned char dataa) {
    	unsigned char i,temp;
    	temp = dataa;
    	for (i = 0; i < 8; i++) {
    		temp = temp << 1;	// 左移一位,最高位被存入PSW寄存器的CY位
    		SCL = 0;
    		delay();
    		SDA = CY;			// 將CY賦給數據線
    		delay();
    		SCL = 1;
    	}
    	SCL = 0;
    	delay();
    	SDA = 1;
    	delay();
    }
    
  6. 接收一個字節的數據(由從機發送,主機接收)

    unsigned char read_byte() {
    	unsigned char i, dataa;
    	SCL = 0;
    	delay();
    	SDA = 1;
    	for (i = 0; i < 8; ++i) {
    		SCL = 1;
    		delay();
    		dataa = (dataa << 1) | SDA;	// 接收一位數據
    		SCL = 0;
    		delay();
    	}
    	delay();
    	return dataa;
    }
    

STC51單片機功能

WDT_CONTR:看門狗定時器寄存器

WDT_CONTR: 看門狗定時器寄存器.字節地址爲E1H,不能位尋址.

位序號 D7 D6 D5 D4 D3 D2 D1 D0
位符號 EN_WDT CLR_WDT IDLE_WDT PS2 PS1 PS0
  • EN_WDT: 看門狗允許位.當其設置爲1時,啓動看門狗.

  • CLR_WDT: 看門狗清0位.當其設置爲1時,看門狗定時器將重新計數,硬件自動將此位清零.

  • IDLE_WDT: 看門狗IDLE模式位.

    • IDLE_WDT=1時,看門狗定時器在單片機的空閒模式時計數.
    • IDLE_WDT=0時,看門狗定時器在單片機的空閒模式時不計數.
  • PS2,PS1,PS0: 看門狗定時器預分頻值,不同值對應預分頻數如下表所示.

    PS2 PS1 PS0 預分頻數 看門狗溢出時間
    0 0 0 2 65.5ms
    0 0 1 4 131ms
    0 1 0 8 262.1ms
    0 1 1 16 524.2ms
    1 0 0 32 1.0485s
    1 0 1 64 2.0971s
    1 1 0 128 4.1943s
    1 1 1 256 8.3886s

    =×32768 看門狗溢出時間 = \frac{預分頻數 \times 32768}{晶振頻率}

ISP_CONTR:ISP/IAP控制寄存器

ISP_CONTR: ISP/IAP控制寄存器.字節地址爲E7H,不能位尋址.

位序號 D7 D6 D5 D4 D3 D2 D1 D0
位符號 ISPEN SWBS SWRST WT2 WT1 WT0
  • ISPEN: ISP/IAP功能允許位.

    • ISPEN=0時,禁止ISP/IAP編程改變Flash.
    • ISPEN=1時,允許ISP/IAP編程改變Flash.
  • SWBS: 軟件選擇從何處啓動,要與SWRST直接配合纔可以實現.

    • SWBS=0時,從用戶應用程序區啓動.
    • SWBS=1時,從ISP程序區啓動.
  • SWRST: 當其設置爲1時,產生軟件系統復位,硬件自動將此位清零.

  • WT2,WT1,WT0: ISP/IAP編程時設定CPU等待的最長時間,若在此時間內對Flash的操作未完成,數據將丟失或錯誤.

    設置等待時間 CPU等待時間(機器週期)
    WT2 WT1 WT0 讀操作 寫操作 擦除操作 要求系統時鐘
    0 1 1 6 30 5741 小於5MHz
    0 1 0 11 60 10942 小於10MHz
    0 0 1 22 120 21885 小於20MHz
    0 0 0 43 240 43679 小於40MHz
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章