- 單片機(jī)C語言程序設(shè)計(jì)實(shí)訓(xùn)100例:基于STC8051+Proteus仿真與實(shí)戰(zhàn)
- 彭偉
- 1507字
- 2022-05-05 20:18:19
1.4 特殊功能寄存器
8051單片機(jī)特殊功能寄存器如表1-3所示。其中,片內(nèi)RAM 80H~FFH單元大部分被用于特殊功能寄存器。
表1-3 8051單片機(jī)特殊功能寄存器

注:帶有*號(hào)的特殊功能寄存器是可位尋址的。
上述特殊功能寄存器分別被用于以下功能單元。
CPU:ACC、B、PSW、SP、DPTR。
并行端口:P0、P1、P2、P3。
中斷系統(tǒng):IE、IP。
定時(shí)/計(jì)數(shù)器模塊:TMOD、TCON、T0(TH0、TL0)、T1(TH1、TL1)。其中,TCON還含有外部中斷標(biāo)志位及外部中斷觸發(fā)方式配置位。
串行通信模塊:SCON、SBUF、PCON。
這些特殊功能寄存器在開發(fā)單片機(jī)C語言程序時(shí)將被大量使用。對(duì)于可位尋址的特殊功能寄存器,例如,ACC寄存器常被用于判斷字節(jié)中各位的狀態(tài)。如果要判斷某字節(jié)第3位是否為1,可將ACC寄存器看成一個(gè)字節(jié)變量,ACC寄存器獲取該字節(jié)值后即可直接判斷ACC3是否為1,前提是要先定義sbit ACC3=ACC^3。
又如程序狀態(tài)字(Program Status Word,PSW)寄存器,在Keil\C51下的頭文件reg51.h中包含有該寄存器的各位定義,其部分內(nèi)容如下:

PSW寄存器中的CY和F0在C語言程序中仍然被直接大量使用,如要將字節(jié)變量d(假定為10101101)由高位開始逐位串行發(fā)送,可對(duì)d進(jìn)行8次左移,并逐次發(fā)送CY,即

其中,DQ被定義為某外部芯片讀/寫串行數(shù)據(jù)的引腳。這段代碼利用了匯編語言程序中常用的進(jìn)位標(biāo)志位CY,可方便地獲取移出的各位數(shù)據(jù)。
該頭文件對(duì)P0~P3以外可位尋址寄存器位給出了獨(dú)立定義,如果要直接引用4個(gè)I/O端口各引腳,要在程序中用sbit進(jìn)行單獨(dú)定義。當(dāng)然也可將頭文件reg51.h(keil\c51\inc)改成at89x52.h(keil\c51\inc\atmel),4個(gè)I/O端口各引腳在該頭文件中均被單獨(dú)定義,如P0.1被定義為P0_1。盡管其中有些定義對(duì)8051單片機(jī)是無效的,但這并不影響程序的正常編譯運(yùn)行。
此前曾提到I/O接口位結(jié)構(gòu)中的“讀鎖存器”與“讀引腳”的問題,這些問題的解釋涉及8051單片機(jī)的相關(guān)特殊功能寄存器。凡是“讀—改—寫”這類指令,CPU將執(zhí)行“讀鎖存器”,否則CPU將執(zhí)行“讀引腳”。下面通過實(shí)例說明這一問題。
以匯編指令ORL P2, A為例,它相當(dāng)于C語言的P2=P2|ACC或P2|=ACC指令。現(xiàn)假設(shè)在P2.0引腳接有一個(gè)開關(guān),執(zhí)行程序之前先合上該開關(guān)使P2.0引腳接地,然后依次執(zhí)行:

其中,最后的while(1)相當(dāng)于匯編語言指令JMP $,它使程序執(zhí)行到該位置后進(jìn)入死循環(huán),以便觀察單片機(jī)接口狀態(tài)。上述語句執(zhí)行后,P2引腳輸出應(yīng)為0x77(0111 0111)還是0x76(0111 0110)呢?
實(shí)際情況是,如果開關(guān)仍然是合上的,通過Proteus仿真軟件可觀察到P2引腳狀態(tài)為0x76;如果開關(guān)是斷開的,則P2引腳狀態(tài)變?yōu)?x77。顯然,對(duì)于P2=P2|ACC這樣的“讀—改—寫”指令,CPU執(zhí)行的是“讀鎖存器”。這是因?yàn)槿绻恰白x引腳”,則所讀取的P2將為0x32而不是0x33,最終結(jié)果將為0x76而不會(huì)在斷開開關(guān)時(shí)變?yōu)?x77。
可見,CPU執(zhí)行的是“讀鎖存器”而非“讀引腳”,這樣可避免此前輸出到“引腳”的值可能被外部改變的情況。“讀鎖存器”可確保讀取的是此前輸出的原始值,而不是輸出后被外部改變過的值。
又如,指令MOV A, P1,相當(dāng)于C語言的ACC=P1,CPU顯然將發(fā)出“讀引腳”信號(hào)。仍假設(shè)運(yùn)行程序之前開關(guān)是合上的,P2.0接地,依次執(zhí)行下述語句:

觀察單片機(jī)P2引腳,可知其狀態(tài)為0x76,且斷開開關(guān)后仍為0x76。可見,對(duì)于ACC=P2,CPU執(zhí)行的是“讀P2引腳”上的0x32,而不是“讀P2鎖存器”中的0x33。
對(duì)于P0~P3端口的“讀/寫”操作還應(yīng)注意,由于初始上電時(shí)它們?nèi)勘粚懭搿?”,故可以不用初始化它們而直接讀取它們的外部數(shù)據(jù)。但如果它們?cè)敵鲞^“0”,之后又要逆向讀入外部數(shù)據(jù),此時(shí)則要在相應(yīng)端口位上先輸出“1”。
STC15特殊功能寄存器與高128B RAM共用相同的地址,都使用80H~FFH。訪問特殊功能寄存器必須用直接尋址指令。STC15系列單片機(jī)特殊功能寄存器如表1-4所示。由表1-4可知,相較于傳統(tǒng)型8051單片機(jī),STC15特殊功能寄存器被大量擴(kuò)充,這也意味著其功能相較于傳統(tǒng)8051單片機(jī)有了顯著增強(qiáng)。
表1-4 STC15系列單片機(jī)特殊功能寄存器

續(xù)表

續(xù)表

續(xù)表

續(xù)表

續(xù)表

注:串口為串行接口的簡(jiǎn)稱。
- Instant Node Package Manager
- Python爬蟲開發(fā):從入門到實(shí)戰(zhàn)(微課版)
- PowerCLI Cookbook
- Linux網(wǎng)絡(luò)程序設(shè)計(jì):基于龍芯平臺(tái)
- Mastering Ubuntu Server
- 編譯系統(tǒng)透視:圖解編譯原理
- 概率成形編碼調(diào)制技術(shù)理論及應(yīng)用
- INSTANT OpenNMS Starter
- 從Excel到Python:用Python輕松處理Excel數(shù)據(jù)(第2版)
- Mastering Xamarin.Forms(Second Edition)
- AV1視頻編解碼標(biāo)準(zhǔn):原理與算法實(shí)現(xiàn)
- Python Linux系統(tǒng)管理與自動(dòng)化運(yùn)維
- UI動(dòng)效設(shè)計(jì)從入門到精通
- CryENGINE Game Programming with C++,C#,and Lua
- Scratch 3.0少兒積木式編程(6~10歲)