1. 程式人生 > >CC2530(二)並行I/O埠應用

CC2530(二)並行I/O埠應用

任務一   實現流水燈效果

任務要求

 編寫程式控制實驗板上的LED1和LED2的亮、滅狀態,使它們以流水燈方式進行工作,即實驗板通電後兩個發光二極體以下述方式工作:

1) 通電後LED1和LED2都熄滅。 2) 延時一段時間後LED1點亮。 3) 延時一段時間後LED2點亮,此時LED1和LED2都處於點亮狀態。 4) 延時一段時間後LED1熄滅。 5) 延時一段時間後LED2熄滅,此時LED1和LED2都處於熄滅狀態。 6) 返回步驟二迴圈執行。

  1. CC2530的引腳
  • CC2530微控制器採用QFN40封裝,外觀上是一個邊長6mm的正方形,每個邊上有10個引腳,總共40個引腳。CC2530的引腳佈局如圖:
  1. CC2530的I/O引腳   CC2530總工具有21個數字I/O引腳,這些引腳可以組成3個8位埠,分別為埠0、埠1和埠2,通常表示為P0、P1和P2。其中,P0和P1是完全的8位埠,而P2僅有5位可以使用。21個I/O引腳具有以下特性,可以通過程式設計進行配置。
  • 可配置為通用I/O埠   通用I/O埠是指可以對外輸出邏輯值0(低電平)或1(高電平),也可以讀取從I/O引腳輸入的邏輯值(低電平為0,高電平為1)。可以通過程式設計來將I/O埠設定成輸出方式或輸入方式。
  • 可配置為外部裝置I/O埠   CC2530內部除了含有8051CPU核心外,還具有其他功能模組,如ADC、定時器和序列通訊模組,一般也稱這些模組為外設。可通過程式設計將I/O埠與這些外設建立起連線關係,以便這些外設與CC2530晶片外界電路進行資訊交換。需要注意的是,不能隨意指定某個I/O埠連線到某個外設,它們之間有一定的對應關係。
  • 輸入口具備3種輸入模式   當CC2530的I/O埠被配置成通用輸入埠時,埠的輸入模式有上拉、下拉和三態3種選擇,可通過程式設計進行選擇,能夠適應多種不同的輸入應用。
  • 具有外部中斷能力   當使用外部中斷時,I/O埠引腳可以作為外部中斷源的輸入口,這使得電路設計變得更加靈活。
  • I/O埠的相關暫存器   在微控制器內部,有一些具有特殊功能的儲存單元,這些儲存單元用來存放控制微控制器內部器件的命令、資料或是執行過程中的一些狀態資訊。這些暫存器統稱為“特殊功能暫存器(SFR)”,操作微控制器本質上就是對這些特殊功能暫存器進行讀寫操作,並且某些特殊功能暫存器可以位定址。例如,通過已配置好的P1_1口向外輸出高電平可以用以下程式碼實現:
P1 = 0x02; //0000 0010
或者
P1_1 = 1;

    P1是特殊功能暫存器的名字,P1_1是P1中一個位的名字。

  任務實施

(1)P1SEL暫存器的功能 在這裡插入圖片描述 (2)P1DIR暫存器的功能 在這裡插入圖片描述 P1SEL暫存器和P1DIR暫存器左側的7:0表示8個位元位 例如:我們的板子上面有四個led燈其中兩個燈分別連線P1_0和P1_1管腳,我想要使用這兩個燈就設定

P1SEL &= ~0x03; //設定P1_0和P1_1的功能為通用I/O口 P1DIR |= 0x03; //設定P1_0和P1_1的方向為輸出

	#include <ioCC2530.h>	//引用標頭檔案

	#define uchar unsigned char  
	#define uint unsigned int 

    #define led1 P1_0 		//巨集定義led1對應著P1_0管腳
    #define led2 P1_1
    
	void delay(uint t) //延時函式
	{
		uint i,j;
		while(t--)
			for(i = 100; i > 0; i--)
				for(j = 587; j > 0; j--);
	}

	void main()
	{
		P1SEL &= ~0x03; 
		P1DIR |= 0x03;
		led1 = led2 = 0; 	//LED1和LED2都熄滅
		while(1)
		{
			delay(5);		//延時0.5秒
			led1 = 1;		
			delay(5);
			led2 = 1;
			delay(5);
			led1 = 0;
			delay(5);
			led2 = 0; 
		}
	}

  編譯專案,將生成的程式燒寫到CC2530中,觀察實驗板上LED1和LED2的流水燈效果。

  • LED控制拓展練習 編寫程式控制實驗板上的LED1和LED2的亮、滅狀態,使它們以下述方式工作: 1)通電後LED1和LED2都點亮。 2)延時一段時間後LED2熄滅。 3)延時一段時間後LED1熄滅。 4)延時一段時間後LED1點亮。 5)延時一段時間後LED2點亮。 6)返回步驟2)迴圈執行

