2020-03-03 05:27:56 来源:范文大全收藏下载本文
无线传感网络 课程设计报告
姓名:胡韶辉 胡衎
2017
学号:139074377 139074376 班级:物131班 指导教师:卫琳娜
年1月1日
无线传感网络课程设计
实验
一、无线传感网络点对点通信实验
1.实验内容
此实验为验证实验,根据实验步骤进行实验,观察结果是否与预期相符
2.实验步骤
用IAR8.1打开路径:C:\Users\xs\Desktop\无线传感器网络课程设计\无线传感网实验资料201604\感知RF2-2530WSNV1.2\代码和例子程序\Light_Switch\IDE\Light_Switch\srf05_cc2530\Iar\Light_Switch.eww分别编译并下载至两个节点上,打开节点,左右键选择/,选择完成后按中间键确认,观察LED灯显示情况。 3.实验代码及分析
/* 功 能:查找字符在索引中的哪一个位置 */ /**************************************************************************************************/ static u16 lookforChar( u8 ch ) { uint16 i; for( i = 0; i
if( fontList[i] == ch )
return i; } return i; }
//查中文
static u16 lookforChar16( u16 ch ) { uint16 i,j; u16 temp16; for( i = 0; i
j = i*2;
temp16 = fontChar16List[j + 1];
temp16
temp16 |= fontChar16List[j];
if( temp16 == ch )
return i; } return i; }
/**************************************************************************************************/ /* 功 能:在指定位置输出8*8 */ /**************************************************************************************************/ static void LcdPutChar8( u8 x,u8 y,u8 ch ) { LcdBuf[y][x] = ch; } /**************************************************************************************************/ /* 功 能:在指定位置输出16*16 */ /**************************************************************************************************/
/*static void LcdPutChar16( u8 x,u8 y,u16 ch ) { LcdBuf[y][x] = (u8)ch;
//低前高后
LcdBuf[y+1][x] = (u8)(ch>>8); }
void LcdPutString8( u8 x,u8 y,u8 *ptr u8 len,u8 op ) {
u8 i,*tptr = ptr,xx = x,yy = y; u16 m; if( x > 95)
return ; if( y > 1)
return ; for( i = 0;i
m = lookforChar(*tptr ++);
if( m != FONTLISTCOUNT )
{
m = m * 8;
}
else
return;
xx += 8;
if( xx > 88 )
return; } } */
void LcdClearRam( void ) { u8 i; for( i = 0;i
LcdBuf[0][i] = 0; } for( i = 0;i
LcdBuf[1][i] = 0; } } void LcdClearScrean( void ) { LcdClearRam(); PutPic( (void *)LcdBuf ); }
void LcdPutString16_8( u8 x,u8 y,u8 *ptr,u8 len,u8 op ) { u8 i,j,*tptr = ptr,xx = x,yy = y; u16 m; if( xx > 95)
return ; if( yy )
return ;
for( i = 0;i
m = lookforChar(*tptr ++);
if( m != FONTLISTCOUNT )
{
m = m * 16;
for( j = 0;j
{
if(op)
{
LcdPutChar8( (xx + j),yy,font[m+j] );
LcdPutChar8( (xx + j),yy+1,font[m+j+8] );
}
else
{
LcdPutChar8( (xx + j),yy,~font[m+j] );
LcdPutChar8( (xx + j),yy+1,~font[m+j+8] );
}
}
}
else
break;
xx += 8;
if( xx > 96 )
return; } PutPic( (void *)LcdBuf ); } //显示16*16字符
void LcdPutString16_16( u8 x,u8 y,u8 *ptr,u8 len,u8 op ) { u8 i,j,*tptr = ptr,xx = x,yy = y; u16 m; if( xx > 95)
return ; if( yy )
return ;
for( i = 0;i
m = lookforChar(*tptr ++);
if( m != FONTLISTCOUNT )
{
m = m * 32;
for( j = 0;j
{
if(op)
{
LcdPutChar8( (xx + j),yy,font[m+j] );
LcdPutChar8( (xx + j),yy+1,font[m+j+16] );
}
else
{
LcdPutChar8( (xx + j),yy,~font[m+j] );
LcdPutChar8( (xx + j),yy+1,~font[m+j+16] );
}
}
}
else
break;
xx += 16;
if( xx > 80 )
return; } PutPic( (void *)LcdBuf ); }
static void LcdPrint8( u8 x,u8 y,u8 vl,u8 op ) { u8 j; u16 m; m = lookforChar( vl ); if( m != FONTLISTCOUNT ) {
m = m * 16;
for( j = 0;j
{
if(op)
{
LcdPutChar8( (x + j),y,font[m+j] );
LcdPutChar8( (x + j),y+1,font[m+j+8] );
}
else
{
LcdPutChar8( (x + j),y,~font[m+j] );
LcdPutChar8( (x + j),y+1,~font[m+j+8] );
}
} } } static void LcdPrint16( u8 x, u8 y, u16 val, u8 op ) { u8 j; u16 m; m = lookforChar16( val ); if( m != fontChar16ListCount )
{
m = m * 32;
for( j = 0;j
{
if(op)
{
LcdPutChar8( (x + j),y,fontChar16[m+j] );
LcdPutChar8( (x + j),y+1,fontChar16[m+j+16] );
}
else
{
LcdPutChar8( (x + j),y,~fontChar16[m+j] );
LcdPutChar8( (x + j),y+1,~fontChar16[m+j+16] );
}
}
} }
void LcdPutDispBuf( u8 x,u8 y,OledCodeDataType *ptr,u8 op ) { u8 tcount = x; OledCodeDataType *tptr = ptr; u16 temp16; if( x > 88 )
return ; if( y > 1 )
return; while( (*tptr != '\0') && ( tcount
if(*tptr
//显示ASIC码
{
}
else //显示汉字
{
LcdPrint8( tcount,y,*tptr,op ); tptr ++; tcount += 8;
temp16 = tptr[1]; temp16
tcount += 16;
} } PutPic( (void *)LcdBuf ); }
//实现中英文混合显示
void LcdPutDisp( u8 x,u8 y,OledCodeDataType *ptr,u8 op ) { u8 tcount = x; OledCodeDataType *tptr = ptr; u16 temp16; if( x > 88 )
return ; if( y > 1 )
return; while( (*tptr != '\0') && ( tcount
if(*tptr
码
{
LcdPrint8( tcount,y,*tptr,op );
tptr ++;
tcount += 8;
}
else
//显示汉字
{
temp16 = tptr[1];
temp16
temp16 |= tptr[0];
LcdPrint16( tcount,y,temp16,op );
tptr += 2;
tcount += 16;
} } PutPic( (void *)LcdBuf ); } //从右往左输出一组字符并移运显示
void LcdPutScDispRtoL( OledCodeDataType *ptr,u8 op,u16 dl ) { OledCodeDataType *tptr = ptr; u16 temp16; // LcdClearRam();
//显示ASIC
while( *tptr != '\0' ) {
if(*tptr
//显示ASIC
{
memcpy(LcdBuf[0],&LcdBuf[0][8],88);
memcpy(LcdBuf[1],&LcdBuf[1][8],88);
LcdPrint8( 88,0,*tptr,op );
tptr ++;
}
else
//显示汉字
{
memcpy(LcdBuf[0],&LcdBuf[0][16],80);
memcpy(LcdBuf[1],&LcdBuf[1][16],80);
temp16 = tptr[1];
temp16
temp16 |= tptr[0];
LcdPrint16( 80,0,temp16,op );
tptr += 2;
}
PutPic( (void *)LcdBuf );
LcdDelay( dl ); } }
void LcdPutScDispRtoL12( OledCodeDataType *ptr,u8 op,u16 dl ) { OledCodeDataType *tptr = ptr; u16 i,temp16; for( i = 0;i
if(*tptr
//显示ASIC码
{
memcpy(LcdBuf[0],&LcdBuf[0][8],88);
memcpy(LcdBuf[1],&LcdBuf[1][8],88);
LcdPrint8( 88,0,*tptr,op );
tptr ++;
i ++ ;
}
else
//显示汉字
{
memcpy(LcdBuf[0],&LcdBuf[0][16],80);
memcpy(LcdBuf[1],&LcdBuf[1][16],80);
temp16 = tptr[1];
temp16
temp16 |= tptr[0];
LcdPrint16( 80,0,temp16,op );
tptr += 2;
i +=2;
}
PutPic( (void *)LcdBuf );
LcdDelay( dl ); } }
//从左往右
void LcdPutScDispLtoR12( OledCodeDataType *ptr,u8 op,u16 dl ) { OledCodeDataType *ttptr,*tptr = ptr; u16 temp16; u8 i,len,tempbuf[2][96];
len = 12;
tptr = ptr+11; for( i = 0; i
if( *(tptr)
ASIC码
{
memcpy(&tempbuf[0][0],&LcdBuf[0][0],96 );
memcpy(&tempbuf[1][0],&LcdBuf[1][0],96 );
memcpy(&LcdBuf[0][8],&tempbuf[0][0],88);
memcpy(&LcdBuf[1][8],&tempbuf[1][0],88);
LcdPrint8( 0,0,*tptr,op );
tptr --;
i ++;
}
else
//显示汉字
{
memcpy(&tempbuf[0][0],&LcdBuf[0][0],96 );
memcpy(&tempbuf[1][0],&LcdBuf[1][0],96 );
memcpy(&LcdBuf[0][16],&tempbuf[0][0],80);
memcpy(&LcdBuf[1][16],&tempbuf[1][0],80);
ttptr = tptr;
//显示
temp16 = *ttptr;
temp16
ttptr = tptr-1;
temp16 |= *ttptr;
LcdPrint16( 0,0,temp16,op );
tptr -= 2;
i += 2;
}
PutPic( (void *)LcdBuf );
LcdDelay( dl ); } } void LcdPutScString( OledCodeDataType *ptr,u8 op,u8 rl,u16 dl ) {
switch( rl ) {
case LIFT_SC:
LcdPutScDispLtoR12( ptr,op,dl );
break;
case RIGHT_SC:
LcdPutScDispRtoL12( ptr,op,dl );
break;
default:break;
} }
void LcdPutPic( u8 x, u8 y,u8 w,u8 h,OledCodeDataType *ptr,u8 op ) { u8 i; OledCodeDataType *tptr = ptr; if( (x > 95) || ((x + w) > 96) )
return; if( (y > 1) || ((y + h) > 2))
return;
for( i = 0;i
{
if(op)
{
LcdBuf[y][x + i] = *tptr ;
if( h == 2 )
LcdBuf[y+1][x + i] = *(tptr+w);
tptr ++;
}
else
{
LcdBuf[y][x + i] = ~*tptr ;
if( h == 2 )
LcdBuf[y+1][x + i] = ~*(tptr+w);
tptr ++;
} } PutPic( (void *)LcdBuf ); }
//整屏滑动显示
void LcdPutScPic( OledCodeDataType *ptr, u8 op,u8 qp,u16 dl ) { u8 i,j; u8 tempbuf[2][96]; if(qp) {
for( i = 0 ;i
{
tempbuf[0][i] = *ptr++;
}
for( i = 0 ;i
{
tempbuf[1][i] = *ptr++;
}
} else {
for( i = 0 ;i
{
tempbuf[0][i] = ~*ptr++;
}
for( i = 0 ;i
{
tempbuf[1][i] = ~*ptr++;
}
}
switch( op ) {
case RIGHT_SC:
//右边
for( i = 0; i
for(j = 0;j
{
LcdBuf[0][95-j] = LcdBuf[0][83j];
}
for( j = 0;j
{
LcdBuf[0][11-j] = tempbuf[0][95j];
}
for(j = 0;j
{
tempbuf[0][95-j] = tempbuf[0][83j];
}
PutPic( (void *)LcdBuf );
} LcdDelay( dl ); break; case LIFT_SC:
//左边
for( i = 0; i
for(j = 0;j
{
LcdBuf[0][j] = LcdBuf[0][j + 12];
LcdBuf[1][j] = LcdBuf[1][j + 12];
}
for( j = 0;j
{
LcdBuf[0][95-j] = tempbuf[0][11-j];
LcdBuf[1][95-j] = tempbuf[1][11-j];
}
for(j = 0;j
{
tempbuf[0][j] = tempbuf[0][j+12];
tempbuf[1][j] = tempbuf[1][j+12];
}
PutPic( (void *)LcdBuf );
} LcdDelay( dl ); break; default:
break; } }
void LcdPutString16_8_R( u8 *ptr,u8 op) { u8 i,x=0;
for(i=0;i
此实验室实现两个节点间的通信,可以输出中文或英文,或中英文混合输出。其主要原理是通过ASIC将中英文转换,通过字符串的拼凑输出。
实验
二、光照传感器实验
1.实验内容
1.了解光照采集的原理
2.学习CDS 光照传感器从而掌握光照传感器的原理 3.掌握“传感器节点板”模块的原理和使用方法。 2.实验步骤
第一步:把“代码和例子程序\Zigbee2007 多传感器”内文件夹 “ZStack-CC2530-2.2.0-1.3.0MS”“”复制至 IAR 安装盘根目录(如 C:\ Texas Instruments)下。使用 IAR7.51 打开“Projects\zstack\Samples\SampleApp\CC2530 DB”中工程文件“SampleApp.eww”。
第二步:打开工程后选择对应的设备类型 打开工程后如下右图所示选择当前要烧写设备的类型。
打开后的工程文件 工程名称 ZigBee 网络功能 CC2530-WSN 节点功能 CoordinatorEB-Pro 协调器 网关 RouterEB-Pro 路由器 路由器节点、传感器节点 EndDeviceEB-Pro 终端节点 传感器节点
第三步:编译工程并下载到目标板。 点击菜单 Project,选择“Rebuild All”,等待一会儿工程文件编译完成。等 待一会儿工程文件编译完成把仿真器与网关通过仿真器下载线连接起来。确保仿 真器与计算机、仿真器与网关底板连接正确,ZigBee 无线模块正确地插在网关 底板后。 点击菜单 Project,选择“Debug”,或点击如下图标,等待一会儿即完成程 序下载 重复进行第二步和第三步,将“RouterEB-Pro”设备对应的程序下载到带传 感器模块的传感器节点底板中(SMBD-V11-1) 第四步:修改 IEEE 地址。在物理地址烧写软件中首先通过“Read IEEE”把物 理地址(IEEE 地址)读出来,如果节点物理地址为“0XFF FF FF FF FF FF FF FF” 或在网络中有相同地址,则需要通过“Write IEEE”修改 ZigBee 网络节点的物 理地址,在此例中,我们把网关的物理地址修改“0x31,0x30,0x30,0x30,0x30,0x30, 0x30,0x30”。按照第二步至第四步的方法下载传感器节点模块的程序,选择 “RouterEB”或“EndDevice”,如有多组在同一实验室进行实验,请修改为各 不相同的 IEEE 地址。 第五步:获取和查看光照传感器数据 用 USB 线连接上 PC 机跟网关,打开“代码和例子程序\Zigbee2007 多传感 器\无线龙 ZigBee 演示软件 V1.21(串口用)”目录下“无线龙 ZigBee 演示软件 V1.21(串口用).exe”软件。 通过设备管理器查看对应设备的串口号是多少,如图所示为 COM3。在监控 软件中选择“COM 端口”COM3,波特率:38400,点击“打开串口”。正确打开串口后,选择网络拓扑图,确保网关与计算机的正确连接。 3.实验代码与分析
case 4://普通温度、光敏、蜂鸣器 if(DispState == 0) { LcdPutString16_8(0, 0, (void*)" Temp/Light ", 12 , 1); } else if(DispState == 1) { temp = ReadTc77(); //读取温度 sprintf(msg,"TEMP:%2d ",temp); LcdPutString16_8(0, 0, (void*)msg, 12 , 1); } else if(DispState == 2) //读取光照 { temp = ReadSensorAdc(1); sprintf(msg,"Light:%03d ",temp); LcdPutString16_8(0, 0, (void*)msg, 12 , 1); }
break; 通过 ADC 读取光敏传感器值:
temp = ReadSensorAdc(1); //读取光敏传感器值
ReadSensorAdc 子函数位于“ Components\hal\target\CC2530EB”目录下的 Sensor.c 文件中
temp = HalAdcRead(channel,HAL_ADC_RESOLUTION_8); channel 光敏传感器对应的 AD 通道 P01
HAL_ADC_RESOLUTION_8 采集分辨率 8Bit
ADC 采 集 子 函 数 在 在 “Components\hal\target\CC2530EB ” 目 录 下 的
“ hal_adc.c”文件
/****************************************************************************** ******************** * @fn HalAdcRead * * @brief Read the ADC based on given channel and resolution * * @param channelthe resolution of the value * * @return 16 bit value of the ADC in offset binary format.* Note that the ADC is "bipolar", which means the GND (0V) level is mid-scale.******************************************************************************* *******************/ uint16 HalAdcRead (uint8 channel, uint8 resolution) { int16 reading = 0; #if (HAL_ADC == TRUE) uint8 i, resbits; uint8 adctemp; volatile uint8 tmp; uint8 adcChannel = 1; /* * If Analog input channel is AIN0..AIN7, make sure corresponing P0 I/O pin is enabled.The code * does NOT disable the pin at the end of this function.I think it is better to leave the pin * enabled because the results will be more accurate.Because of the inherent capacitance on
* pin, it takes time for the voltage on the pin to charge up to its steady-state level.If * HalAdcRead() has to turn on the pin for every conversion, the results may show a lower voltage * than actuality because the pin did not have time to fully charge.*/ if (channel >= 8; break; case HAL_ADC_RESOLUTION_10: reading >>= 6; break; case HAL_ADC_RESOLUTION_12: reading >>= 4; break; case HAL_ADC_RESOLUTION_14: default:
HAL_ADC_DEC_BITS |
break; } #else // unused arguments (void) channel; (void) resolution; #endif return ((uint16)reading); }
4.实验总结
通过串口助手,配置正确的串口号和波特率,填入测试的数据指令,点击发送就可以获取网关返回的读取到节点的数据。
实验
三、气压传感器实验
1.实验内容
1.了解气压采集的原理
2.学习MPX5010 气压传感器从而掌握气压传感器的原理 3.掌握“ 传感器节点板” 模块的原理和使用方法。 2.实验步骤
同“实验二十四 光照传感器实验 实验步骤第一步至第四步”
第五步:获取和查看大气气压传感器数据用 USB 线连接上 PC 机跟网关,打开“ \软件工具及驱动\无线龙 ZigBee 演示软件 V1.11”目录下“无线龙 ZigBee 演示软件 V1.11.exe”软件。通过设备管理器查看对应设备的串口号是多少,如图所示为 COM3。在监控软件中选择“ COM 端口” COM3,波特率: 38400,点击“打开串口”。在 RSS 曲线部分中的下拉选择框中选择节点压力(如下图),鼠标左键单击选中要查看的节点模块。点击“开始”按钮,就可开始显示节点空气压力的曲线了(注:这时“开始”
按钮将变为“关闭”按钮)。为了使显示曲线效果明显,可以通过电扇吹气方式来达到明显效果。点击“关闭”按钮,则曲线停止,但曲线不会消失,这时“关闭”按钮将变为“开始”按钮,这时在点击“开始”按钮会弹出一格对话框,选择“是”则不清空曲线,继续在图上画曲线。选择“否”则清空曲线,再 在图上画曲线。 点击“保存”按钮,可将曲线图以 RSS 格式的数据保存在电脑上,点击“载入”按钮,可以载入保存了曲线数据的 RSS 文件,将曲线显示在曲线图上。 3.实验代码与分析
传感器采集的函数在 void SampleApp_MeageMSGCB( afIncomingMSGPacket_t *pkt )中
if((RfRx.RXDATA.HeadCom[1] == 'P') && (RfRx.RXDATA.HeadCom[2] == 'R'))//压力传感器 { if(SensorNum == 5)//压力传感器板 { memcpy(RfTx.TxBuf, RfRx.RxBuf, 14); temp = ReadSensorAdc(0); RfTx.TXDATA.DataBuf[0] = temp/100 + 0x30; temp = temp%100; RfTx.TXDATA.DataBuf[1] = temp/10 + 0x30; RfTx.TXDATA.DataBuf[2] = temp%10 + 0x30; RfHaveTxDara = 1; } } //调用子函数 ReadSensorAdc 完成读取
//--------------------------- //Read Sensor ADC value //读取 AD 值 //输入:通道名
//返回: 8 位 AD 值
//--------------------------- INT8U ReadSensorAdc(INT8U channel) { INT8U temp; temp = HalAdcReadSen(channel,HAL_ADC_RESOLUTION_8); return temp; } 通过 ADC 读取大气压力传感器值:
temp = HalAdcReadSen(channel,HAL_ADC_RESOLUTION_8);/读取空气压力传感器值 channel 气体压力传感器对应的 AD 通道
HAL_ADC_RESOLUTION_8 采集分辨率 8Bit
ADC 采 集 子 函 数 在 在 “Components\hal\target\CC2530EB ” 目 录 下 的 “ hal_adc.c”文件
/****************************************************************************** ******************** * @fn HalAdcRead * * @brief Read the ADC based on given channel and resolution * * @param channelthe resolution of the value * * @return 16 bit value of the ADC in offset binary format.* Note that the ADC is "bipolar", which means the GND (0V) level is mid-scale.******************************************************************************* *******************/ uint16 HalAdcRead (uint8 channel, uint8 resolution) int16 reading = 0; #if (HAL_ADC == TRUE) uint8 i, resbits; uint8 adctemp; volatile uint8 tmp; uint8 adcChannel = 1; /* * If Analog input channel is AIN0..AIN7, make sure corresponing P0 I/O pin is enabled.The code * does NOT disable the pin at the end of this function.I think it is better to leave the pin * enabled because the results will be more accurate.Because of the inherent capacitance on the * pin, it takes time for the voltage on the pin to charge up to its steady-state level.If * HalAdcRead() has to turn on the pin for every conversion, the results may show a lower voltage * than actuality because the pin did not have time to fully charge.*/ if (channel >= 8; break; case HAL_ADC_RESOLUTION_10: reading >>= 6; break; case HAL_ADC_RESOLUTION_12: reading >>= 4; break; case HAL_ADC_RESOLUTION_14: default: break; } #else // unused arguments (void) channel; (void) resolution; #endif return ((uint16)reading); } 4.实验总结
打开“ EXPLORERF-CC2530 增配传感器光盘 V1.1\软件工具及驱动” 中工具 “ 串口调试助手.exe”配置正确的串口号和通讯波特率,填入测试的数据指令, 点击发送就可以获取网关返回的读取到节点的数据。
实验
四、综合实验
1.实验原理
以一LED灯,LED显示屏作为工具。当LED灯显示时,LED显示屏上也显示信息灯亮。将LED灯作为协调器,LED显示屏作为终端,当LED灯亮时,会通过组网将信息传给终端,即此时LED显示屏显示灯亮,即LED显示屏给予LED灯亮的一个信息反馈。 2.实验步骤
选择烧取设备的类型为CoordinatorEB-pro, 点击菜单 Project,选择“ Rebuild All”,等待一会儿工程文件编译完成。等待一会儿工程文件编译完成把仿真器与网关通过仿真器下载线连接起来。确保仿真器与计算机、仿真器与网关底板连接正确, ZigBee 无线模块正确地插在网关底板后。点击菜单 Project,选择“ Debug”,或点击如下图标,等待一会儿即完成程序下载.将烧取设备类型改为EndDeviceEB-pro,重复上述步骤。当LED亮时,此时显示屏也将有相应反应。 4.实验代码
#include "OSAL.h" #include "ZGlobals.h" #include "AF.h" #include "aps_groups.h" #include "ZDApp.h"
#include "SampleApp.h" #include "SampleAppHw.h"
#include "OnBoard.h"
/* HAL */ #include "hal_lcd.h" #include "hal_led.h" #include "hal_key.h" #include "string.h" #include #include "MT_UART.h" #include "HAL_ADC.h"
#include "sensor.h" #include "SHT10.h" #include "ugOled9616.h" #include "LcdDisp.h" #include "TMP006.h" #include "hal_timer34.h" /********************************************************************* * MACROS */
/********************************************************************* * CONSTANTS */ /********************************************************************* * TYPEDEFS */
/********************************************************************* * GLOBAL VARIABLES */
// This list should be filled with Application specific Cluster IDs.const cId_t SampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS] = { SAMPLEAPP_PERIODIC_CLUSTERID, SAMPLEAPP_FLASH_CLUSTERID };
const SimpleDescriptionFormat_t SampleApp_SimpleDesc = { SAMPLEAPP_ENDPOINT, // int Endpoint; SAMPLEAPP_PROFID, // uint16 AppProfId[2]; SAMPLEAPP_DEVICEID, // uint16 AppDeviceId[2]; SAMPLEAPP_DEVICE_VERSION, // int AppDevVer:4; SAMPLEAPP_FLAGS, // int AppFlags:4; SAMPLEAPP_MAX_CLUSTERS, // uint8 AppNumInClusters; (cId_t *)SampleApp_ClusterList, // uint8 *pAppInClusterList; SAMPLEAPP_MAX_CLUSTERS, // uint8 AppNumInClusters; (cId_t *)SampleApp_ClusterList // uint8 *pAppInClusterList; };
// This is the Endpoint/Interface description.It is defined here, but // filled-in in SampleApp_Init().Another way to go would be to fill // in the structure here and make it a "const" (in code space).The // way it's defined in this sample app it is define in RAM.endPointDesc_t SampleApp_epDesc;
/********************************************************************* * EXTERNAL VARIABLES */ extern unsigned char SensorNum; extern INT8U DispNum; unsigned char DispState = 0; unsigned char Relay1State = 0; unsigned char Relay2State = 0; extern INT16U LEDDispNum; /********************************************************************* * EXTERNAL FUNCTIONS */
/********************************************************************* * LOCAL VARIABLES */ uint8 SampleApp_TaskID; // Task ID for internal task/event proceing // This variable will be received when // SampleApp_Init() is called.devStates_t SampleApp_NwkState;
uint8 SampleApp_TransID; // This is the unique meage ID (counter) uint8 *ieeeAddr;//物理地址
unsigned char LCDUPDATA = 0;//LCD刷新标致位 unsigned char Shakeflag = 0; unsigned char InfraredState = 0; unsigned char InfraredCount = 0; unsigned char InfraredInitFlag = 0; unsigned char HallState = 0; union f1{ uint8 RxBuf[32]; struct UARTCOMBUF { uint8 Head; //头 uint8 HeadCom[3]; //命令头 uint8 Laddr[8]; //物理地址 uint8 Saddr[2]; //网络地址 uint8 DataBuf[16]; //数据缓冲区 uint8 CRC; //校验位
uint8 LastByte;//帧尾 }RXDATA; }UartRxBuf;//从串口接收到的数据帧
union e{ uint8 TxBuf[32]; struct UARTBUF { uint8 Head; //头 uint8 HeadCom[3]; //命令头 uint8 Laddr[8]; //物理地址 uint8 Saddr[2]; //网络地址 uint8 DataBuf[16]; //数据缓冲区 uint8 CRC; //校验位
uint8 LastByte;//帧尾 }TXDATA; }UartTxBuf;//从串口发送数据帧
union h{ uint8 RxBuf[32]; struct RFRXBUF { uint8 Head; //头
uint8 HeadCom[3]; //命令头 uint8 Laddr[8]; uint8 Saddr[2]; uint8 DataBuf[16]; //数据缓冲区
uint8 CRC; //校验位
uint8 LastByte;//帧尾 }RXDATA; }RfRx;//无线接收缓冲区
union j{ uint8 TxBuf[32]; struct RFTXBUF { uint8 Head; //头
uint8 HeadCom[3]; //命令头
uint8 Laddr[8]; uint8 Saddr[2]; uint8 DataBuf[16]; //数据缓冲区
uint8 CRC; //校验位
uint8 LastByte;//帧尾 }TXDATA; }RfTx;//无线发送缓冲区
uint16 Ultrasonic_Count;//超声波计数
/***************************************************************************** void WaitUs(uint16 microSecs)
延时uS函数.*****************************************************************************/ void WaitUs(uint16 microSecs) { while(microSecs--) { /* 32 NOPs == 1 usecs */ asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); } }
/***************************************************************************** uint8 SendData( uint16 addr, uint8 *buf, uint8 Leng)
发送一组数据.*****************************************************************************/ uint8 SendData( uint16 addr, uint8 *buf, uint8 Leng) { afAddrType_t SendDataAddr;
SendDataAddr.addrMode = (afAddrMode_t)Addr16Bit; SendDataAddr.endPoint = SAMPLEAPP_ENDPOINT; SendDataAddr.addr.shortAddr = addr; if ( AF_DataRequest( &SendDataAddr, &SampleApp_epDesc, 2,//SAMPLEAPP_PERIODIC_CLUSTERID, Leng, buf, &SampleApp_TransID, AF_DISCV_ROUTE, // AF_ACK_REQUEST, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ) {
return 1; } else {
return 0;// Error occurred in request to send. } } case 1://DAC 输出
if(DispState == 0)
{
DAC_OUT_CON(0x07ff, 0x07ff);
LcdPutString16_8(0, 0, (void*)" DAC-OUT ", 12 , 1);
}
else if(DispState == 1)
{
DAC_OUT_CON(0x03ff, 0x03ff);
sprintf(msg,"OUT:0.5MA/V ",temp);
LcdPutString16_8(0, 0, (void*)msg, 12 , 1);
}
else if(DispState == 2)
{
DAC_OUT_CON(0x0Bff, 0x0Bff);
sprintf(msg,"OUT:1.5MA/V ",temp);
LcdPutString16_8(0, 0, (void*)msg, 12 , 1);
}
break; case 2://高亮LED控制
if(DispState == 0)
{
ChangT3Cmp0Val(0xff);
P1_6 = 0;
LcdPutString16_8(0, 0, (void*)" LED-LIGHT ", 12 , 1);
}
else if(DispState == 1)
{
ChangT3Cmp0Val(230);
LcdPutString16_8(0, 0, (void*)"LEVEL:10% ", 12 , 1);
}
else if(DispState == 2)
{
ChangT3Cmp0Val(25);
LcdPutString16_8(0, 0, (void*)"LEVEL:90% ", 12 , 1);
}
break;
} void SampleApp_Init( uint8 task_id ) { SampleApp_TaskID = task_id; SampleApp_NwkState = DEV_INIT; SampleApp_TransID = 0;
// Device hardware initialization can be added here or in main() (Zmain.c). // If the hardware is application specificThis app will handle all key events RegisterForKeys( SampleApp_TaskID );
#ifdef WXL_COORD
MT_UartRegisterTaskID(SampleApp_TaskID);
#endif } void SampleApp_Init( uint8 task_id ) { SampleApp_TaskID = task_id; SampleApp_NwkState = DEV_INIT; SampleApp_TransID = 0;
// Device hardware initialization can be added here or in main() (Zmain.c). // If the hardware is application specificThis app will handle all key events RegisterForKeys( SampleApp_TaskID );
#ifdef WXL_COORD
MT_UartRegisterTaskID(SampleApp_TaskID);
#endif }
/********************************************************************* * @fn SampleApp_ProceEvent * * @brief Generic Application Task event proceor.This function * is called to proce all events for the task.Events * include timers, meages and any other user defined events. * * @param task_idevents to proce.This is a bit map and can * contain more than one event. * * @return none */ uint16 SampleApp_ProceEvent( uint8 task_id, uint16 events ) { afIncomingMSGPacket_t *MSGpkt; uint16 temp1;
#if (defined(WXL_ROUTER) || defined(WXL_RFD))//ROUTER OR RFD uint16 SrcSaddr; #endif
(void)task_id; // Intentionally unreferenced parameter
if ( events & SYS_EVENT_MSG ) {
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );
while ( MSGpkt )
{
switch ( MSGpkt->hdr.event )
{
// Received when a key is preed
case KEY_CHANGE:
SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );
break;
// Received when a meages is received (OTA) for this endpoint
case AF_INCOMING_MSG_CMD:
SampleApp_MeageMSGCB( MSGpkt );
break;
// Received whenever the device changes state in the network
case ZDO_STATE_CHANGE:
SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
if ( (SampleApp_NwkState == DEV_ZB_COORD)
|| (SampleApp_NwkState == DEV_ROUTER)
|| (SampleApp_NwkState == DEV_END_DEVICE) )
{
HalLedSet( HAL_LED_1,HAL_LED_MODE_ON ); #ifdef WXL_COORD
ugOled9616int(); LcdPutString16_8(0, 0, (void*)" COORD ", 12 , 1);
//osal_start_timerEx( SampleApp_TaskID,
//SAMPLEAPP_RUN__EVT,
//SAMPLEAPP_RUN_TIMEOUT );//启动超时定时器
#endif
#ifdef WXL_RFD
memset(RfTx.TxBuf,'x',32);
RfTx.TXDATA.Head = '&';
RfTx.TXDATA.HeadCom[0] = 'J';
RfTx.TXDATA.HeadCom[1] = 'O';
RfTx.TXDATA.HeadCom[2] = 'N';
ieeeAddr = NLME_GetExtAddr();
memcpy(RfTx.TXDATA.Laddr,ieeeAddr,8);
SrcSaddr = NLME_GetShortAddr();
RfTx.TXDATA.Saddr[0] = SrcSaddr; RfTx.TXDATA.Saddr[1] = SrcSaddr>>8;
RfTx.TXDATA.DataBuf[0] = 'R';
RfTx.TXDATA.DataBuf[1] = 'F';
RfTx.TXDATA.DataBuf[2] = 'D';
NLME_GetCoordExtAddr(&RfTx.TXDATA.DataBuf[3]); temp1 = NLME_GetCoordShortAddr(); RfTx.TXDATA.DataBuf[11] = (unsigned char)(temp1>>8); RfTx.TXDATA.DataBuf[12] = (unsigned char)(temp1);
RfTx.TXDATA.DataBuf[13] = SensorNum;
RfTx.TXDATA.LastByte = '*';
SendData(0x0000, RfTx.TxBuf, 32);//发送自己的节点信息到主机
if((SensorNum == 1) || (SensorNum == 2))//点阵屏或数码管屏
{
init_T3();//打开定时器3开始扫描
}
else if(SensorNum == 9)//振动传感器
{
IEN1 |= 0x20; //Port 0 interrupt enable
}
osal_start_timerEx( SampleApp_TaskID,
SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
SAMPLEAPP_1000MS_TIMEOUT );//每秒检测一次红外传感器 #endif
#ifdef WXL_ROUTER
memset(RfTx.TxBuf,'x',32);
RfTx.TXDATA.Head = '&';
RfTx.TXDATA.HeadCom[0] = 'J';
RfTx.TXDATA.HeadCom[1] = 'O';
RfTx.TXDATA.HeadCom[2] = 'N';
RfTx.TXDATA.Saddr[1] SrcSaddr>>8;
temp1 NLME_GetCoordShortAddr(); RfTx.TXDATA.DataBuf[11] (unsigned char)(temp1>>8); RfTx.TXDATA.DataBuf[12] (unsigned char)(temp1);
RfTx.TXDATA.DataBuf[13] SensorNum;
RfTx.TXDATA.LastByte = '*';
息到主机
if((SensorNum == 2))//点阵屏或数码管屏
ieeeAddr = NLME_GetExtAddr(); memcpy(RfTx.TXDATA.Laddr,ieeeAddr,8); SrcSaddr = NLME_GetShortAddr(); RfTx.TXDATA.Saddr[0] = SrcSaddr; = RfTx.TXDATA.DataBuf[0] = 'R'; RfTx.TXDATA.DataBuf[1] = 'O'; RfTx.TXDATA.DataBuf[2] = 'U'; NLME_GetCoordExtAddr(&RfTx.TXDATA.DataBuf[3]); = = = = SendData(0x0000, RfTx.TxBuf, 32);//发送自己的节点信== 1) || (SensorNum { init_T3();//打开定时器3开始扫描 } else if(SensorNum == 9)//振动传感器 { IEN1 |= 0x20; //Port 0 interrupt enable }
osal_start_timerEx( SampleApp_TaskID,
SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
SAMPLEAPP_1000MS_TIMEOUT );//每秒检测一次红外传感器
#endif
}
break;
case SPI_INCOMING_ZTOOL_PORT:
UartRxComCallBack();//串口收到一帖数据的处理
break;
default:
break;
}
// Release the memory
osal_msg_deallocate( (uint8 *)MSGpkt );
// NextThis event is generated by a timer // (setup in SampleApp_Init()). if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )//发送数据超时
{
if(SensorNum == 8)
{
if(InfraredInitFlag == 0)//人体红外传感器需要初始化20秒
{
if(++InfraredCount > 20)
{
InfraredInitFlag = 1;
}
}
else
{
if(P0_0 == 1)
{
if(InfraredState == 0)
{
InfraredState = 1;
RfTx.TXDATA.Head = '&';
RfTx.TXDATA.HeadCom[0] = 'A';
RfTx.TXDATA.HeadCom[1] = 'I';
RfTx.TXDATA.HeadCom[2] = 'N';
ieeeAddr = NLME_GetExtAddr();
memcpy(RfTx.TXDATA.Laddr,ieeeAddr,8);
temp1 = NLME_GetShortAddr();
RfTx.TXDATA.Saddr[0] = temp1;
RfTx.TXDATA.Saddr[1] = temp1>>8;
RfTx.TXDATA.LastByte = '*';
SendData(0x0000, RfTx.TxBuf, 32);//发送报警数据
}
}
else
{
InfraredState = 0;
} if(DispState != 0)//每一秒自动采集一次传感器
{
LCDUPDATA = 1;
}
}
}
else if(SensorNum == 9)//振动传感器
{
if(Shakeflag)
{
Shakeflag = 0;
P0IEN |= 0x01;//Port 0, inputs 0 interrupt enable.
P0IFG &= 0xfe; //Clear any pending interrupts
RfTx.TXDATA.Head = '&';
RfTx.TXDATA.HeadCom[0] = 'A';
RfTx.TXDATA.HeadCom[1] = 'S';
RfTx.TXDATA.HeadCom[2] = 'H';
ieeeAddr = NLME_GetExtAddr();
memcpy(RfTx.TXDATA.Laddr,ieeeAddr,8);
temp1 = NLME_GetShortAddr();
RfTx.TXDATA.Saddr[0] = temp1;
RfTx.TXDATA.Saddr[1] = temp1>>8;
RfTx.TXDATA.LastByte = '*';
SendData(0x0000, RfTx.TxBuf, 32);//发送报警数据
BEEPState2 = 2; } if(BEEPState2 == 1) {
BEEPState2 = 2;
P1_4 = 1; } else if(BEEPState2 == 2) {
BEEPState2 = 1;
P1_4 = 0; } } else if(SensorNum == 16)//霍尔传感器板 { if(P0_0 == 0) {
if(HallState == 0)
{
HallState = 1;
RfTx.TXDATA.Head = '&';
RfTx.TXDATA.HeadCom[0] = 'A';
RfTx.TXDATA.HeadCom[1] = 'H';
RfTx.TXDATA.HeadCom[2] = 'A';
ieeeAddr = NLME_GetExtAddr();
memcpy(RfTx.TXDATA.Laddr,ieeeAddr,8);
temp1 = NLME_GetShortAddr();
RfTx.TXDATA.Saddr[0] = temp1;
RfTx.TXDATA.Saddr[1] = temp1>>8;
RfTx.TXDATA.LastByte = '*';
SendData(0x0000, RfTx.TxBuf, 32);//发送报警数据
}
}
else
{
HallState = 0;
}
}
else if(SensorNum == 4)
{
if(DispState != 0)//每一秒自动采集一次传感器
{
LCDUPDATA = 1;
}
if(BEEPState1 == 1)
{
BEEPState1 = 2;
P1_6 = 1;
}
else if(BEEPState1 == 2)
{
BEEPState1 = 1;
P1_6 = 0;
}
}
else if((SensorNum == 3) || (SensorNum == 5) || (SensorNum == 7) || (SensorNum == 10) || (SensorNum == 11) || (SensorNum == 13))
{
if(DispState != 0)//每一秒自动采集一次传感器
{
LCDUPDATA = 1;
}
}
LCDDispFun();
// Setup to send meage again in normal period (+ a little jitter)
osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT, SAMPLEAPP_1000MS_TIMEOUT);
return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT); } // Discard unknown events return 0; } void SampleApp_HandleKeys( uint8 shift, uint8 keys ) { (void)shift; // Intentionally unreferenced parameter
if ( keys & HAL_KEY_UP ) {
P1_1 = !P1_1;
if(++DispState >= 3)DispState = 0;
LCDUPDATA = 1; } if ( keys & HAL_KEY_DOWN ) {
P1_1 = !P1_1;
if(--DispState >= 200)DispState = 2;
LCDUPDATA = 1; } }
/********************************************************************* * LOCAL FUNCTIONS */
/********************************************************************* * @fn SampleApp_MeageMSGCB * * @brief Data meage proceor callback.This function procees * any incoming data - probably from other devices.So, based * on cluster ID, perform the intended action. * * @param none * * @return none */ void SampleApp_MeageMSGCB( afIncomingMSGPacket_t *pkt ) { #ifdef WXL_COORD uint8 i;
memcpy(RfRx.RxBuf,pkt->cmd.Data,32);//读出无线按收到的数据
osal_stop_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT);//停止超时计数器
if((RfRx.RXDATA.Head == '&') && (RfRx.RXDATA.LastByte == '*')) {
memcpy(UartTxBuf.TxBuf,RfRx.RxBuf,32);
for(i=0; i
{
UartTxBuf.TXDATA.Laddr[i] = RfRx.RXDATA.Laddr[i];//长地址
}
for(i=0; i
{
UartTxBuf.TXDATA.Saddr[i] = RfRx.RXDATA.Saddr[1-i];//短地址
}
UartTxBuf.TXDATA.CRC = CheckUartData(&UartTxBuf.TxBuf[1],29);
HalUARTWrite ( HAL_UART_PORT_0, UartTxBuf.TxBuf, 32);//从串口输出
} #endif
#if (defined(WXL_ROUTER) || defined(WXL_RFD))//ROUTER OR RFD uint8 temp; uint16 temp1,temp2; uint8 RfHaveTxDara = 0;//无线有数据需要发送
ieeeAddr = NLME_GetExtAddr(); memcpy(RfRx.RxBuf,pkt->cmd.Data,32); memset(RfTx.TxBuf,'x',32); switch(RfRx.RXDATA.HeadCom[0]){
case 'R'://读
if((RfRx.RXDATA.HeadCom[1] == 'A') && (RfRx.RXDATA.HeadCom[2] 'S'))//读传感器
{
if(SensorNum == 4)//高精温湿度传感器
{
==
memcpy(RfTx.TxBuf, RfRx.RxBuf, 16);
if((RfRx.RXDATA.DataBuf[0] == 'G') && (RfRx.RXDATA.DataBuf[1] == 'M'))//读光敏
{
temp = ReadSensorAdc(1); //显示值转换
RfTx.TXDATA.DataBuf[2] = temp/100 + 0x30;
temp = temp%100;
RfTx.TXDATA.DataBuf[3] = temp/10 + 0x30;
RfTx.TXDATA.DataBuf[4] = temp%10 + 0x30;
RfHaveTxDara = 1;;
}
else if((RfRx.RXDATA.DataBuf[0] == 'W') && (RfRx.RXDATA.DataBuf[1] == 'D'))//读温度
{ //WriteTc77(1); //唤醒温度传感器
//Sensor_Delay(10000); //必须延时后才能读
temp = ReadTc77(); //读取温度
//WriteTc77(0); //温度传感器休眠
//显示值转换
RfTx.TXDATA.DataBuf[2] = temp/10 + 0x30;
RfTx.TXDATA.DataBuf[3] = temp%10 + 0x30;
RfHaveTxDara = 1;
}
}
}
else if((RfRx.RXDATA.HeadCom[1] == 'S') && (RfRx.RXDATA.HeadCom[2] == 'H'))//读取高精温湿度传感器
{ // 读取的温湿度为16位浮点数,在上位机上转换。 if(SensorNum == 3)//高精温湿度传感器 { memcpy(RfTx.TxBuf, RfRx.RxBuf, 16); SHT1X_INT(); if((RfRx.RXDATA.DataBuf[0] == 'W') && (RfRx.RXDATA.DataBuf[1] == 'D'))
{
temp1 = Read_SHT1X(3);
RfTx.TXDATA.DataBuf[2] = (uint8) (temp1>>8);
RfTx.TXDATA.DataBuf[3] = (uint8) (temp1&0xff);
RfHaveTxDara = 1;
}
else if((RfRx.RXDATA.DataBuf[0] == 'S') && (RfRx.RXDATA.DataBuf[1] == 'D'))
{
temp1 = Read_SHT1X(5);
RfTx.TXDATA.DataBuf[2] = (uint8) (temp1>>8);
RfTx.TXDATA.DataBuf[3] = (uint8) (temp1&0xff);
RfHaveTxDara = 1;
}
}
}
else if((RfRx.RXDATA.HeadCom[1] == 'P') && (RfRx.RXDATA.HeadCom[2] == 'R'))//压力传感器
{ if(SensorNum == 5)//压力传感器板 {
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
temp = ReadSensorAdc(0);
RfTx.TXDATA.DataBuf[0] = temp/100 + 0x30;
temp = temp%100;
RfTx.TXDATA.DataBuf[1] = temp/10 + 0x30;
RfTx.TXDATA.DataBuf[2] = temp%10 + 0x30;
RfHaveTxDara = 1; } }
else if((RfRx.RXDATA.HeadCom[1] == 'R') && (RfRx.RXDATA.HeadCom[2] == 'A'))//雨滴传感器
{ if(SensorNum == 7)//雨滴传感器板 {
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
temp = ReadSensorAdc(0);
RfTx.TXDATA.DataBuf[0] = temp/100 + 0x30;
temp = temp%100;
RfTx.TXDATA.DataBuf[1] = temp/10 + 0x30;
RfTx.TXDATA.DataBuf[2] = temp%10 + 0x30;
RfHaveTxDara = 1; } } else if((RfRx.RXDATA.HeadCom[1] == 'A') && (RfRx.RXDATA.HeadCom[2] == 'D')) //控制加速度传感器
{
if(SensorNum == 10)//加速度传感器板 { //P1_4 = 1; if(RfRx.RXDATA.DataBuf[0] == 'X')
{
temp = ReadSensorAdc(XOUT);
}
else if(RfRx.RXDATA.DataBuf[0] == 'Y')
{
temp = ReadSensorAdc(YOUT);
} else if(RfRx.RXDATA.DataBuf[0] == 'Z')
{
temp = ReadSensorAdc(ZOUT);
}
//P1_4 = 0;
memcpy(RfTx.TxBuf, RfRx.RxBuf, 15); RfTx.TXDATA.DataBuf[1] = temp/100 + 0x30;
temp = temp%100;
RfTx.TXDATA.DataBuf[2] = temp/10 + 0x30;
RfTx.TXDATA.DataBuf[3] = temp%10 + 0x30;
RfHaveTxDara = 1;
}
}//end
else if((RfRx.RXDATA.HeadCom[1] == 'G') && (RfRx.RXDATA.HeadCom[2] == 'A'))//可燃气体传感器 { if(SensorNum == 11)//可燃气体传感器板 {
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
temp = ReadSensorAdc(0);
RfTx.TXDATA.DataBuf[0] = temp/100 + 0x30;
temp = temp%100;
RfTx.TXDATA.DataBuf[1] = temp/10 + 0x30;
RfTx.TXDATA.DataBuf[2] = temp%10 + 0x30;
RfHaveTxDara = 1; } } else if((RfRx.RXDATA.HeadCom[1] == 'U') && (RfRx.RXDATA.HeadCom[2] == 'L'))//超声波传感器 { if(SensorNum == 14)//超声波传感器板 {
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
P1_4 = 1;
WaitUs(20);
P1_4 = 0;
Ultrasonic_Count = 0;
while(!P0_0)//等待返回高电平 {
WaitUs(20);
if((++Ultrasonic_Count) >= 1000)//超时自动退出
{
break;
} }
Ultrasonic_Count = 0; while(P0_0)
{
WaitUs(20);
Ultrasonic_Count++;
if(Ultrasonic_Count >= 600)//超时退出
{
Ultrasonic_Count = 0;
break;
}
}
temp1 = Ultrasonic_Count;
if((temp1 > 1) && (temp1
RfTx.TXDATA.DataBuf[0] = temp1/100 + 0x30;
temp = temp1%100;
RfTx.TXDATA.DataBuf[1] = temp/10 + 0x30;
RfTx.TXDATA.DataBuf[2] = temp%10 + 0x30;
}
else
{
RfTx.TXDATA.DataBuf[0] = 'E';
RfTx.TXDATA.DataBuf[1] = '0';
}
RfHaveTxDara = 1; } }
else if((RfRx.RXDATA.HeadCom[1] == 'N') && (RfRx.RXDATA.HeadCom[2] == 'S'))//读模块连接状态
{
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
temp = pkt->LinkQuality;
RfTx.TXDATA.DataBuf[0] = temp/100 + 0x30; temp %= 100; RfTx.TXDATA.DataBuf[1] = temp/10 + 0x30; RfTx.TXDATA.DataBuf[2] = temp%10 + 0x30; NLME_GetCoordExtAddr(&RfTx.TXDATA.DataBuf[3]); temp1 = NLME_GetCoordShortAddr(); RfTx.TXDATA.DataBuf[11] = (INT8U)(temp1>>8); RfTx.TXDATA.DataBuf[12] = (INT8U)(temp1);
RfHaveTxDara = 1;
}//end 读模块连接状态 break;
case 'T'://测试
if((RfRx.RXDATA.HeadCom[1] == 'L') && (RfRx.RXDATA.HeadCom[2] == 'D'))//LED测试
{
if(RfRx.RXDATA.DataBuf[0] == 'C')
{
if((RfRx.RXDATA.DataBuf[1] == 'D') && (RfRx.RXDATA.DataBuf[2] == '1'))
{
if(RfRx.RXDATA.DataBuf[3] == '1')
{
HalLedSet ( HAL_LED_1, HAL_LED_MODE_ON );//开
}
else if(RfRx.RXDATA.DataBuf[3] == '0')
{
HalLedSet ( HAL_LED_1, HAL_LED_MODE_OFF );//关
}
}
else if((RfRx.RXDATA.DataBuf[1] == 'D') && (RfRx.RXDATA.DataBuf[2] == '2'))
{
if(RfRx.RXDATA.DataBuf[3] == '1')
{
HalLedSet ( HAL_LED_2, HAL_LED_MODE_ON );//开
}
else if(RfRx.RXDATA.DataBuf[3] == '0')
{
HalLedSet ( HAL_LED_2, HAL_LED_MODE_OFF );//关
}
}
} else if(RfRx.RXDATA.DataBuf[0] == 'T') { if((RfRx.RXDATA.DataBuf[1] == 'D') && (RfRx.RXDATA.DataBuf[2] == '1'))//控制LED1
{
if(RfRx.RXDATA.DataBuf[3] == '1')
{ HalLedSet(HAL_LED_1, HAL_LED_MODE_FLASH);
}
else if(RfRx.RXDATA.DataBuf[3] == '0')
{ HalLedSet(HAL_LED_1, HAL_LED_MODE_OFF);
}
}
else if((RfRx.RXDATA.DataBuf[1] == 'D') && (RfRx.RXDATA.DataBuf[2] == '2'))//控制LED2
{ if(RfRx.RXDATA.DataBuf[3] == '1')
{ HalLedSet(HAL_LED_2, HAL_LED_MODE_FLASH);
}
else if(RfRx.RXDATA.DataBuf[3] == '0')
{ HalLedSet(HAL_LED_2, HAL_LED_MODE_OFF);
}
}
}
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
RfTx.TXDATA.DataBuf[0] = 'O';
RfTx.TXDATA.DataBuf[1] = 'K';
RfHaveTxDara = 1;
}//end LED测试
else if((RfRx.RXDATA.HeadCom[1] == 'D') && (RfRx.RXDATA.HeadCom[2] == 'A'))//
{
if(SensorNum == 12)//DAC输出 { temp1 = RfRx.RXDATA.DataBuf[0]; temp1
temp2 = RfRx.RXDATA.DataBuf[2]; temp2
DAC_OUT_CON(temp1, temp2);
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
RfTx.TXDATA.DataBuf[0] = 'O';
RfTx.TXDATA.DataBuf[1] = 'K';
RfHaveTxDara = 1; }
}//end DAC_OUT测试
else if((RfRx.RXDATA.HeadCom[1] == 'M') && (RfRx.RXDATA.HeadCom[2] == 'O'))//
{
if(SensorNum == 15)//电机测试 {
if((RfRx.RXDATA.DataBuf[0] == 'M') && (RfRx.RXDATA.DataBuf[1] == '1'))
{
if(RfRx.RXDATA.DataBuf[2] == '0')//停止
{
MOTOR_Con(1, 0x8F);
}
else if(RfRx.RXDATA.DataBuf[2] == '1')//正转
{
MOTOR_Con(1, 0x80);
}
else if(RfRx.RXDATA.DataBuf[2] == '2')//反转
{
MOTOR_Con(1, 0x88);
}
}
else if((RfRx.RXDATA.DataBuf[0] == 'M') && (RfRx.RXDATA.DataBuf[1] == '2'))
{
if(RfRx.RXDATA.DataBuf[2] == '0')//停止
{
MOTOR_Con(2, 0x8F);
}
else if(RfRx.RXDATA.DataBuf[2] == '1')//正转
{
MOTOR_Con(2, 0x80);
}
else if(RfRx.RXDATA.DataBuf[2] == '2')//反转
{
MOTOR_Con(2, 0x88);
}
}
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
RfTx.TXDATA.DataBuf[0] = 'O';
RfTx.TXDATA.DataBuf[1] = 'K';
RfHaveTxDara = 1;
}
}//end MOTOR电机测试
else if((RfRx.RXDATA.HeadCom[1] == 'E') && (RfRx.RXDATA.HeadCom[2] == 'D'))//点阵屏测试
{
if(SensorNum == 1)//点阵屏板 {
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
if((RfRx.RXDATA.DataBuf[0] >= '0') && (RfRx.RXDATA.DataBuf[0]
LCDUPDATA = 1;
DispNum = RfRx.RXDATA.DataBuf[0]-0x30;
RfTx.TXDATA.DataBuf[0] = 'O';
RfTx.TXDATA.DataBuf[1] = 'K'; } else {
RfTx.TXDATA.DataBuf[0] = 'E';
RfTx.TXDATA.DataBuf[1] = '0';
} RfHaveTxDara = 1; } } else if((RfRx.RXDATA.HeadCom[1] (RfRx.RXDATA.HeadCom[2] == 'U'))//数码管屏测试
{
if(SensorNum == 2)//数码管屏板 {
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
temp1 = RfRx.RXDATA.DataBuf[0];
temp1
temp1 += RfRx.RXDATA.DataBuf[1];
if(temp1
{
LEDDispNum = temp1;
LEDDISPFUN();//显示数据
LCDUPDATA = 1;
RfTx.TXDATA.DataBuf[0] = 'O';
RfTx.TXDATA.DataBuf[1] = 'K';
}
else
{
RfTx.TXDATA.DataBuf[0] = 'E';
RfTx.TXDATA.DataBuf[1] = '0';
} RfHaveTxDara = 1; }
== 'N') && }
else if((RfRx.RXDATA.HeadCom[1] == 'B') && (RfRx.RXDATA.HeadCom[2] == 'L'))//测试电池电压
{
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
temp = ReadSensorAdc(4);
RfTx.TXDATA.DataBuf[0] = temp;
RfHaveTxDara = 1;
} else if((RfRx.RXDATA.HeadCom[1] == 'B') (RfRx.RXDATA.HeadCom[2] == 'E'))//测试蜂鸣器
{
if((SensorNum == 4) || (SensorNum == 9))
{
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
if(RfRx.RXDATA.DataBuf[0] == '1') {
if(SensorNum == 4)
{
BEEPState1 = 2;
}
else
{
BEEPState2 = 2;
} }
else if(RfRx.RXDATA.DataBuf[0] == '0') {
if(SensorNum == 4)
{
BEEPState1 = 0;
P1_6 = 1;
}
else
{
BEEPState2 = 0;
P1_4 = 1;
} }
&&
RfTx.TXDATA.DataBuf[0] = 'O';
RfTx.TXDATA.DataBuf[1] = 'K';
RfHaveTxDara = 1;
}
} else if((RfRx.RXDATA.HeadCom[1] == 'R') && (RfRx.RXDATA.HeadCom[2] == 'E'))//控制继电器
{
if(SensorNum == 6)//继电器板
{
if((RfRx.RXDATA.DataBuf[0] == 'K') && (RfRx.RXDATA.DataBuf[1] == '1'))
{
if(RfRx.RXDATA.DataBuf[2] == '1')
{
Relay1State = 1;
P1_4 = 1;
}
else if (RfRx.RXDATA.DataBuf[2] == '0')
{
Relay1State = 0;
P1_4 = 0;
}
}
else if((RfRx.RXDATA.DataBuf[0] == 'K') && (RfRx.RXDATA.DataBuf[1] == '2'))
{
if(RfRx.RXDATA.DataBuf[2] == '1')
{
Relay2State = 1;
P1_5 = 1;
}
else if (RfRx.RXDATA.DataBuf[2] == '0')
{
Relay2State = 0;
P1_5 = 0;
}
}
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
RfTx.TXDATA.DataBuf[0] = 'O';
RfTx.TXDATA.DataBuf[1] = 'K';
RfHaveTxDara = 1;
}
}//end 控制继电器
else if((RfRx.RXDATA.HeadCom[1] == 'L') && (RfRx.RXDATA.HeadCom[2] == 'L'))//控制高亮LED
{
if(SensorNum == 17)//高亮LED板
{
memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);
ChangT3Cmp0Val(RfRx.RXDATA.DataBuf[0]);
RfTx.TXDATA.DataBuf[0] = 'O';
RfTx.TXDATA.DataBuf[1] = 'K';
RfHaveTxDara = 1;
}
}//end 控制高亮LED
break;
}//end if(RfHaveTxDara)//如果有数据要发送
{
RfTx.TXDATA.Head = '&';
RfTx.TXDATA.LastByte = '*';
SendData(0x0000, RfTx.TxBuf, 32);//发送数据
RfHaveTxDara = 0; } #endif } 4.实验总结
主要是通过组网来使协调器与终端器进行数据的交流与反馈,当LED灯显示时,LED显示屏也会显示相应状态,进行信息反馈。
人人范文网 m.inrrp.com.cn 手机版