LED發光二極體,串列埠收發資料、按鍵控制

邇。發表於2018-11-16

實驗一:LED發光二極體實驗

一、實驗環境

硬體:通用節點一個、USB模擬器、PC機;
軟體:IAR Embedded Workbench for MCS-51;

二、 實驗內容

1) 熟悉Zigbee硬體模組相關介面;

2) 使用IAR 開發環境設計程式,利用CC2530 的IO口進行LED發光二極體的亮滅操作;

三、實驗原理

1) 硬體介面原理

在CC2530中,我們總共有3個可用的GPIO介面:P0、P1和P2。其中P0和P1的全部8位都有對應的引腳,而P2只有0-4幾個引腳可用。這裡我們主要對P0和P1共16個引腳進行操作,每個引腳都連線到一個發光二極體的驅動端,這樣通過控制P0和P1的每一位,我們可以控制所有的16個發光二極體的亮滅。

2) 軟體設計

#include <ioCC2530.h>

#define D_COUNT    50        //通用延時時間計數

/***************************************

延時函式,n為延時週期計數

***************************************/

void Delay(unsigned int n)

{

unsigned  int t,tt;

for(tt=0;tt<n;tt++)

for(t=0;t<1000;t++);

}

/***************************************

程式主函式

***************************************/

void main( void )

{

 unsigned  int i;

 P0DIR  = 0xff;          //設定P0口全部為輸出

 P1DIR  = 0xff;          //設定P1口全部為輸出

 P0 = 0xff;              //點亮所有燈

 P1 = 0xff;

 Delay(D_COUNT);Delay(D_COUNT);Delay(D_COUNT);

 P0 = 0;                 //熄滅所有燈

 P1 = 0;

 Delay(D_COUNT);Delay(D_COUNT);Delay(D_COUNT);

 while(1)

   {   
      for(i=0;i<8;i++)

        {

 	   P0 = 0x01<<i;         //P0的第i位為1,其它位為0

 	   //P1_0 ^= 1;        //P1.0取反
  
           Delay(D_COUNT);       //設定IO狀態後需要一個延時來讓我們看到效果

         }

       P0 = 0;

      for(i=0;i<8;i++)

        {

    	  P1 = 0x01<<i;        //P1的第i位為1,其它位為0

 	  //P0_0 ^= 1;       //P0.0取反

  	  Delay(D_COUNT);     //設定IO狀態後需要一個延時來讓我們看到效果

         }

       P1 = 0;

   }

}

DelayXms(unsigned int Count):延時函式。
main():主函式
main()函式中的程式碼,首先通過配置CC2530相關控制暫存器P0DIR、P1DIR來設定P0、P1工作於普通GPIO的輸出模式。然後點亮所有燈,經過一個長延時後再熄滅所有燈,再經過一個長延時後進入程式主迴圈。在迴圈中首先依次將P0的某一位置1(從低到高,其他位為0,每次置位後在進行一個標準延時)。然後對P0所有位清0,接著對P1口執行以上類似操作。P1口操作結束後清0,再回到上面迴圈對P0口進行操作
由以上分析我們可以得到以下程式流程圖:

在這裡插入圖片描述

四、實驗步驟

l 使用USB 模擬器連線PC 機和通用節點模組,不接電源,直接使用模擬器給模組供電。

l 啟動IAR 開發環境,將上述軟體程式匯入

l 在IAR 開發環境中編譯程式、點選下載、除錯程式。按“F5”使程式執行。

l 觀察現象,可以看到發光二極體輪流亮起。

l 改變延時時間,觀察變化

l 使用除錯介面上的停止按鈕使程式停止,觀察現象是否停止。

l 使用除錯介面上的go按鈕(等同“F5”),觀察現象。

實驗二:串列埠收發資料實驗

一、 實驗環境

1) 硬體:通用節點或任意感測器節點一個、USB模擬器、USB電纜、PC機;

2) 軟體:IAR Embedded Workbench for MCS-51、串列埠除錯工具;

二、實驗內容

1) 熟悉Zigbee硬體模組相關介面;

2) 使用IAR 開發環境設計程式,利用CC2530 的串列埠0 進行資料收發通訊;

三、實驗原理

1) 硬體介面原理

在CC2530中,我們總共有2個可用的序列介面,這些序列介面可被配置為標準串列埠或者SPI介面。這個例程中我們只使用USART0,並且工作在UART標準串列埠模式下。由於每種設定都有2套可用的IO對映,這裡根據我們的硬體設定,我們應該使用其預設設定,UART0的TXD和RXT對應於P0_3和P0_2。

