文章目錄
顯示相關
共陰極數碼管表
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)和外部中斷引腳(INT0
或INT1
)上的電平狀態共同控制.
-
C/T
: 定時器模式和計數器模式選擇位C/T
=1時爲計數器模式C/T
=0時爲定時器模式
-
M1
,M0
: 工作方式選擇位M1 M0 工作方式 計數位 THX初值 TLX初值 0 0 方式0,13位定時器/計數器 THX全8位和TLX的低5位 0 1 方式1,16位定時器/計數器 THX的全8位和TLX的全8位 1 0 方式2,8位初值自動重裝的8位定時器/計數器 TLX用於計數(THX作爲常數緩衝) 1 1 (僅適用於T0)方式3,分爲兩個8位計數器
此時TH0佔用定時器中斷1,T1不應當使用中斷TH0全8位佔用定時器中斷1
TL0全8位佔用定時器中斷0
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表示啓動定時器,需要配合GATE
和INT1
.- 當
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 工作方式 波特率(設系統晶振頻率爲) 0 0 方式0,同步移位寄存器方式(通常用於擴展I/O口) 0 1 方式1,10位異步收發(8位數據),波特率可變 1 0 方式2,11位異步收發(9位數據),波特率固定 1 1 方式3,11位異步收發(9位數據),波特率可變 -
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
位未用.
- 在方式2和方式3中,
-
RB8
: 方式2和方式3中接收數據的第9位.- 在方式2和方式3中,
RB8
是接收數據的第9位. - 在方式1時,若
SM2
=0,則RB8
是接收到的停止位.
- 在方式2和方式3中,
-
TI
: 發送中斷標誌位在方式0下串行發送第8位數據結束時,或在其他方式下串行發送停止位的開始時,由內部硬件使
TI
置1,向CPU發出中斷申請.在中斷服務程序中,必須用軟件將其清0,取消此中斷申請. -
RI
: 接收中斷標誌位
在方式0下串行接收第8位數據結束時,或在其他方式下串行接收停止位的中間時,由內部硬件使RI
置1,向CPU發出中斷申請.在中斷服務程序中,必須用軟件將其清0,取消此中斷申請.
串口方式1下的定時器1初值
使用串口方式1定時器1方式2產生常用波特率時,TL1
和TH1
中所裝入的值.
波特率(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總線時序的代碼:
-
總線初始化: 將總線都拉高以釋放總線.
void init() { SCL = 1; delay(); SDA = 1; delay(); }
-
發送啓動信號(由主機發送): 在
SCL
爲高電平期間,SDA
出現下降沿則爲啓動信號.void start() { SDA = 1; delay(); SCL = 1; delay(); SDA = 0; delay(); }
-
接收應答信號(由從機發送,主機接收): 在
SCL
爲高電平期間,接收設備將SDA
拉爲低電平,表示數據傳輸正確.void respons() { unsigned char i = 0; SCL = 1; delay(); while ((SDA == 1) && (i < 255)) { // 等待從器件應答,若超時則處理下一位 i++; } SCL = 0; delay(); }
-
發送停止信號(由主機發送): 在
SCL
爲高電平期間,SDA
出現上升沿則爲停止信號.void stop() { SDA = 0; delay(); SCL = 1; delay(); SDA = 1; delay(); }
-
發送一字節的數據(由主機發送)
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(); }
-
接收一個字節的數據(由從機發送,主機接收)
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
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