【51单片机快速入门指南】2:GPIO LED与按键
目錄
- 硬知識
- 概念
- I/O口配置
- 準雙向口/弱上拉輸出配置
- 開漏輸出配置
- 實戰
- 延時函數的生成
- 閃爍一個LED燈
- 源碼
- 實驗現象
- 流水燈
- 源碼
- 實驗現象
- 按鍵控制LED燈
- 按鍵介紹
- 源碼
- 實驗現象
普中51-單核-A2
STC89C52
Keil uVision V5.29.0.0
PK51 Prof.Developers Kit Version:9.60.0.0
硬知識
概念
????????GPIO(general purpose intput output)是通用輸入輸出端口的簡稱,可以通過軟件來控制其輸入和輸出。
I/O口配置
????????STC89C52系列單片機所有I/O口均(新增P4口)有3種工作類型:準雙向口/弱上拉(標準8051輸出模式)、僅為輸入(高阻)或開漏輸出功能。STC89C52系列單片機的P1/P2/P3/P4上電復位后為準雙向口/弱上拉(傳統8051的I/O口)模式,P0口上電復位后是開漏輸出。P0口作為總線擴展用時,不用加上拉電阻,作為I/O口用時,需加10K-4.7K上拉電阻。
????????STC89C52的5V單片機的P0口的灌電流最大為12mA,其他1/0口的灌電流最大為6mA STC89LE52系列的3V單片機的PO口的灌電流最大為8mA,其他1/0口的灌電流最大為4mA.
準雙向口/弱上拉輸出配置
????????準雙向口輸出類型可用作輸出和輸入功能而不需重新配置端口輸出狀態。這是因為當端口輸出為1時驅動能力很弱,允許外部裝置將其拉低。當引腳輸出為低時,它的驅動能力很強,可吸收相當大的電流。準雙向口有3個上拉晶體管適應不同的需要。
????????在3個上拉晶體管中,有1個上拉晶體管稱為“弱上拉”,當端口寄存器為1且引腳本身也為1時打開。此上拉提供基本驅動電流使準雙向口輸出為1。如果一個引腳輸出為1而由外部裝置下拉到低時,弱上拉關閉而“極弱上拉”維持開狀態,為了把這個引腳強拉為低,外部裝置必須有足夠的灌電流能力使引腳上的電壓降到門檻電壓以下。
????????第2個上拉晶體管,稱為“極弱上拉”,當端口鎖存為1時打開。當引腳懸空時,這個極弱的上拉源產生很弱的上拉電流將引腳上拉為高電平。
????????第3個上拉晶體管稱為“強上拉”。當端口鎖存器由0到1跳變時,這個上拉用來加快準雙向口由邏輯0到邏輯1轉換。當發生這種情況時,強上拉打開約2個時鐘以使引腳能夠迅速地上拉到高電平。
開漏輸出配置
????????P0口上電復位后處于開漏模式,當P0管腳作I/O口時,需外加10K-4.7K的上拉電阻,當P0管腳作為地址/數據復用總線使用時,不用外加上拉電阻。
????????當端口鎖存器為0時,開漏輸出關閉所有上拉晶體管。當作為一個邏輯輸出時,這種配置方式必須有外部上拉,一般通過電阻外接到Vcc。如果外部有上拉電阻,開漏的I/O口還可讀外部狀態,即此時被配置為開漏模式的I/O口還可作為輸入I/O口。這種方式的下拉與準雙向口相同。
實戰
延時函數的生成
使用軟件延時計算器生成延時函數
系統頻率選擇和開發板上的晶振頻率一致
閃爍一個LED燈
源碼
#include <REGX52.H> #include "intrins.h"sbit D1 = P2^0; //將P2.0管腳定義為D1void Delay500ms() //@11.0592MHz {unsigned char i, j, k;_nop_();i = 4;j = 129;k = 119;do{do{while (--k);} while (--j);} while (--i); }void main(void) {while(1){D1 = ~D1;Delay500ms();} }實驗現象
燒錄后可見D1閃爍
流水燈
由原理圖可知,P2口控制的LED燈為低電平點亮。
源碼
stdint.h內容見【51單片機快速入門指南】一、基礎知識和工程創建
#include <REGX52.H> #include "intrins.h" #include "stdint.h"#define LED_PORT P2 //使用宏定義P2端口void Delay500ms() //@11.0592MHz {unsigned char i, j, k;_nop_();i = 4;j = 129;k = 119;do{do{while (--k);} while (--j);} while (--i); }void main(void) { uint8_t i = 0;LED_PORT= ~(uint8_t)1;while(1){//方法1:使用移位+循環實現流水燈for(i=0; i<8; i++){LED_PORT=~(0x01<<i); //將1右移i位,然后取反將結果賦值到LED_PORTDelay500ms();}for(i=0; i<8; i++){LED_PORT=~(0x80>>i); //將1右移i位,然后取反將結果賦值到LED_PORTDelay500ms();}//方法2:使用循環+_crol_或_cror_函數實現流水燈for(i=0; i<7; i++) //將led左移一位{ LED_PORT = _crol_(LED_PORT,1);Delay500ms(); }for(i=0; i<7; i++) //將led右移一位{LED_PORT = _cror_(LED_PORT,1);Delay500ms(); } } }實驗現象
按鍵控制LED燈
由原理圖可知,K1按下后P31接地,其值應為0
按鍵介紹
????????按鍵是一種電子開關,使用時輕輕按開關按鈕就可使開關接通,當松開手時, 開關斷開。開發板上使用的按鍵及內部簡易圖如下圖所示:
????????按鍵管腳兩端距離長的表示默認是導通狀態,距離短的默認是斷開狀態, 如果按鍵按下,初始導通狀態變為斷開,初始斷開狀態變為導通。 通常的按鍵所用開關為機械彈性開關,當機械觸點斷開、閉合時,電壓信號如下圖所示:
????????由于機械點的彈性作用,按鍵開關在閉合時不會馬上穩定的接通,在斷開時也不會一下子斷開,因而在閉合和斷開的瞬間均伴隨著一連串的抖動。抖動時間 的長短由按鍵的機械特性決定的,一般為 5ms 到 10ms。按鍵穩定閉合時間的長短則由操作人員的按鍵動作決定的,一般為零點幾秒至數秒。按鍵抖動會引起按鍵被誤讀多次。為了確保 CPU 對按鍵的一次閉合僅作一次處理,必須進行消抖。
????????按鍵消抖有兩種方式,一種是硬件消抖,另一種是軟件消抖。為了使電路更加簡單,通常采用軟件消抖。
軟件消抖
????????一般來說一個簡單的按鍵軟件消抖就是先讀取按鍵的狀態,如果得到按鍵按下之后,延時一段時間,再次讀取按鍵的狀態,如果按鍵還是按下狀態,那么說明按鍵已經按下。其中延時就是軟件消抖處理。
硬件消抖
示例:
源碼
#include <REGX52.H> #include "intrins.h" #include "stdint.h"sbit K1 = P3^1; sbit D1 = P2^0;void Delay20ms() //@11.0592MHz {unsigned char i, j;i = 36;j = 217;do{while (--j);} while (--i); }void main(void) { while(1){if(K1 == 0){Delay20ms(); //消抖if(K1 == 0){D1 = ~D1;while(K1 == 0); //等待按鍵釋放}}} }實驗現象
按下K1后可見D1翻轉。
總結
以上是生活随笔為你收集整理的【51单片机快速入门指南】2:GPIO LED与按键的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Job make U funck Use
- 下一篇: RS485电路原理以及设计