首先,我們要對晶片的時鐘操作有所瞭解,因為程式的啟動部分,需要先對晶片時鐘進行配置。其中CLKCONCMD控制暫存器,用來控制系統時鐘源,SLEEP 暫存器用來控制各種時鐘源的開關和狀態。PERCFG 暫存器為外設功能控制暫存器,用來控制外設功能模式。U0CSR、U0GCR、U0BUF、U0BAUD 等位串列埠相關暫存器。

2) 軟體設計

#include "ioCC2530.h"

#include <string.h>

#define uint unsigned int

#define uchar unsigned char

//定義控制燈的埠

#define led1 P1_0

#define led2 P1_1

void InitIO(void);                          //IO初始化

void InitUart(void);                        //串列埠初始化

void SendString(char*string,uint legth);    //傳送字串

uchar temp;               // 存放接受的資料

char wch[] = "Welcome to test this
program!\n";

/*****************************************************************************

	功能描述: 延時

	Count:    延時單位數量 

*****************************************************************************/

void DelayXms(unsigned int Count)

{

   unsigned int i;

   unsigned int j;

   for(i = 0; i< Count; i++)

   {

     for(j=10000; j>0; j--);

   }

}

/*****************************************************************************

	功能描述: IO初始化

*****************************************************************************/

void InitIO(void)

{

    SLEEPCMD
    &= ~0X04;

    CLKCONCMD = 0X10;           //32k和32M時鐘使用外部晶體,timer分頻8M

    while(CLKCONSTA!=0X10);     //等待時鐘切換

	SLEEPCMD = 0X04;    

        P2DIR = 0x00;             //高兩位零  若設則最高優先USART0

	P1DIR|= 0X03;              //P1.0 P1.1 LEDs 燈埠配置

        P0DIR|= 0X00;              //input

	PERCFG = 0x00;              //UART0 預設埠

        P1SEL = 0X00;

	P0SEL = 0X0c;               //P0<3:2>設定成外圍應用

}

/*****************************************************************************

	功能描述: 串列埠初始化

*****************************************************************************/

void InitUart(void)

{

    U0CSR |= 0x80;             //UART方式

    U0GCR = 11;                     //baud_e 波特率設為115200

    U0BAUD |= 216;             //baud_m = BaudRate*2^(28-buad_e)/32M-25

    //BaudRate=(256+baud_m)/2^(28-buad_e)x32MHz

    UTX0IF =1;                                 //接收中斷標記

    U0CSR |=0X40;             //允許接收

    URX0IE =1;                                 //接收中斷使能

    EA=1;                                     //總中斷開關開啟

}

/*****************************************************************************

	 功能描述: 串列埠傳送字串

	 string:   字串指標

	 lenth:  長度

*****************************************************************************/

void SendString(char*string,uint lenth)

{

 uint j;

	for (j=0;j<lenth; j++)

         {

 	     U0DBUF= *string++;         //將要傳送字元送入U0DBUF傳送暫存器
 
             while(UTX0IF == 0);         //等待傳送完成

	     UTX0IF= 0;                 //清0標誌位

	 }

}

/*****************************************************************************

	 功能描述:   
	 主函式 

*****************************************************************************/

void main(void)

 {

        InitIO();

        InitUart();

        DelayXms(10);


	led1=1;                         //點亮2個LED燈

	led2=1;

	SendString(wch,sizeof(wch));

	while(1)

	 {  
	      ;       //進入無限迴圈等待中斷函式被處觸發
		
         }

 }

/*****************************************************************************

	  功能描述: 串列埠中斷函式

*****************************************************************************/

#pragma vector = URX0_VECTOR__interrupt void
UART0_ISR(void)

{

    URX0IF= 0;                 //清中斷標誌

    temp = U0DBUF;

    U0DBUF = temp;                         //將收到的字元傳送回去

    while(UTX0IF == 0);                    //等待傳送

    UTX0IF = 0;                            //清傳送標誌

    led1 = ~led1;                          //指示中斷活動

    led2 = ~led2;

}

程式中主要有這幾個函式:

DelayXms(unsigned int Count):延時函式
main():主函式
InitIO():完成IO初始化功作
InitUart():完成串列埠的初始化工作
SendString(char*string,uint legth):完成從串列埠傳送字串。
ART0_ISR():串列埠接收中斷函式。

其中BAUD_M和BAUD_E為相關暫存器中的設定位。

這裡通過配置CC2530 處理器的串列埠相關控制暫存器來設定串列埠0 的工作模式為串列埠模式,波特率為115200,使用中斷方式接受串列埠資料並向串列埠輸出。

在這裡插入圖片描述

主函式和中斷函式的流程圖如下

在這裡插入圖片描述

四、實驗步驟

