LED發光二極體,串列埠收發資料、按鍵控制
實驗一: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 重複按鍵操作,嘗試長按或短按,觀察發光二極體狀態。修改程式中的延時數值後再重複上面操作,體會不同延時下的效果。
實驗結果發現,程式中的長延時只被識別為一次按下,短延時則沒有效果。這是因為程式中的長延時是為了使得一定時間內的按下只被識別為一次按下,短延時是為了濾掉可能的干擾訊號
相關文章
- 串列埠收發UART(Verilog HDL)串列埠
- STM32應用DMA——串列埠收發不定長資料串列埠
- Uart進行的串列埠收發串列埠
- 基於Atmega8微控制器的串列埠收發程式串列埠
- ESP32 wifi 串列埠轉發資料 UART micropythonWiFi串列埠Python
- 串列埠資料抓取及串列埠通訊模擬串列埠
- 串列埠轉發閘道器實現工業裝置資料採集和遠端控制串列埠
- 串列埠屏開發曲線串列埠
- python讀取串列埠 資料Python串列埠
- QT串列埠助手(三):資料接收QT串列埠
- HaaS100按鍵及LED使用介紹
- QT串列埠助手(四):資料傳送QT串列埠
- 立創泰山派學習07--串列埠UART3的收發測試串列埠
- 微控制器學習(七)串列埠串列埠
- 串列埠通訊利器:SerialPortStream庫詳解,輕鬆實現C#串列埠開發串列埠C#
- 【資料庫】併發控制資料庫
- 收發資料的原理(上)
- 收發資料的原理(下)
- 03_QT上位機開發之串列埠助手QT串列埠
- 基於UDP協議的乙太網資料收發控制器UDP協議
- 51微控制器串列埠交通燈protues模擬交通燈串列埠控制系統交通燈管制東西南北管制串列埠
- STM32使用DMA傳送串列埠資料串列埠
- 0212-使用 dummy 收發資料
- 51微控制器程式框架之帶順序的組合按鍵觸發框架
- 【驅動】串列埠驅動分析(二)-tty core串列埠
- 串列埠通訊上位機資料傳輸協議串列埠協議
- unity3d透過串列埠接收Arduino資料Unity3D串列埠UI
- 極光財報:2020年Q2極光營收1.308億元 同比下降55%營收
- linux設定埠轉發(一鍵設定)Linux
- 串列埠blog串列埠
- 串列埠UART串列埠
- 二、zigbee裸機程式--按鍵
- 帶內串列埠 在串列埠中輸入命令串列埠
- Xamarin.Forms-手機串列埠除錯程式開發文件ORM串列埠除錯
- 迪文屏OS彙編程式碼開發-串列埠篇串列埠
- iOS —— 極光推送和極光IMiOS
- 全球電競有機發光二極體(OLED)顯示器皮膚出貨量和目標出貨量
- 串列埠伺服器和光纖交換機有什麼不同串列埠伺服器