IO(Input/Output),,即輸入輸出端口,就是單片機的IO口,,STC89C52RC單片機具有4組IO口,,P0~P3,每一組IO都有8個IO口,,且8個IO口都可以單獨讀寫,,也就是說STC89C52RC單片機具備32個可以單獨讀寫的IO口,這些端口可以通過程序來控制輸出高低電平,,高電平5V,,低電平0V,,也可以通過程序讀取端口輸入的電平狀態(tài),IO端口的操作有兩種方式,,一種是位帶操作,,這種操作是單獨控制其中某一個IO端口,還有一種是總線式操作,,就是可以同時給P0~P3這4組IO中的其中一組進行賦值,,同時令8個IO口同時輸出或者輸入信號。
2.1 位帶操作
2.1.1 原理圖
2.1.2 數(shù)據(jù)的輸出
第13行:利用sbit關(guān)鍵字定義一個端口名稱,,把P1.0端口定義成LED,,之后的開發(fā)中,所有的端口定義都需要用到sbit關(guān)鍵字,,這個格式需要牢記
第22行~第27行:延時函數(shù),,通過2級循環(huán)完成的延時功能,由于單片機外部時鐘是12MHz,,所以程序執(zhí)行起來會非??欤绻麤]有延時函數(shù),,在這個實驗中,,就無法實現(xiàn)LED的閃爍功能(因為人眼并沒有那么快)
第35行:控制P1.0輸出低電平,即0V,,由于硬件電路LED的正極通過一個電阻接到了5V上,,根據(jù)二極管的單向?qū)щ娦裕?dāng)負極為0V時,,LED就會發(fā)光,,當(dāng)負極為5V時,LED就會熄滅,,電阻起到了限制電流的作用,,防止電流過大燒毀LED
第36行:調(diào)用延時函數(shù),設(shè)置延時500ms
第37行:控制P1.0輸出高電平,,即5V,。
注:主循環(huán)里面的不停地將P1.0端口設(shè)置成0V和5V的過程就可以控制LED不停的亮滅,其中延時函數(shù)就是為了讓人眼能夠看到這個過程,,如果沒有延時函數(shù),,就會因為程序執(zhí)行的過快導(dǎo)致無法看到閃爍的效果。
2.1.3 數(shù)據(jù)的輸入
這段程序和上一段數(shù)據(jù)輸出的程序差不多,,重點看以下幾個位置
第14行:利用關(guān)鍵字sbit定義端口P1.7在程序中的名稱為KEY
第35行~第43行:檢測按鍵是否按下的流程
?。?)檢測到P1.7端口為低電平,即0V,,因為按鍵的一端接單片機P1.7端口,,另一端接在了GND上,,所以按下后端口被強制拉到0V,抬起后,,單片機P1.7端口到恢復(fù)5V
?。?)延時一段時間(延時去抖動):延時的原因是由于機械按鍵按下后不是嚴格的按下,而是會有一段電平不穩(wěn)定的時間,,所以需要用程序?qū)⑦@段時間的電平忽略掉
?。?)經(jīng)過10ms后再一次檢測到P1.7位低電平,這時,,才能夠確定按鍵的確按下了,,此時P1.0輸出低電平點亮LED
第44行~第47行:按鍵沒有按下時,P1.7是默認的高電平,,此時控制P1.0輸出高電平
2.2 總線操作
2.2.1 原理圖
2.2.2 數(shù)據(jù)的輸出
當(dāng)控制這種多個LED的時候,,位帶操作就顯得比較麻煩,因為光sbit定義就需要8個,,所以此時可以直接控制P1寄存器來控制LED狀態(tài),,通過直接將數(shù)據(jù)寫入P1寄存器來控制LED狀態(tài)。
第28行:定義P1寄存器數(shù)據(jù),,將8位二進制代碼轉(zhuǎn)換成16進制數(shù)據(jù),,由于LED接在了P1端口上,所以每個燈的狀態(tài)如下表所示
其中LED7為數(shù)據(jù)最高位,,所以數(shù)據(jù)應(yīng)該是1111 1110,,而不是0111 1111
第32行~第36行:利用for循環(huán),循環(huán)8次將數(shù)據(jù)送入P1寄存器,,P1寄存器的數(shù)據(jù)會直接映射在P1端口上,。
2.2.3 數(shù)據(jù)的輸入
數(shù)據(jù)輸入這一部分代碼明顯少了很多,因為這里面不需要延時函數(shù),,所以直接刪去了延時函數(shù),在編程時,,如果沒有用到的函數(shù)可以直接注釋掉或者刪除,,因為如果有函數(shù)沒有調(diào)用,編譯會報警告,,但是并不影響程序執(zhí)行結(jié)果,,重點看17行的代碼,將P3讀取到的數(shù)據(jù)直接寫入P1寄存器中,,因為8個按鍵接在了P3端口上,,LED接在了P1端口上,所以剛好可以通過按鍵來實現(xiàn)LED的控制,。
更多信息可以來這里獲取==>>電子技術(shù)應(yīng)用-AET<<