l 使用USB 模擬器連線PC 機和ZIGBEE模組。關閉電源,節點使用模擬器連線供電,將系統配套USB線(兩條)一端連線PC 機,一端連線ZIGBEE模組的MINI-USB介面上。

注意:如果使用通用節點執行本例程,請檢查板子上的“TXD”和“RXD”位置跳線帽是否已經插上

連線USB電纜時,需要安裝USB轉串列埠的驅動程式,同時啟動IAR 開發環境,匯入程式。

l 在IAR 開發環境中編譯程式、點選下載、除錯程式。按“F5”使程式執行。

l 如上圖所示,配置CC2530 處理器的串列埠相關控制暫存器,點選右下角的傳送資料按鈕,可以看到接受文字框中顯示接受到同樣的資料。

l 更換髮送文字框“字串輸入框”中的內容,點選傳送按鈕。可以看到相同的字串又被返回。
例程執行結果(按下復位鍵)
在這裡插入圖片描述

實驗三:按鍵控制實驗

一、 實驗環境

1) 硬體:感測器節點一個、USB模擬器、PC機;

2) 軟體:IAR Embedded Workbench for MCS-51;

二、 實驗內容

1) 熟悉Zigbee硬體模組相關介面;

2) 使用IAR 開發環境設計程式,利用CC2530 的GPIO讀取按鍵值並相應對進行LED發光二極體的亮滅操作;

三、實驗原理

1) 硬體介面原理

UserINT訊號連線的是晶片的P2.0引腳,在按鍵沒有被按下時(處於斷開狀態),經過電阻R9的上拉作用,UserINT訊號是處於高電平的,而當按鍵按下時,UserINT訊號直接和地相連,這樣處於低電平。在晶片內通過檢測P2.0口的輸出狀態就可以知道按鍵的狀態。電容C4在按鍵鬆開的時候起到對輸出訊號的緩衝作用,這樣可以過濾掉部分干擾訊號,使得輸出訊號較為平滑。

2) 軟體設計

#include <ioCC2530.h>

#define D_COUNT  50        //標準延時週期計數

#define KEY_INPUT P2_0      //定義按鍵引腳

/*****************************************************************************

 	 功能描述: 延時

	 Count:    延時單位數量 

*****************************************************************************/

void Delay(unsigned int n)

{

  unsigned int t,tt;

  for(tt=0;tt<n;tt++)

 	 for(t=0;t<1000;t++);

}

/*****************************************************************************

	 功能描述:  主函式 

*****************************************************************************/

void main( void )

{

  unsigned int i;

  P0DIR  = 0x00;          //P0口全部為輸入

  P1DIR  = 0x03;          //P1口低2位輸出,其他輸入

  P1 = 0;

  Delay(D_COUNT);Delay(D_COUNT);Delay(D_COUNT);

  while(1)

   {

     if(!KEY_INPUT)        //判斷按鍵是否按下

      {

         i++;

         P1 = i&0x03;          //P1低2位賦值為i的低2位

         Delay(100);           //延時,加長2次判斷間隔

       }


     Delay(10);

   }

}

DelayXms(unsigned int Count):延時函式。
main():主函式
程式通過讀取P2.0的資訊來獲得按鍵的狀態,同時對P1上的2個發光二極體進行操作。程式中的長延時是為了使得一定時間內的按下只被識別為一次按下,短延時是為了濾掉可能的干擾訊號。程式的流程圖如下。

在這裡插入圖片描述

四、實驗步驟

l 使用USB 模擬器連線PC 機和任意一個感測器節點模組,模組電源開關處於“ON”檔,使用電池給模組供電(如電池電量低插上USB電纜,可一邊充電一邊使用)。

l 啟動IAR 開發環境,匯入程式
l 在IAR 開發環境中編譯程式、點選下載、除錯程式。按“F5”使程式執行。

l 按下左下方按鈕,觀察現象,可以看到2個發光二極體都沒有亮起。
在這裡插入圖片描述
l 按下按下左下方按鈕,觀察2個發光二極體的狀態。

按第一次,按鍵呈現出01狀態
按第一次
按第二次,狀態變為10
按第二次
按第三次,狀態變為11

在這裡插入圖片描述
其原因是由於在晶片內通過檢測P2.0口的輸出狀態改變了從而按鍵的狀態

l 重複按鍵操作,嘗試長按或短按,觀察發光二極體狀態。修改程式中的延時數值後再重複上面操作,體會不同延時下的效果。

實驗結果發現,程式中的長延時只被識別為一次按下,短延時則沒有效果。這是因為程式中的長延時是為了使得一定時間內的按下只被識別為一次按下,短延時是為了濾掉可能的干擾訊號

相關文章