




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、2016-2017學年第二學期課程實驗報告課程名稱:無線傳感網絡實驗名稱: 基于ZigBee的數據采集與無線傳輸實驗姓名班級學號同組同學實驗課表現出勤、表現得分25%25實驗報告得分50%實驗總分操作結果得分25%25實驗目的了解ZigBee的工作原理和技術特點,利用CC2530芯片開發一個簡單的ZigBee組網通信實驗。實驗內容以小組為單位,利用CC2530芯片部署無線傳感網絡實驗,分別設計采集節點、匯聚節點的程序,采集節點采集溫度信息,并通過無線信道傳輸給匯聚節點。匯聚節點再將溫度數據通過串口傳輸給上位機(PC機)。要求自己設計通信協議,實現上位機對監控區域的定時和實時溫度數據采集。實驗過
2、程中遇到的問題以及如何解決的?(可以寫多條,是否認真填寫將影響實驗成績)在實驗過程中我遇到了1、 能接收后遇到很多的噪聲干擾并且不能接收自己發送的信息2、 接收到自己的信息后仍然有很多的噪聲干擾出現了很多的亂碼3、 接收自己的信息也被轉換成亂碼4、 遇到了選擇性接收上的技術問題5、 溫度的acsii碼轉換錯誤通過.的方式,我解決了這個問題。1、 修改了接收代碼并確認發送代碼沒毛病2、 嘗試修改信道3、 檢查到接收子程序有問題并修改了4、 老師建議我們使用選擇性接收5、 通過組員合作研究討論并上網查找解決沒有問題的情況下,是否有創新思路(或多做哪些工作)。好像并沒有實驗代碼如下:發送代碼:/*
3、文 件 名: main.c* 作 者: Andy* 修 訂: 2013-01-08* 版 本: 1.0* 描 述: 設置串口調試助手波特率:115200bps 8N1* 串口調試助手給CC2530發字符串時,開發板會返回接收到的字符串*/#include <ioCC2530.h>#include <string.h>#include <stdio.h>#include <stdlib.h> /#define DISABLE_ALL_INTERRUPTS() (IEN0 = IEN1 = IEN2 = 0x00)/三個char rf_rx_buf1
4、28;void rf_send( char *pbuf , int len);void rf_receive_isr();typedef unsigned char uchar;typedef unsigned int uint;#define UART0_RX 1#define UART0_TX 2#define SIZE 51char RxBuf;char UartState;uchar count;char RxDataSIZE; /存儲發送字符串void InitClock(void) CLKCONCMD &= 0x40; /設置系統時鐘源為 32MHZ晶振 while(CLK
5、CONSTA & 0x40); /等待晶振穩定 CLKCONCMD &= 0x47; /設置系統主時鐘頻率為 32MHZ/* 名 稱: InitSensor()* 功 能: 溫度傳感器初始化函數* 入口參數: 無* 出口參數: 無*/void InitSensor(void) /DISABLE_ALL_INTERRUPTS(); /關閉所有中斷 InitClock(); /設置系統主時鐘為 32M TR0=0x01; /設置為1來連接溫度傳感器到SOC_ADC ATEST=0x01; /使能溫度傳感 /* 名 稱: GetTemperature()* 功 能: 獲取溫度傳感器
6、AD 值* 入口參數: 無* 出口參數: 通過計算返回實際的溫度值*/float GetTemperature(void) uint value; ADCCON3 = (0x3E); /選擇1.25V為參考電壓;14位分辨率;對片內溫度傳感器采樣 ADCCON1 |= 0x30; /選擇ADC的啟動模式為手動 ADCCON1 |= 0x40; /啟動AD轉化 while(!(ADCCON1 & 0x80); /等待 AD 轉換完成 value = ADCL >> 4; /ADCL 寄存器低 2 位無效 value |= (uint)ADCH) << 4); re
7、turn (value-1367.5)/4.5-5; /根據 AD 值,計算出實際的溫度,芯片手冊有錯,溫度系數應該是4.5 / /進行溫度校正,這里減去5(不同芯片根據具體情況校正)/* 名 稱: DelayMS()* 功 能: 以毫秒為單位延時* 入口參數: msec 延時參數,值越大,延時越久* 出口參數: 無*/void DelayMS(uint msec) uint i,j; for (i=0; i<msec; i+) for (j=0; j<1070; j+);/* 名 稱: InitUart()* 功 能: 串口初始化函數* 入口參數: 無* 出口參數: 無*/voi
8、d InitUart(void) PERCFG = 0x00; /外設控制寄存器 USART 0的IO位置:0為P0口位置1 P0SEL = 0x0c; /P0_2,P0_3用作串口(外設功能) P2DIR &= 0xC0; /P0優先作為UART0 U0CSR |= 0x80; /設置為UART方式 U0GCR |= 11; U0BAUD |= 216; /波特率設為115200 UTX0IF = 0; /UART0 TX中斷標志初始置位0 U0CSR |= 0x40; /允許接收 IEN0 |= 0x84; /開總中斷允許接收中斷 /* 名 稱: UartSendString()*
9、 功 能: 串口發送函數* 入口參數: Data:發送緩沖區 len:發送長度* 出口參數: 無*/void UartSendString(char *Data, int len) uint i; for(i=0; i<len; i+) U0DBUF = *Data+; while(UTX0IF = 0); UTX0IF = 0; /以下是RF初始化和發送與接收void rf_init() TXPOWER = 0xD5; / 發射功率為1dBm /FRMCTRL0 |= (0x20 | 0x40); /* AUTO_ACK | AUTO_CRC */ CCACTRL0 = 0xF8; /
10、 推薦值 smartRF軟件生成 FRMFILT0 = 0x0c; / 靜止接收過濾,即接收所有數據包 FSCAL1 = 0x00; / 推薦值 smartRF軟件生成 TXFILTCFG = 0x09; AGCCTRL1 = 0x15; /AGCCTRL2 = 0xFE; /TXFILTCFG = 0x09; / 推薦值 smartRF軟件生成 FREQCTRL = 0x09; / 選擇通道11 RFIRQM0 |= (1<<6); / 使能RF數據包接收中斷 IEN2 |= (1<<0); / 使能RF中斷 RFST = 0xED; / 清除RF接收緩沖區 ISFL
11、USHRX RFST = 0xE3; / RF接收使能 ISRXON void rf_send( char *pbuf , int len) RFST = 0xE3; / RF接收使能 ISRXON while( FSMSTAT1 & ( 1<<1 ) | ( 1<<5 );/ 等待發送狀態不活躍 并且 沒有接收到SFD RFIRQM0 &= (1<<6); / 禁止接收數據包中斷 IEN2 &= (1<<0); / 清除RF全局中斷 RFST = 0xEE; / 清除發送緩沖區 ISFLUSHTX RFIRQF1 = (
12、1<<1); / 清除發送完成標志 / 填充緩沖區 填充過程需要增加2字節,CRC校驗自動填充 RFD = len + 2; for (int i = 0; i < len; i+) RFD = *pbuf+; RFST = 0xE9; / 發送數據包 ISTXON while (!(RFIRQF1 &(1<<1) ); / 等待發送完成 P0_0 = P0_0; RFIRQF1 = (1<<1); / 清除發送完成標志位 RFIRQM0 |= (1<<6); / RX接收中斷 IEN2 |= (1<<0);/* 程序入
13、口函數*/void main(void) /char i; / float AvgTemp; /char strTemp6; CLKCONCMD &= 0x40; /設置系統時鐘源為32MHZ晶振 while(CLKCONSTA & 0x40); /等待晶振穩定為32M CLKCONCMD &= 0x47; /設置系統主時鐘頻率為32MHZ InitUart(); /調用串口初始化函數 UartState = UART0_RX; /串口0默認處于接收模式 memset(RxData, 0, SIZE); InitSensor(); rf_init(); float x
14、= GetTemperature(); char a10; sprintf(a, "%g", x); char b15="A C1:" strcat(b,a); while(1) rf_send(b,20); DelayMS(20); /* if(UartState = UART0_TX) /發送狀態 U0CSR &= 0x40; /禁止接收 AvgTemp = 0; for (i=0; i<64; i+) AvgTemp += GetTemperature(); AvgTemp = AvgTemp/2; /每次累加后除 2 memset(
15、strTemp, 0, 6); sprintf(strTemp,"%.02fn", AvgTemp);/將浮點數轉成字符串 UartSendString(strTemp, 6); rf_send(strTemp , 5); DelayMS(1000); /延時 / UartSendString(RxData, count); /發送已記錄的字符串。 U0CSR |= 0x40; /允許接收 UartState = UART0_RX; /恢復到接收狀態 count = 0; /計數清0 memset(RxData, 0, SIZE); /清空接收緩沖區 */ 接收代碼:/*
16、* 文件名稱:UART(Receive INT)_Ex.c * 功 能:CC253x系列片上系統基礎實驗- UART(接收數據 中斷方式) * 描 述:本實驗使用CC253x系列片上系統的片內USART控制器,工作在UART模式下,通 * 過UART0接收數據,采用中斷方式。 * 實驗硬件: * 用USB電纜連接SK-SmartRF05EB上的USB接口與用戶PC的USB接口。 * * 作 者:POWER * 日 期:2010-04-18 */* 包含頭文件 */*/#include "ioCC2530.h" / CC2530的頭文件,包含對CC2530的寄存器、中斷向量等
17、的定義#include "LCD.h" / lcd驅動頭文件#include "stdio.h" / C語言標準輸入/輸出庫頭文件/*/* 定義枚舉類型 */*/enum SYSCLK_SRCXOSC_32MHz,RC_16MHz; / 定義系統時鐘源(主時鐘源)枚舉類型/*/* * 函數名稱:SystemClockSourceSelect * 功 能:選擇系統時鐘源(主時鐘源) * 入口參數:source * XOSC_32MHz 32MHz晶體振蕩器 * RC_16MHz 16MHz RC振蕩器 * 出口參數:無 * 返 回 值:無 */void S
18、ystemClockSourceSelect(enum SYSCLK_SRC source) unsigned char osc32k_bm = CLKCONCMD & 0x80; unsigned char _clkconcmd,_clkconsta; /* 系統時鐘源(主時鐘源)選擇16MHz RC振蕩器,定時器tick設置為16MHz,時鐘速度設置為16MHz CLKCONCMD.OSC32Kb7不改變 32KHz時鐘源選擇保持先前設置 CLKCONCMD.OSCb6 = 1 系統時鐘源(主時鐘源)選擇16MHz RC振蕩器 CLKCONCMD.TICKSPDb5.b3 = 00
19、1 定時器tick設置為16MHz CLKCONCMD.CLKSPDb2.b0 = 001 時鐘速度設置為16MHz */ if(source = RC_16MHz) /* CLKCONCMD.OSC32Kb7 */ CLKCONCMD = (osc32k_bm) | /* CLKCONCMD.OSCb6 = 1 */ (0x01 << 6) | /* CLKCONCMD.TICKSPDb5.b3 = 001 */ (0x01 << 3) | /* CLKCONCMD.CLKSPDb2.b0 = 001 */ (0x01 << 0); /* 系統時鐘源(主時
20、鐘源)選擇32MHz晶體振蕩器,定時器tick設置為32MHz,時鐘速度設置為32MHz CLKCONCMD.OSC32Kb7不改變 32KHz時鐘源選擇保持先前設置 CLKCONCMD.OSCb6 = 0 系統時鐘源(主時鐘源)選擇32MHz晶體振蕩器 CLKCONCMD.TICKSPDb5.b3 = 000 定時器tick設置為32MHz CLKCONCMD.CLKSPDb2.b0 = 000 時鐘速度設置為32MHz */ else if(source = XOSC_32MHz) CLKCONCMD = (osc32k_bm /*| (0x00<<6) | (0x00<
21、<3) | (0x00 << 0)*/); /* 等待所選擇的系統時鐘源(主時鐘源)穩定 */ _clkconcmd = CLKCONCMD; / 讀取時鐘控制寄存器CLKCONCMD do _clkconsta = CLKCONSTA; / 讀取時鐘狀態寄存器CLKCONSTA while(_clkconsta != _clkconcmd); / 直到CLKCONSTA寄存器的值與CLKCONCMD寄存 / 器的值一致,說明所選擇的系統時鐘源(主 / 時鐘源)已經穩定 /* * 函數名稱:InitUART0 * 功 能:UART0初始化 * P0.2 RX * P0.3 T
22、X * 波特率:57600 * 數據位:8 * 停止位:1 * 奇偶校驗:無 * 入口參數:無 * 出口參數:無 * 返 回 值:無 */void InitUART0(void) /* 片內外設引腳位置采用上電復位默認值,即PERCFG寄存器采用默認值 */ /* P0.2 RX P0.3 TX P0.4 CT P0.5 RT */ /* UART0相關引腳初始化 */ P0SEL |= (0x01 << 2) | (0x01 << 3); / P0.2和P0.3作為片內外設I/O /* P0口外設優先級采用上電復位默認值,即P2DIR寄存器采用默認值 */ /* 第一
23、優先級:USART0 第二優先級:USART1 第三優先級:Timer1 */ /* UART0波特率設置 */ /* 波特率:57600 當使用32MHz 晶體振蕩器作為系統時鐘時,要獲得57600波特率需要如下設置: UxBAUD.BAUD_M = 216 UxGCR.BAUD_E = 10 該設置誤差為0.03% */ U0BAUD = 216; U0GCR = 10; /* USART模式選擇 */ U0CSR |= 0x80; / UART模式 /* UART0配置 */ U0UCR |= 0x80; / 進行USART清除 /* 以下配置參數采用上電復位默認值: 硬件流控:無 奇偶
24、校驗位(第9位):奇校驗 第9位數據使能:否 奇偶校驗使能:否 停止位:1個 停止位電平:高電平 起始位電平:低電平 */ /* 用於發送的位順序采用上電復位默認值,即U0GCR寄存器采用上電復位默認值 */ /* LSB先發送 */ URX0IF = 0; / 清零UART0 RX中斷標志 U0CSR |= (0x01 << 6); / 使能接收器 URX0IE = 1; / 使能UART0 RX中斷char rf_rx_buf16;char pbuf16;/* * 函數名稱:UART0SendByte * 功 能:UART0發送一個字節 * 入口參數:c * 出口參數:無 *
25、返 回 值:無 */void UART0SendByte(unsigned char c) U0DBUF = c; / 將要發送的1字節數據寫入U0DBUF while (!UTX0IF); / 等待TX中斷標志,即U0DBUF就緒 UTX0IF = 0; / 清零TX中斷標志 /* * 函數名稱:UART0SendString * 功 能:UART0發送一個字符串 * 入口參數:無 * 出口參數:無 * 返 回 值:無 */void UART0SendString( char *str) while(1) if(*str = '0') break; / 遇到結束符,退出 UA
26、RT0SendByte(*str+); / 發送一字節 void rf_init() TXPOWER = 0xD5; / 發射功率為1dBm /FRMCTRL0 |= (0x20 | 0x40); /* AUTO_ACK | AUTO_CRC */ CCACTRL0 = 0xF8; / 推薦值 smartRF軟件生成 FRMFILT0 = 0x0c; / 靜止接收過濾,即接收所有數據包 FSCAL1 = 0x00; / 推薦值 smartRF軟件生成 TXFILTCFG = 0x09; AGCCTRL1 = 0x15; /AGCCTRL2 = 0xFE; /TXFILTCFG = 0x09;
27、/ 推薦值 smartRF軟件生成 FREQCTRL = 0x09; / 選擇通道11 RFIRQM0 |= (1<<6); / 使能RF數據包接收中斷 IEN2 |= (1<<0); / 使能RF中斷 RFST = 0xED; / 清除RF接收緩沖區 ISFLUSHRX RFST = 0xE3; / RF接收使能 ISRXONvoid rf_receive_isr() int rf_rx_len = 0; char r1 = 0; char crc_ok = 0; char *rf_rx_buf; rf_rx_len = RFD - 2; / 長度去除兩字節附加結果
28、rf_rx_len &= 0x7F; for (int i = 0; i < rf_rx_len; i+) rf_rx_bufi = RFD; / 連續讀取接收緩沖區內容 r0 = RFD - 73; / 讀取RSSI結果 crc_ok = RFD; / 讀取CRC校驗結果 BIT7 RFST = 0xED; / 清除接收緩沖區 if( crc_ok & 0x80 ) for(int i=0;i<=strlen(rf_rx_buf);i+) if(rf_rx_bufi=':') strcat(rf_rx_buf,"n"); UAR
29、T0SendString(rf_rx_buf); / / 串口發送 / UartSendString(r,1); / else / / UartSendString("CRC Error",9); / /unsigned long rcv_count = 0; / 累計接收到的字節計數/unsigned long rcv_charA_count = 0; / 累計接收到的字符'A'計數/* * 函數名稱:URX0_ISR * 功 能:UART0 RX中斷服務函數 * 入口參數:無 * 出口參數:無 * 返 回 值:無 */#pragma vector=RF_
30、VECTOR_interrupt void rf_isr(void) unsigned char e; P2_0 = P2_0; / LED1翻轉 提示作用 e = EA; EA = 0; / 接收到一個完整的數據包 if (RFIRQF0 & ( 1<<6 ) rf_receive_isr(); / 調用接收中斷處理函數 S1CON &=0x03; / 清除RF中斷標志 RFIRQF0 &= (1<<6); / 清除RF接收完成數據包中斷 EA = e;/* * 函數名稱:main * 功 能:main函數入口 * 入口參數:無 * 出口參數:
31、無 * 返 回 值:無 */void main(void) char s16; char rcv_count16; char rcv_charA_count16; SystemClockSourceSelect(XOSC_32MHz); / 選擇32MHz晶體振蕩器作為系統時鐘源(主時鐘源) HalLcdInit(); / LCD初始化 HalLcd_HW_Clear(); / 清屏 /* 在LCD上顯示相關信息 */ HalLcdWriteString("CC253x UART0 Recv", HAL_LCD_LINE_1); HalLcdWriteString(&quo
32、t;57600-8-1-N-N", HAL_LCD_LINE_3); HalLcd_HW_WaitUs(50000); InitUART0(); / UART0初始化 rf_init(); rf_receive_isr(); EA = 1; / 使能全局中斷 /* 在LCD上顯示從UART0累計接收到的字節數量以及字符'A'的數量 */ while(1) sprintf(s,"0x%08X",rcv_count); HalLcdWriteString(char *)s, HAL_LCD_LINE_4); / 累計接收(字節) sprintf(s,"0x%08X"
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房屋吊頂整改方案(3篇)
- 糧倉項目規劃方案(3篇)
- 動物眼科日常管理制度
- 公司廣告形象管理制度
- 農業公司賬目管理制度
- 輕鋼建筑搭建方案(3篇)
- 公司降本增效管理制度
- 創建品質工程管理制度
- 機務薪資調整方案(3篇)
- 外墻開荒保潔培訓方案(3篇)
- 小抄寫員課件
- 電氣焊(割)操作工安全生產責任制
- 小學初中語文銜接淺談(名校使用-強力推薦)課件
- 2021年昌吉市工會系統招聘筆試試題及答案解析
- (完整版)醫療質量、安全管理與持續改進記錄本
- 英國簽證房產證翻譯模板(匯編)
- 挖掘機裝載機定期檢驗報告
- 新版現代西班牙語第二冊課后答案
- 園林植物病蟲害防治技術操作質量標準
- 水泥土防滲墻施工方案
- 財務報銷制度與報銷流程圖
評論
0/150
提交評論