實驗一:LED發(fā)光二極管實驗
1.實驗環(huán)境
1)硬件:通用節(jié)點一個罕拂、USB仿真器颠焦、PC機法精;
2)軟件:IAR Embedded
Workbench for
MCS-51沛厨;
2.實驗內(nèi)容
1)熟悉Zigbee硬件模塊相關(guān)接口;
2)使用IAR開發(fā)環(huán)境設計程序像鸡,利用CC2530
的IO口進行LED發(fā)光二極管的亮滅操作顽照;
3.
實驗原理
1)硬件接口原理
2) 軟件設計
#include
#define
D_COUNT? 50? ? ?
//通用延時時間計數(shù)
void Delay(unsigned int n)
{
? unsigned
int t,tt;
for(tt=0;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狀態(tài)后需要一個延時來讓我們看到效果
? }
? P0 = 0;
? for(i=0;i<8;i++)
{
? ? P1 =
0x01<<i;? ? ?
//P1的第i位為1啊楚,其它位為0
? ? //P0_0 ^=1;? ? ?
//P0.0取反
? ? Delay(D_COUNT);? ?
//設置IO狀態(tài)后需要一個延時來讓我們看到效果
?
}
?
P1 = 0;
}
}
程序首先通過配置CC2530相關(guān)控制寄存器P0DIR、P1DIR來設置P0浑彰、P1工作于普通GPIO的輸出模式恭理。然后點亮所有燈,經(jīng)過一個長延時后再熄滅所有燈郭变,再經(jīng)過一個長延時后進入程序主循環(huán)颜价。在循環(huán)中首先依次將P0的某一位置1(從低到高,其他位為0诉濒,每次置位后在進行一個標準延時)周伦。然后對P0所有位清0,接著對P1口執(zhí)行以上類似操作未荒。P1口操作結(jié)束后清0专挪,再回到上面循環(huán)對P0口進行操作……
4. 實驗步驟
·使用USB 仿真器連接PC 機和通用節(jié)點模塊,模塊電源開關(guān)處于中間“OFF”檔片排,使用仿真器給模塊供電寨腔。
·啟動IAR 開發(fā)環(huán)境,打開“...\基礎(chǔ)傳感器實驗\1-5基礎(chǔ)例程\1-LED”目錄下的實驗工程率寡。
·在IAR 開發(fā)環(huán)境中編譯程序迫卢、點擊下載、調(diào)試程序勇劣。按“F5”使程序運行靖避。
·觀察現(xiàn)象潭枣,可以看到發(fā)光二極管輪流亮起。
·使用調(diào)試界面上的停止按鈕使程序停止幻捏,觀察現(xiàn)象是否停止盆犁。(現(xiàn)象停止)
·使用調(diào)試界面上的go按鈕(等同“F5”),觀察現(xiàn)象篡九。(二極管輪流亮起)
實驗二:串口收發(fā)數(shù)據(jù)實驗
1.實驗環(huán)境
1)硬件:通用節(jié)點或任意傳感器節(jié)點一個谐岁、USB仿真器、USB電纜榛臼、PC機伊佃;
2)軟件:IAR Embedded
Workbench for
MCS-51、串口調(diào)試工具沛善;
2.實驗內(nèi)容
1)熟悉Zigbee硬件模塊相關(guān)接口航揉;
2)使用IAR開發(fā)環(huán)境設計程序,利用CC2530
的串口0 進行數(shù)據(jù)收發(fā)通訊金刁;
3.實驗原理
1) 硬件接口原理
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);
? //發(fā)送字符串
uchar temp;? ? ? ? //存放接受的數(shù)據(jù)
char wch[] = "Welcome to test this program!\n";
void DelayXms(unsigned int Count)
{
unsigned int i;
unsigned int j;
for(i = 0; i < Count; i++)
{
? ? for( j=10000;j>0; j--);
}
}
void InitIO(void)
{
? ? SLEEPCMD
&= ~0X04;
? ? CLKCONCMD =
0X10;? ?
?
//32k和32M時鐘使用外部晶體帅涂,timer分頻8M
?
while(CLKCONSTA!=0X10);?
//等待時鐘切換
? ? SLEEPCMD = 0X04;
? ?
? ? P2DIR =0x00;? ?
? ?
? //高兩位零
若設則最高優(yōu)先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-256//BaudRate=(256+baud_m)/2^(28-buad_e)x32MHz
? ? UTX0IF =1;? ? //接收中斷標記
? ? U0CSR |= 0X40; //允許接收
? ? URX0IE =1;? ? //接收中斷使能
? ? EA =1;
? ?
? ?
? ?
? ?
? ?
? ?
//總中斷開關(guān)打開
}
void SendString(char*string,uint lenth)
{
? ? uint j;
? ? for (j=0;
j<lenth; j++)
? ? {
? ? ? U0DBUF
= *string++;?
?
//將要發(fā)送字符送入U0DBUF發(fā)送寄存器
? ?
while(UTX0IF == 0);?
?
//等待發(fā)送完成
? ? ? UTX0IF
= 0;? ?
? ?
? ? //清0標志位
? ? }
}
void main(void)
{
? ? InitIO();
? ? InitUart();
? ? DelayXms(10);
? ? led1=1;
? ? //點亮2個LED燈
? ? led2=1;
? SendString(wch,sizeof(wch));
? ?
? ? while(1)
? ? {
? ? ? ;
//進入無限循環(huán)等待中斷函數(shù)被處觸發(fā)
? ? }
}
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
? URX0IF = 0;?
? ?
//清中斷標志
temp = U0DBUF;
? ?
? U0DBUF = temp; //將收到的字符發(fā)送回去
while(UTX0IF == 0);? //等待發(fā)送 UTX0IF = 0;? //清發(fā)送標志
led1 = ~led1; //指示中斷活動
? led2 = ~led2;
}
DelayXms(unsigned int
Count):延時函數(shù)。?
InitIO():完成IO初始化功作尤蛮。InitUart():完成串口的初始化工作媳友。
SendString(char*string,uint legth):完成從串口發(fā)送字符串。
main():主函數(shù)产捞。完成各種初始化后進入循環(huán)等待串口接收中斷被觸法醇锚。
UART0_ISR():串口接收中斷函數(shù)。將收到的字符從串口發(fā)回坯临。同時改變LED燈的狀態(tài)焊唬,指示串口收到數(shù)據(jù)。
此實驗的是實驗現(xiàn)象:
發(fā)送文本框“字符串輸入框”中的內(nèi)容尿扯,點擊發(fā)送按鈕求晶⊙娴瘢可以看到相同的字符串又被返回
實驗三:按鍵控制實驗
1.實驗環(huán)境
硬件:傳感器節(jié)點一個衷笋、USB仿真器、PC機矩屁;
軟件:IAR Embedded Workbench for MCS-51辟宗;
2.實驗內(nèi)容
熟悉Zigbee硬件模塊相關(guān)接口;
使用IAR 開發(fā)環(huán)境設計程序吝秕,利用CC2530 的GPIO讀取按鍵值并相應對進行LED發(fā)光二極管的亮滅操作泊脐;
3.實驗原理
1)硬件接口原理
2)軟件設計
#include <ioCC2530.h>
#define D_COUNT
50?
? ? //標準延時周期計數(shù)
#define KEY_INPUT P2_0?
? //定義按鍵引腳
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);
? }
}
程序通過讀取P2.0的信息來獲得按鍵的狀態(tài)容客,同時對P1上的2個發(fā)光二極管進行操作秕铛。程序中的長延時是為了使得一定時間內(nèi)的按下只被識別為一次按下,短延時是為了濾掉可能的干擾信號缩挑。
4.實驗步驟
1)使用USB 仿真器連接PC
機和任意一個傳感器節(jié)點模塊但两,模塊電源開關(guān)處于“ON”檔,使用電池給模塊供電(如電池電量低插上USB電纜供置,可一邊充電一邊使用)谨湘。
2)啟動IAR 開發(fā)環(huán)境,打開“...\基礎(chǔ)傳感器實驗\1-5基礎(chǔ)例程\3-按鍵控制”目錄下的實驗工程芥丧。
3)在IAR 開發(fā)環(huán)境中編譯程序紧阔、點擊下載、調(diào)試程序续担。按“F5”使程序運行擅耽。
4)觀察現(xiàn)象:可以看到2個發(fā)光二極管都沒有亮起。
當按下模塊中間的“KEY”按鍵物遇,可觀察到發(fā)光二極管亮起秫筏。按住其中一個按鍵,在短時間內(nèi)松手挎挖,則認為是短按这敬,LED亮起又熄滅;如果一直按住這個按鍵不松手蕉朵,那么超過規(guī)定的長時間內(nèi)崔涂,則認為是長按,LED會持續(xù)亮一段時間始衅。