無線傳感網(wǎng)技術(shù)及應(yīng)用 課件 項(xiàng)目22 Z-Stack協(xié)議棧按鍵控制_第1頁
無線傳感網(wǎng)技術(shù)及應(yīng)用 課件 項(xiàng)目22 Z-Stack協(xié)議棧按鍵控制_第2頁
無線傳感網(wǎng)技術(shù)及應(yīng)用 課件 項(xiàng)目22 Z-Stack協(xié)議棧按鍵控制_第3頁
無線傳感網(wǎng)技術(shù)及應(yīng)用 課件 項(xiàng)目22 Z-Stack協(xié)議棧按鍵控制_第4頁
無線傳感網(wǎng)技術(shù)及應(yīng)用 課件 項(xiàng)目22 Z-Stack協(xié)議棧按鍵控制_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

項(xiàng)目二十二

Z-Stack協(xié)議棧按鍵控制01項(xiàng)目導(dǎo)入項(xiàng)目導(dǎo)入

物聯(lián)網(wǎng)設(shè)備在使用過程中常用到手動控制功能,如按不同按鍵遠(yuǎn)程控制其他多個設(shè)備的打開或關(guān)閉。本項(xiàng)目通過在協(xié)調(diào)器上按不同按鍵,控制多個終端模塊IO口的開啟或關(guān)閉,讓大家了解Z-Stack協(xié)議棧下按鍵控制技術(shù)的工作原理、代碼編寫、程序燒錄、程序調(diào)試的整個過程,并通過實(shí)驗(yàn)結(jié)果加以驗(yàn)證。02項(xiàng)目分析項(xiàng)目分析

本項(xiàng)目需要1個協(xié)調(diào)器模塊和1個終端節(jié)點(diǎn)模塊。由協(xié)調(diào)器模塊的按鍵控制終端節(jié)點(diǎn)IO口的輸出,完成手動遠(yuǎn)程控制終端節(jié)點(diǎn)外接的設(shè)備打開或關(guān)閉。如果協(xié)調(diào)器上有多個按鍵,也可以修改代碼實(shí)現(xiàn)多個設(shè)備的遠(yuǎn)程控制。后續(xù)課程中我們會采用在用戶手機(jī)上通過云平臺遠(yuǎn)程控制這些網(wǎng)絡(luò)設(shè)備,從而實(shí)時了解這些設(shè)備運(yùn)行狀況,并發(fā)送相關(guān)指令控制相關(guān)設(shè)備的運(yùn)行。【項(xiàng)目要求】1.用Z-Stack協(xié)議棧實(shí)現(xiàn)協(xié)調(diào)器端的按鍵參數(shù)采集。2.用Z-Stack協(xié)議棧實(shí)現(xiàn)按鍵數(shù)據(jù)傳輸。3.Z-Stack協(xié)議棧下實(shí)現(xiàn)終端節(jié)點(diǎn)接收到的按鍵數(shù)據(jù)控制設(shè)備。03項(xiàng)目目標(biāo)項(xiàng)目目標(biāo)學(xué)會使用Z-Stack協(xié)議棧下的終端節(jié)點(diǎn)所接設(shè)備的控制方法。學(xué)會Z-Stack協(xié)議棧下的下的按鍵參數(shù)采集代碼的編寫。學(xué)會使用Z-Stack協(xié)議棧下的按鍵數(shù)據(jù)無線傳輸。熟悉Z-Stack協(xié)議棧下的按鍵參數(shù)設(shè)置。04知識儲備

要完成這個項(xiàng)目的設(shè)計,我們首先要了解HAL目錄下主板、按鍵、LCD、LED、uart串口等硬件設(shè)備的中斷設(shè)置概念,掌握按鍵中斷方式和查詢方式的設(shè)置方法、調(diào)用方法和代碼的編寫。4.1按鍵初始化1.按鍵的定義:在文件hal_board_cfg.h中默認(rèn)定義兩個按鍵PUSH1和PUSH2。/*S1*/#definePUSH1_BVBV(0)#definePUSH1_SBITP0_1//定義PUSH1按鍵為P0_1腳/*JoystickCenterPress*/#definePUSH2_BVBV(0)#definePUSH2_SBITP2_0//定義PUSH2按鍵為P2_0腳#definePUSH2_POLARITYACTIVE_HIGH//定義PUSH1初始為高電平4.2按鍵初始化

系統(tǒng)啟動過程中主程序main()調(diào)用OnBoard.c文件中的InitBoard(OB_READY)函數(shù)。voidInitBoard(uint8level){if(level==OB_COLD){

osal_int_disable(INTS_ALL);}else//如果不是OB_COLD狀態(tài){

HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE,OnBoard_KeyCallback);}}

HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE,OnBoard_KeyCallback),//其意義為禁用按鍵中斷

OnBoard_KeyCallback為中斷的回調(diào)函數(shù)。4.3系統(tǒng)按鍵初始化1.操作系統(tǒng)在hal_key.c文件中定義按鍵SW_6的端口和需要設(shè)置的寄存器。/*SW_6isatP0.1*/#defineHAL_KEY_SW_6_PORTP0//P0端口#defineHAL_KEY_SW_6_BITBV(1)//P0.1引腳#defineHAL_KEY_SW_6_SELP0SEL//P0端口功能寄存器#defineHAL_KEY_SW_6_DIRP0DIR//P0端口方向寄存器/*SW_6interrupts*/#defineHAL_KEY_SW_6_EDGEBITBV(0)#defineHAL_KEY_SW_6_EDGEHAL_KEY_FALLING_EDGE//下降沿觸發(fā)中斷#defineHAL_KEY_SW_6_IENIEN1//中斷屏蔽寄存器#defineHAL_KEY_SW_6_IENBITBV(5)//

IEN1的第5位#defineHAL_KEY_SW_6_ICTLP0IEN//端口中斷允許寄存器#defineHAL_KEY_SW_6_ICTLBITBV(1)//位中斷允許寄存器#defineHAL_KEY_SW_6_PXIFGP0IFG//中斷標(biāo)志寄存器系統(tǒng)按鍵初始化2.在hal_key.c文件的HalKeyInit()函數(shù)中設(shè)置按鍵I/O口的模式和方向寄存器。voidHalKeyInit(void){

HAL_KEY_SW_6_SEL&=~(HAL_KEY_SW_6_BIT);//設(shè)置SW6引腳功能為普通IO口

HAL_KEY_SW_6_DIR&=~(HAL_KEY_SW_6_BIT);//設(shè)置SW6引腳方向?yàn)檩斎?/p>

