内容简介
下面用到的方法为basicrf封装好的,在网上下载好之后,之间include导入即可
通过ZIGBBE自组网,将俩个ZIGBBE盒进行连接,下面简称A和B
通信:A将采集到的数据通过无线发送给B,B接收后在发送给PC端模拟串口软件
代码分析
采集光照数据,将采集到的模拟量转成数字量,然后在解析数据量,转成可视化光照数据
void hal_adc_Init1(void) { APCFG |=1; P0SEL |= (1 << (0)); P0DIR &= ~(1 << (0)); }
uint16 get_adc1(void) { uint32 value; hal_adc_Init1(); // ADC初始化 ADCIF = 0; //清ADC 中断标志 ADCCON3 = (0x80 | 0x10 | 0x00); //采用基准电压AVDD5:3.3V,通道0,启动A/D转化 while ( !ADCIF ) { ; //等待A/D转化结束 } value = ADCH; value = value<< 8; value |= ADCL; // A/D值转化成电压值 // 0 表示 0V ,32 768 表示 3.3V // 电压值 = (value*3.3)/32768 (V) value = (value * 330); value = value >> 15; // 除以32 768 // 返回分辨率为0.01V的电压值 return (uint16)value; }
void Get_val() { uint16 sensor_val; sensor_val=get_adc1(); s[0]=sensor_val/100+'0'; s[1]=sensor_val/10%10+'0'; s[2]=sensor_val%10+'0'; s[3]=' '; }
人体红外串口器是一个已经封装好了的,在板子上为一个引脚采集数据,如果检测到有人返回1,无人返回0
#define DATA_PIN P0_4 //定义P0_4口为传感器的输入端
int Judge(){ if(DATA_PIN == 1) { return 1; } return 0; }
此方法为发送数据通过无线方法
第一个参数为发送地址
第二个参数为发送数据
第三个为发送数据长度
basicRfSendPacket(SEND_ADDR,pdata,16);
此方法为判断是否接收到新的数据
basicRfPacketIsReady()
此方法为接收来自A的数据
basicRfReceive(rxbufdat,128,NULL);
此方法为将数据发送给串口
halUartWrite(rxbufdat,20);
全部代码
#include "hal_defs.h" #include "hal_cc8051.h" #include "hal_int.h" #include "hal_mcu.h" #include "hal_board.h" #include "hal_led.h" #include "hal_rf.h" #include "basic_rf.h" #include "hal_uart.h" #include "sensor_drv/sensor.h" #include <stdio.h> #include <string.h> #include <stdarg.h> /*****点对点通讯地址设置******/ #define RF_CHANNEL 17 // 频道 11~26 #define PAN_ID 0x1826 //网络id //#define MY_ADDR 0x2222 //本机模块地址 //#define SEND_ADDR 0x1111 //发送地址 #define MY_ADDR 0x1111 //本机模块地址 #define SEND_ADDR 0x2222 //发送地址 #define DHT11_DATA_IN st(P1DIR &= ~(DHT11_DAT_BV);) #define DHT11_DATA_OUT st(P1DIR |= DHT11_DAT_BV;) #define DHT11_DATA P1_7 #define DHT11_DAT_BV BV(7) /**************************************************/ static basicRfCfg_t basicRfConfig; // 无线RF初始化 void ConfigRf_Init(void) { basicRfConfig.panId = PAN_ID; basicRfConfig.channel = RF_CHANNEL; basicRfConfig.myAddr = MY_ADDR; basicRfConfig.ackRequest = TRUE; while(basicRfInit(&basicRfConfig) == FAILED); basicRfReceiveOn(); } #define D3 P1_0 #define D4 P1_5 #define D5 P1_3 #define D6 P1_4 #define DATA_PIN P0_4 //定义P0_4口为传感器的输入端 uint8 buff[10],rxbuf[10],rxbufdat[16]; char Txdata[1]; char s[6];//定义一个数组的大小为6 char TipsString[10]; void hal_adc_Init1(void) { APCFG |=1; P0SEL |= (1 << (0)); P0DIR &= ~(1 << (0)); } uint16 get_adc1(void) { uint32 value; hal_adc_Init1(); // ADC初始化 ADCIF = 0; //清ADC 中断标志 ADCCON3 = (0x80 | 0x10 | 0x00); //采用基准电压AVDD5:3.3V,通道0,启动A/D转化 while ( !ADCIF ) { ; //等待A/D转化结束 } value = ADCH; value = value<< 8; value |= ADCL; // A/D值转化成电压值 // 0 表示 0V ,32 768 表示 3.3V // 电压值 = (value*3.3)/32768 (V) value = (value * 330); value = value >> 15; // 除以32 768 // 返回分辨率为0.01V的电压值 return (uint16)value; } void Get_val() { uint16 sensor_val; sensor_val=get_adc1(); s[0]=sensor_val/100+'0'; s[1]=sensor_val/10%10+'0'; s[2]=sensor_val%10+'0'; s[3]=' '; } int Judge(){ if(DATA_PIN == 1) { return 1; } return 0; } uint8 pdata[16] = {0}; extern uint8 DHTStr[4]; extern void Read_DHT11(void); /********************MAIN************************/ void main(void) { //波特率115200 halBoardInit();//选手不得在此函数内添加代码 ConfigRf_Init();//选手不得在此函数内添加代码 P1SEL&=~0x39; P1DIR|=0x39; D3=D5=D6=0; D4=0; uint16 count = 0; uint16 sensor_val; int FlagStatus = 0;//需要手动更改,以此来改变节点A的状态 while(1) { if(FlagStatus == 1) { //接收来自串口的数据 /************温湿度数据***************/ Read_DHT11(); pdata[0] = (char)(DHTStr[0]/10)+0x30; pdata[1] = (char)(DHTStr[1]%10)+0x30; pdata[2] = '-'; pdata[3] = (char)(DHTStr[2]/10)+0x30; pdata[4] = (char)(DHTStr[3]%10)+0x30; pdata[5] = ' '; /************光照加人体***************/ sensor_val=get_adc1(); pdata[6]=sensor_val/100+'0'; pdata[7]=sensor_val/10%10+'0'; pdata[8]=sensor_val%10+'0'; pdata[9]=' '; pdata[10] = '-'; pdata[11] = ' '; if(Judge() == 1){ pdata[12] = 'y'; pdata[13] = 'e'; pdata[14] = 's'; pdata[15] = '\n'; }else{ pdata[12] = 'n'; pdata[13] = 'o'; pdata[14] = 't'; pdata[15] = '\n'; } basicRfSendPacket(SEND_ADDR,pdata,16); } else if(FlagStatus == 0) { if(basicRfPacketIsReady()){ halMcuWaitMs(1000); basicRfReceive(rxbufdat,128,NULL); halUartWrite(rxbufdat,20); } } } halMcuWaitMs(1000); }
全部头文件
|---common | |---hal_cc8051.h --- MCU 输入输出宏定义 | |---hal_defs.h --- 通用定义 | |---hal_mcu.c --- MCU函数库 | |---hal_mcu.h --- MCU函数库定义 | |---hal_clock.c --- 函数库 | |---hal_clock.h --- MCU函数库定义 | |---hal_digio.c --- 输入输出中断函数库 | |---hal_digio.h --- 输入输出中断函数库定义 | |---hal_adc.c --- ADC函数库 | |---hal_adc.h --- ADC函数库定义 | |---hal_int.c --- 中断函数库 | |---hal_int.h --- 中断函数库定义 | |---hal_rf.c --- 无线函数库 | |---hal_rf.h --- 无线函数库定义 | |---hal_rf_security.c --- 无线加密函数库 | |---hal_rf_security.h --- 无线加密函数库定义 | |---hal_rf_util.c --- 无线通用函数库 | |---hal_rf_util.h --- 无线通用函数库定义 | |---hal_timer_32k.c --- 32K定时器函数库 | \---hal_timer_32k.h --- 32K定时器函数库定义 | |---basicrf | |---basic_rf.c --- 基本无线函数库 | |---basic_rf.h --- 基本无线函数库定义 | |---basic_rf_security.c --- 基本无线加密函数库 | \---basic_rf_security.h --- 基本无线加密函数库定义 | \---utils | |---util.c --- 工具函数库 | \---util.h --- 工具函数库定义 | \---board | |---hal_board .c --- ZIGBEE模块上的资源初始化函数 | |---hal_board .h --- ZIGBEE模块上的资源初始化函数库的定义 | |---hal_led.c --- ZIGBEE模块上关于LED的函数 | |---hal_led.h --- ZIGBEE模块上关于LED的函数库的定义 | \--- module | |--- dma_ad590.c --- 模拟温度传感器函数库 | |--- dma_ad590.h --- 模拟温度传感器函数库的定义 | |--- dma_bma.c --- 重力传感器函数库 | |--- dma_bma.h --- 重力传感器函数库的定义 | |--- dma_dc.c --- 直流电机函数库 | |--- dma_dc.h --- 直流电机函数库的定义 | |--- dma_eeprom.c --- eeprom函数库 | |--- dma_eeprom.h --- eeprom函数库的定义 | |--- dma_imc.c --- 人体传感器函数库 | |--- dma_imc.h --- 人体传感器函数库的定义 | |--- dma_m4.c --- 光敏/光电传感器函数库 | |--- dma_m4.h --- 光敏/光电传感器函数库的定义 | |--- dma_tc72.c --- 数字温度传感器函数库 | |--- dma_tc72.h --- 数字温度传感器函数库的定义 | |--- dma_tgs.c --- 酒精传感器函数库 | |--- dma_tgs.h --- 酒精传感器函数库的定义 | |--- dma_sht.c --- 温湿度传感器函数库 | |--- dma_sht.h --- 温湿度传感器函数库的定义 | |--- dma_itg.c --- 陀螺仪传感器函数库 | |--- dma_itg.h --- 陀螺仪传感器函数库的定义 | |--- dma_kr.c --- 可燃气体传感器函数库 | |--- dma_kr.h --- 可燃气体传感器函数库的定义 | |--- dma_tgs2602.c --- 气体质量传感器函数库 | |--- dma_tgs2602.h --- 气体质量传感器函数库的定义