I/O端口的簡單應用

基本輸入輸出單元與編程

輸出電路

基本輸出元件:發光二極管(Light Emitting Diode)

灌入的最大電流爲 10 mA     

拉出的最大電流爲 1 mA

單片機輸出低電平時驅動能力尚可,輸出高電平時驅動能力很差。

輸入電路        

基本輸入元件:按鈕(Button)或開關(Switch

當按鍵未按下壓時,Px.n端口爲高電平;按壓按鍵後爲低電平。

實例獨立按鍵識別

要求採用獨立按鍵方式實現下述功能:開機時LED全熄,然後根據按鍵動作使相應燈亮,並將亮燈狀態保持到按壓其它鍵時爲止。

獨立按鍵——每個按鍵都彼此獨立地各佔有一位I/O口線。特點是電路簡單,但佔用I/O口線較多。

分析

爲使按鍵擡起後LED能保持先前的點亮狀態,需要在按鍵未壓下期間禁止向P2輸出P0狀態值。

參考程序如下:

void main( ) {
   char key = 0;		    //定義按鍵變量
   while(1){
         key = P0 & 0x0f; 	   //讀取按鍵狀態,高4位清零
         if (key != 0x0f) P2 = key;  //有按鍵動作時,P0狀態值送P2
    }
}

 

實例鍵控流水燈

要求

  K1爲“啓動鍵”,首次按壓K1可產生“自下向上” 的流水燈運動;

  K2 爲“停止鍵”,按壓K2可終止流水燈的運動;

  K3K4爲“方向鍵,分別產生 “自上向下”和 “自下向上” 運動。

思路分析:設立狀態標誌變量→根據鍵值修改標誌值→根據標誌值控制燈的亮滅

總體關係流程圖如下:

獲取按鍵狀態

狀態

無按鍵—— xxxx 1111B   0x0f

按壓K1——xxxx 1110B   0x0e

 

按壓K2——xxxx 1101B   0x0d

按壓K3——xxxx 1011B   0x0b

按壓K4——xxxx 0111B  0x07

按鍵動作判斷——P0 & 0x0f)是否等於 0x0f?若是,說明無按鍵動作,反之則有按鍵動作。

修改方向和啓停標誌值

switch(P0 & 0x0f){
case 0x0e:run=1;break,
case 0x0d:run=0,dir=0;break,
case 0x0b: dir=1,break,
case 0x07: dir=0;break,
}

 

D1D4循環方向控制

P2口亮燈編碼

xxxx 1110

xxxx 1101

xxxx 1011

xxxx 0111

char led [ ] = {0xfe,0xfd,0xfb,0xf7};

for (i=0; i<=3; i++){ P2 = led [i]; } //↓移動
for (i=3; i>=0; i-- ) { P2 = led [i]; } //↑移動

#include "reg51.h"
char led[]={0x01,0x02,0x04,0x08};
void delay(unsigned int time){
	unsigned int j= 0;
	for(;time>0;time--)
		for(j=0;j<125;j++);
}
void main(){
	bit dir =0,run=0;
	//標誌位初始化
	char i;
	while(1){
	switch(P0 & 0x0f){    //根據鍵值修改標誌位
	case 0x0e:run=1;break;
	case 0x0d:run=0;dir=0;break;
	case 0x0b:dir=1;break;
	case 0x07:dir=0;break;
	}
	if(run)    //若run=dir=1,自上而下流動
		if(dir)
			for(i=0;i<=3;i++){
				P2=led[i];
				delay(200);
			}
		else     //若run=l,dir=0, 自下而上流動
			for(i=3;i>=0;i--){
				P2=led[i];
				delay(200);
			}
	else P2=0;   //若run=0,燈全滅
	}
}

實例2原理圖與程序界面圖

實例2程序運行效果

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章