……}3.在hal_key.c文件的HalKeyConfig()函數(shù)中設(shè)置按鍵中斷寄存器。本例未使用中斷,因此無需設(shè)置相關(guān)寄存器。voidHalKeyConfig(boolinterruptEnable,halKeyCBack_tcback){

if(Hal_KeyIntEnable)//如果開啟了中斷模式{……

PICTL|=HAL_KEY_SW_6_EDGEBIT;//設(shè)置下降沿觸發(fā)

HAL_KEY_SW_6_ICTL|=HAL_KEY_SW_6_ICTLBIT;//P0IEN寄存器相關(guān)位置1系統(tǒng)按鍵初始化HAL_KEY_SW_6_IEN|=HAL_KEY_SW_6_IENBIT;//IEN1寄存器相關(guān)位置1HAL_KEY_SW_6_PXIFG=~(HAL_KEY_SW_6_BIT);//P0IFG寄存器相關(guān)位置1……}else//如果沒有開啟中斷{HAL_KEY_SW_6_ICTL&=~(HAL_KEY_SW_6_ICTLBIT);//P0IEN寄存器相關(guān)位清0HAL_KEY_SW_6_IEN|=HAL_KEY_SW_6_IENBIT;//IEN1寄存器相關(guān)位置1HAL_KEY_SW_6_PXIFG=~(HAL_KEY_SW_6_BIT);//P0IFG寄存器相關(guān)位置1……}4.4輪詢按鍵事件

按鍵初始化設(shè)置函數(shù)HalKeyConfig()調(diào)用了設(shè)置定時器函數(shù)osal_start_timerEx(Hal_TaskID,HAL_KEY_EVENT,HAL_KEY_POLLING_VALUE)。其含義為:每經(jīng)過HAL_KEY_POLLING_VALUE時間(默認(rèn)100ms),則啟動一個硬件處理任務(wù)Hal_TaskID,任務(wù)內(nèi)容為HAL_KEY_EVENT(按鍵事件),簡單說來就是定時查詢按鍵有無動作。如果開啟了按鍵中斷,則關(guān)閉這個定時器,改由中斷觸發(fā)按鍵事件。當(dāng)發(fā)生按鍵事件時,硬件事件處理函數(shù)Hal_ProcessEvent()首先調(diào)用HalKeyPoll()函數(shù)判斷是哪個按鍵動作,如果PUSH1動作則將PUSH1與系統(tǒng)按鍵HAL_KEY_SW_6綁定。輪詢按鍵事件voidHalKeyPoll(void){if(HAL_PUSH_BUTTON1())

{

keys|=HAL_KEY_SW_6;

}}其次回調(diào)函數(shù)OnBoard_KeyCallback()調(diào)用osal_msg_send(),發(fā)送按鍵狀態(tài)消息到系統(tǒng)任務(wù),由系統(tǒng)對此按鍵任務(wù)進(jìn)行處理。4.5按鍵時發(fā)送廣播包1.在SampleApp.c文件的SampleApp_HandleKeys()函數(shù)中添加發(fā)送廣播包的函數(shù)。voidSampleApp_HandleKeys(uint8shift,uint8keys){if(keys&HAL_KEY_SW_6){if(keyCounter<3)//keyCounter有1和2兩種狀態(tài)

SampleApp_SendPeriodicMessage1(keyCounter++);else{keyCounter=1;SampleApp_SendPeriodicMessage1(keyCounter++);}}在發(fā)送的廣播包中發(fā)送控制編號voidSampleApp_SendPeriodicMessage1(uint8index){if(AF_DataRequest(&SampleApp_Periodic_DstAddr,&SampleApp_epDesc,

SAMPLEAPP_PERIODIC_CLUSTERID,

1,

&index,

&SampleApp_TransID,

AF_DISCV_ROUTE,

AF_DEFAULT_RADIUS)==afStatus_SUCCESS)

{

if(index==1)

HalLedSet(HAL_LED_1,HAL_LED_MODE_OFF);//狀態(tài)1時燈滅

else

HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);//狀態(tài)2時燈亮……

}}4.6處理接收到的控制數(shù)據(jù)

在SampleApp.c文件下的SampleApp_MessageMSGCB()函數(shù)負(fù)責(zé)接收到數(shù)據(jù)的處理。終端和路由節(jié)點(diǎn)接收到廣播包后,采用接收到的燈光控制數(shù)據(jù)控制LED1的狀態(tài)。如果帶有液晶顯示功能,也可將數(shù)據(jù)顯示到液晶屏上。voidSampleApp_MessageMSGCB(afIncomingMSGPacket_t*pkt){……caseSAMPLEAPP_PERIODIC_CLUSTERID://收到廣播數(shù)據(jù)data=(uint8)pkt->cmd.Data[0];if(data=='A')

HalLedBlink(HAL_LED_2,4,50,200);//收到終端發(fā)送來的“A1”包時LED2燈閃4次elseif(data==1)

HalLedSet(HAL_LED_1,HAL_LED_MODE_OFF);//收到狀態(tài)包“1”時LED1燈滅else

HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);//收到狀態(tài)包“2”時LED1燈亮break;……}05項(xiàng)目實(shí)施實(shí)施過程(1)在hal_board_cfg.h修改按鍵端口/*S1*/#definePUSH1_BVBV(0)#definePUSH1_SBITP0_0//設(shè)置按鍵1為P0_0/*S2*/#definePUSH2_BVBV(0)#definePUSH2_SBITP2_0//設(shè)置按鍵2為P2_0#definePUSH2_POLARITYACTIVE_HIGH實(shí)施過程(2)OnBoard.c中禁止按鍵中斷:voidInitBoard(uint8level)HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE,OnBoard_KeyCallback);(3)在hal_key.c文件中設(shè)置寄存器/*SW_6isatP0.0*/#defineHAL_KEY_SW_6_PORTP0#defineHAL_KEY_SW_6_BITBV(0)#defineHAL_KEY_SW_6_SELP0SEL#defineHAL_KEY_SW_6_DIRP0DIR實(shí)施過程(4)在hal_key.c文件中HalKeyInit(void)

函數(shù)中設(shè)置寄存器

HAL_KEY_SW_6_SEL&=~(HAL_KEY_SW_6_BIT);

HAL_KEY_SW_6_DIR&=~(HAL_KEY_SW_6_BIT);

(5)在hal_key.c文件的HalKeyConfig()函數(shù)中屏蔽中斷。因未開啟中斷,此步可省略。

HAL_KEY_SW_1_ICTL&=~HAL_KEY_SW_1_ICTLBIT;HAL_KEY_SW_1_IEN&=~HAL_KEY_SW_1_IENBIT;HAL_KEY_SW_1_PXIFG=~(HAL_KEY_SW_1_BIT);HAL_KEY_SW_1_PXIFG=~(HAL_KEY_SW_1_BIT);(6)在hal_key.c文件的HalKeyPoll()函數(shù)中綁定硬件按鍵BUTTON1與系統(tǒng)按鍵SW6if(HAL_PUSH_BU

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論