8051單片機(jī)學(xué)習(xí)筆記/概要/總結(jié)/備忘
*.I/O引腳和I/O端口
P0(P0.7~P0.0)1.P0是一個(gè)漏極開路型準(zhǔn)雙向I/O口.
2.在訪問外存時(shí), 它是數(shù)據(jù)總線和地址總線的低8位分時(shí)復(fù)用接口.
3.在EPROM編程時(shí), 它接收指令字節(jié); 在驗(yàn)證程序時(shí), 輸出指令字節(jié), 并要求外接上拉電阻.
2.在EPROM編程和程序驗(yàn)證時(shí), 它接收低8位地址.P2(P2.7~P2.0)1.P2是帶內(nèi)部上拉電阻的8位雙向I/O口.
2.在訪問外存時(shí), 它輸出8位高地址.
3.在對EPROM編程時(shí)和程序驗(yàn)證時(shí), 它接收8位高地址.P3(P3.7~P3.0)1.P3是帶內(nèi)部上拉電阻的8位雙向I/O口, 它是雙功能I/O口.
2.除基本輸入/輸出功能外, 每個(gè)引腳還有特殊功能.
I/O口特殊/專用功能P3.0RXD:串行數(shù)據(jù)接收P3.1TXD:串行數(shù)據(jù)發(fā)送P3.2/INT0:外部中斷0輸入請求P3.3/INT1:外部中斷1請求輸入P3.4T0:定時(shí)器0外部計(jì)數(shù)脈沖輸入P3.5T1:定時(shí)器1外部計(jì)數(shù)脈沖輸入P3.6/WR:外部數(shù)據(jù)存儲(chǔ)器寫信號P3.7/RD:外部數(shù)據(jù)存儲(chǔ)器讀信號
*.復(fù)位寄存器狀態(tài)
*.特殊功能寄存器
*.可位尋址的特殊功能寄存器
GF1GF0PDIDL波特率倍乘位
用戶標(biāo)志用戶標(biāo)志掉電方式位待機(jī)方式位定時(shí)器方式控制寄存器 TMODGATEC/-TM1M0GATEC/-TM1M0T1門控位T1定時(shí)器/計(jì)數(shù)器選擇T1工作方式選擇T0門控位T0定時(shí)器/計(jì)數(shù)器選擇T0工作方式選擇程序狀態(tài)字 PSWCYACF0RS1RS0OV
P進(jìn)位標(biāo)志輔助進(jìn)位標(biāo)志用戶標(biāo)志工作寄存器組選擇標(biāo)志溢出標(biāo)志
奇偶標(biāo)志中斷優(yōu)先級控制器 IP
PSPT1PX1PT0PX0
串口優(yōu)先級設(shè)置T1優(yōu)先級設(shè)置/INT1優(yōu)先級設(shè)置T0優(yōu)先級設(shè)置/INT0優(yōu)先級設(shè)置中斷使能寄存器 IEEA
ESET1ETXET0EX0CPU總中斷使能
串口中斷使能T1中斷使能/INT1中斷使能T0中斷使能/INT0中斷使能串口控制寄存器 SCONSM0SM1SM2RENTB8RB8TIRI串口工作方式選擇位允許接收發(fā)送數(shù)據(jù)第9位接收數(shù)據(jù)第9位發(fā)送完成中斷標(biāo)志接收數(shù)據(jù)中斷標(biāo)志定時(shí)器控制寄存器 TCONTF1TR1TF0TR0IE1IT1IE0IT0T1溢出標(biāo)志T1運(yùn)行控制位T0溢出位T0運(yùn)行控制位/INT1中斷標(biāo)志/INT1觸發(fā)方式/INT0中斷標(biāo)志/INT0觸發(fā)方式
*.中斷系統(tǒng)
0:電平觸發(fā)
1:下降沿觸發(fā)
電平觸發(fā)時(shí)需軟件清零最高T0000BH8ET0(IE.1)TF0(TCON.5)PT0(IP.1)
無需軟件清零
/INT10013H8EX1(IE.2)IE1(TCON.3)PX1(IP.2)IT1(TCON.2)電平觸發(fā)時(shí)需軟件清零
T1001BH8ET1(IE.3)TF1(TCON.7)PT1(IP.3)
無需軟件清零
串口0023H8ES(IE.4)
RI(SCON.0)
TI(SCON.1)
需軟件清零最低
*.定時(shí)器/計(jì)數(shù)器工作方式
*.串口工作方式
注:表中n為32/2SMOD,SMOD為PCON的第7位波特率倍乘位
*.定時(shí)器/計(jì)數(shù)器初值的計(jì)算
環(huán)境:
晶振:12.0000MHz
定時(shí)器:T0
溢出條件:(TH0<<8|TL0)由0FFFFH變?yōu)?000H(0FFFFH+1 產(chǎn)生的進(jìn)位置位TF0產(chǎn)生中斷)
假設(shè)延時(shí)時(shí)間為50ms,則:
頻率:ft= 12.0000MHz
時(shí)鐘周期:Tt= 1/ft(SI)
機(jī)器周期:Tm= 12*Tt= 12*1/(12*10^6),(SI) = 12*1/12 (us) = 1 (us)(前面的12是因?yàn)?1是12分頻,即12個(gè)時(shí)鐘周期為1個(gè)機(jī)器周期)
所以:
50ms == 50000us == 50000個(gè)機(jī)器周期
由 0FFFFH 到 10000H 為 1個(gè)機(jī)器周期,則:
初值:start = 0FFFFH + 1H - 50000D = 65536D - 50000D = 15536D = 3CB0H
于是:TH0 = 0x3C,TL0 = 0xB0
若晶振頻率為:ft= 11.0592MHz
同樣:機(jī)器周期Tm= 12*Tt= 12*1/(11.0592*10^6),(SI) = 12/11.0592 (us) = 1.085069(us)
所以:
50ms == 50000us = 50000/1.085069 = 46080D 個(gè)機(jī)器周期
初值:start = 0FFFFH + 1H - 46080D = 65536D - 46080D = 19456D = 4C00H
于是:TH0 = 0x4C, TL0 = 0x00
*.串口通信中定時(shí)器工作方式下波特率初值計(jì)算以及晶振的選擇
當(dāng)串口工作方式為1(8位UART),T1為定時(shí)器時(shí):
k=13:定時(shí)器工作方式0; k=16, 工作方式1, k=8, 工作方式2, ...
T1溢出率 = Fosc/(12*(2k-初值)),即每秒溢出次數(shù),Fosc:晶振頻率,*12:轉(zhuǎn)換為時(shí)鐘周期
所以 波特率 = T1溢出率/(32/2SMOD) = 2SMOD*/32*T1溢出率 = 2SMOD* Fosc/(32*12*(2k-初值))
常用波特率:9600bps,192000bps,4800bps, ...
所以當(dāng)波特率=9600bps, SMOD=0, k=8時(shí):
波特率 = 2SMOD* Fosc/(32*12*(2k-初值)) = Fosc/(384*(256-初值)) = 9600
當(dāng)晶振為11.0592Mhz時(shí):9600=11.0592*106/(384(256-初值)),求得:初值=253D = 0FDH,此時(shí)恰為整數(shù)(即TH1=TL1 = 0xFD)
當(dāng)晶振為12.0000MHz時(shí):初值為252.744791, 不為整數(shù)
這就是為什么在進(jìn)行串行通信時(shí)要選擇11.0592MHz晶振, 不選擇12MHz晶振的原因.
*.由定時(shí)器1產(chǎn)生的常用波特率
SMOD