任務二  按鍵控制LED

任務要求

  任務要求使用SW1按鍵對LED1進行控制,首先需要知道SW1按鍵是如何連線到CC2530的,以及CC2530如何從I/O埠讀取按鍵的狀態。然後在編寫的控制程式碼中判斷按鍵的狀態,如果SW1按鍵按下,則讓LED1切換一次亮/滅狀態。

  • 使用微控制器的I/O埠經常會接觸到上拉、下拉和三態這幾個概念。 1、 上拉和下拉   上拉是指微控制器的引腳通過一個電阻連線到電源(高電平),當外界沒有訊號輸入到引腳時,引腳被上拉電阻固定在高電平(邏輯值1)。   下拉是指微控制器的引腳通過一個電阻連線到電源(低電平),當外界沒有訊號輸入到引腳時,引腳被下拉電阻固定在低電平(邏輯值0).   微控制器的I/O引腳通過引腳上電平的高、低來判斷輸入訊號是邏輯值1還是邏輯值0。接近電源電壓值的電平訊號被認為是邏輯值1,如3.0~3.3V的電壓。接近0V電壓的電平訊號被認為是邏輯值0,如0 ~0.3V的電壓。如果微控制器的I/O引腳沒有外接器件或者外接器件沒有為微控制器提供輸入訊號,那麼微控制器引腳上的電壓就變得不確定,可能在0 ~3.3V範圍內,微控制器就無法正確判斷引腳上的狀態。所以,在實際應用中需要使用上拉或下拉來將微控制器引腳上的電平固定到一個確定的值。 2、 三態   三態也叫高阻,即I/O引腳既沒有上拉到電源,也沒有下拉到地,呈現高阻值狀態。三態模式一般用於引腳的輸出功能,特別是在微控制器的因交接在多個裝置公用的通訊總線上時。當微控制器不傳送訊號時,採用三態工作模式可以保證不干擾其他裝置之間的通訊。三態模式用於輸入引腳時,引腳必須外接其他器件,此時由於不存在上拉或下拉電阻,還能降低微控制器的功耗。 3、 CC2530I/O埠的輸入模式   CC2530的I/O埠作為通用I/O功能使用時,可以配置成輸出方式或輸入方式。輸入方式用來從外界器件獲取輸入的電訊號,當CC2530的I/O埠被配置成通用輸入埠時,這些埠能夠提供“上拉” “下拉”和“三態”三種輸入模式,可通過程式設計進行設定,以滿足外接電路設計的要求。需要注意,P1_0和P1_1埠沒有上拉/下拉功能,只能工作在三態模式。   CC2530的I/O引腳如果沒有外接裝置,應當將這些引腳配置成帶上拉或下拉的通用輸入方式,也可以配置成通用輸出方式,不能讓引腳懸空。如果I/O引腳連線了外部裝置,且作為輸入方式時外部裝置能提供有效的電訊號,則可選取上拉、下拉和三態中的任何一種模式來使用。

  任務實施

在這裡插入圖片描述

#include <ioCC2530.h>

#define uchar unsigned char
#define uint unsigned int

#define d3 P1_0
#define sw1 P1_2			//巨集定義按鍵sw1

void delayms(uint t)			//按鍵消抖函式
{
	uint i;
	while(t--)
		for(i = 587; i > 0; i--);
}

void main()
{
	P1SEL &= ~0x05;			//設定P1埠埠第0、1管腳為通用I/O口
	P1DIR |= 0x01;			//設定P1_0管腳的方向為輸出
	P1DIR &= ~0x04;			//設定P1_2管腳的方向為輸入
	P1INP &= ~0x04;			//設定P1_2管腳為上拉或下拉
	d3 = 0;
	
	while(1)
	{
		if(sw1 == 0)			//判斷sw1為按下
		{
			delayms(5);
			if(sw1 == 0)
			{
				d3 = ~d3;				//led燈取反
				while(sw1 == 0);			//等待按鍵彈起
			}
		}
	}
}

編譯專案,將生成的程式燒寫到CC2530中,使用實驗板上的sw1按鍵控制led1的亮/滅。

  • 拓展練習1
  • 系統復位後d3和d4以流水燈的方式進行工作。
  • 當按下sw1按鍵時,流水燈暫停執行,保持按鍵按下時的狀態。
  • 當鬆開sw1按鍵後,流水燈繼續之前的執行。 提示:可以在延時函式中新增程式碼,使sw1按鍵按下時執行迴圈,等待sw1鬆開。
  • 拓展練習2
  • 系統復位後d3熄滅。
  • 按下一次sw1按鍵後,d3開始閃爍。
  • 再按下一次sw1按鍵後,d3停止閃爍並熄滅。 提示:可定義一個標誌位變數,用sw1按鍵來改變該標誌位變數的值。對標誌位變數的值進行判斷,當其為1時,d3能夠閃爍。當其為0時,d3停止閃爍並熄滅。