程序1

1.下边这个程序是router中的程序

PRIVATE void vSendData(void)
{
    const uint16 SensornameNO = 1
    AF_Transaction_s asTransaction[1];
   //发送到公共节点的信息格式
    asTransaction[0].u8SequenceNum = u8AfGetTransactionSequence(TRUE);
    asTransaction[0].uFrame.sMsg.u8TransactionDataLen = 8;
    asTransaction[0].uFrame.sMsg.au8TransactionData[0] = sBattSensor.u16Reading;
        asTransaction[0].uFrame.sMsg.au8TransactionData[1] = sBattSensor.u16Reading >> 8;
    asTransaction[0].uFrame.sMsg.au8TransactionData[2] = sTempHumiditySensor.u16TempReading;
        asTransaction[0].uFrame.sMsg.au8TransactionData[3] = sTempHumiditySensor.u16TempReading >> 8;
    asTransaction[0].uFrame.sMsg.au8TransactionData[4] = sTempHumiditySensor.u16HumidReading;
        asTransaction[0].uFrame.sMsg.au8TransactionData[5] = sTempHumiditySensor.u16HumidReading >> 8;
        asTransaction[0].uFrame.sMsg.au8TransactionData[6] = SensornameNO;
        asTransaction[0].uFrame.sMsg.au8TransactionData[7] = SensornameNO >> 8;


    (void)afdeDataRequest(APS_ADDRMODE_SHORT,       /* Address type */
                          0x0000,                   /* Destination address协调器地址 */
                          WSN_DATA_SINK_ENDPOINT,   /* destination endpoint */
                          WSN_DATA_SOURCE_ENDPOINT, /* Source endpoint */
                          WSN_PROFILE_ID,           /* Profile ID */
                          WSN_CID_SENSOR_READINGS,  /* Cluster ID */
                          AF_MSG,                   /* Frame type */
                          1,                        /* Transactions */
                          asTransaction,            /* Transaction data发送数据 */
                          APS_TXOPTION_NONE,        /* Transmit options */
                          SUPPRESS_ROUTE_DISCOVERY, /* Route discovery mode */
                          0);                       /* Radius count */
}

鉴于只能发int型的数据,没办法只好从HtsDriver.c中的u16HTSreadTempResult(void)函数中 保留一位精度。

PUBLIC uint16 u16HTSreadTempResult(void)
{

    uint32 u32Result;
    u32Result = (uint32)u16ReadMeasurementResult();
    u32Result = u32Result * 410- 405500;//此处比原来扩大十倍,保留了一位精度
    return (uint16)(u32Result / 1024);

}
router程序修改完了


2.协调器中程序修改,有两个方法

(1) 方法一
PRIVATE void vTxSerialDataFrame(uint16 u16NodeId,
                                uint16 u16Humidity,
                                uint16 u16Temperature,
                                uint16 u16BattVoltage,
                                uint16  sensorname)
{
        vPrintf("\n\r\n\rA %x", u16NodeId);
        vPrintf("\n\rH %d", u16Humidity);
      vPrintf("\n\rT %f", (double)((double)u16Temperature/10));//以float型输出,u16Temperature/10产生了小数点。但是vPrintf函数中不支持float输出

       vPrintf("\n\rV %d", u16BattVoltage);
        vPrintf("\n\rSN %d", sensorname);
        #endif
}

在vPrintf中添加如下代码
int32 i;
    double j;
    double k;
    int n=0;//浮点数小数点后0的个数
    int m;
//下边是重点
case 'f':
          j = va_arg(ap,double);
           i = (int32)j;
           vNum2String(i,10);
           vPutChar('.');
           k=(j-i);
           while((0<k)&(k<0.1))
           {
                   k *= 10;
                   n++;
                   if(n >=16)
                   {
                 k=0;
                 n=15;
                   }
           }
           for(m=0;m<n;m++)
           {
                   vNum2String(0, 10);
           }
           k *= 10;//这里我改为了10,因为只需要一位小数就OK
           vNum2String(k, 10);
           break;

(2)方法二
把 整数转成了字符串。
PRIVATE void vTxSerialDataFrame(uint16 u16NodeId,
                                uint16 u16Humidity,
                                uint16 u16Temperature,
                                uint16 u16BattVoltage,
                                uint16  sensorname)
{
    #ifndef GDB
    char T[4];
     T[2]='.';//因为保留一位小数,在此添加小数点
    T[4]='\0';
    switch(u16Temperature/100)
    {
        case 0:T[0]='0';break;
        case 1:T[0]='1';break;
        case 2:T[0]='2';break;
        case 3:T[0]='3';break;
        case 4:T[0]='4';break;
        case 5:T[0]='5';break;
        case 6:T[0]='6';break;
        case 7:T[0]='7';break;
        case 8:T[0]='8';break;
        case 9:T[0]='9';break;
        default:break;
    }
    switch(u16Temperature%100/10)
    {
        case 0:T[1]='0';break;
        case 1:T[1]='1';break;
        case 2:T[1]='2';break;
        case 3:T[1]='3';break;
        case 4:T[1]='4';break;
        case 5:T[1]='5';break;
        case 6:T[1]='6';break;
        case 7:T[1]='7';break;
        case 8:T[1]='8';break;
        case 9:T[1]='9';break;
        default:break;
    }
switch(u16Temperature%100%10)
    {
        case 0:T[3]='0';break;
        case 1:T[3]='1';break;
        case 2:T[3]='2';break;
        case 3:T[3]='3';break;
        case 4:T[3]='4';break;
        case 5:T[3]='5';break;
        case 6:T[3]='6';break;
        case 7:T[3]='7';break;
        case 8:T[3]='8';break;
        case 9:T[3]='9';break;
        default:break;
    }
        vPrintf("\n\r\n\rA %x", u16NodeId);
        vPrintf("\n\rH %d", u16Humidity);
           vPrintf("\n\rT %s",T);  //输出 转化完成的字符串,vPrintf中支持字符串。
        vPrintf("\n\rV %d", u16BattVoltage);
        vPrintf("\n\rSN %d", sensorname);
        #endif
}

3关于节点休眠
在router程序的JZA_vStackEvent中添加以下代码

vAHI_WakeTimerEnable(E_AHI_WAKE_TIMER_0,TRUE);//唤醒时钟使能
            vAHI_WakeTimerStart(E_AHI_WAKE_TIMER_0,32000*60);//32000*60是休眠一分钟
            u8AHI_WakeTimerFiredStatus();
             vAHI_PowerDown( FALSE ); // False -> Sleep; TRUE -> Deep Sleep
            //vBosRequestSleep(TRUE);//False不带内存休眠;TRUE带内存休眠,在Zigbee中必须使用这种模式


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
单片机可以通过中断来实现按键检测和程序切换。具体实现过程如下: 1. 初始化两个程序,分别为程序1和程序2,并设置一个标志位flag,初始值为0,表示程序1正在运行。 2. 配置按键为中断触发模式,并设置中断服务函数。 3. 中断服务函数中,检测按键的状态,如果按键被按下,则将flag取反。 4. 在程序1和程序2中加入while循环,不断检测flag状态,如果flag为1,则退出当前程序,进入另一个程序。 5. 在程序1和程序2的结尾处,加入清除标志位的代码,将flag恢复为0,表示程序1正在运行。 6. 在主函数中,初始化程序1,进入while循环,不断运行程序1。 示例代码如下: ```c #include <reg52.h> sbit button = P1^0; // 按键连接到P1.0口 bit flag = 0; // 标志位,初始值为0 void program1() { while (1) { // 程序1代码 if (flag) { // 如果flag为1,则退出程序1 flag = 0; // 清除标志位 return; } } } void program2() { while (1) { // 程序2代码 if (!flag) { // 如果flag为0,则退出程序2 flag = 1; // 清除标志位 return; } } } void button_isr() interrupt 0 { if (button == 0) { // 检测按键是否按下 flag = !flag; // 取反标志位 } } void main() { EA = 1; // 开启总中断 EX0 = 1; // 开启外部中断0 IT0 = 1; // 配置外部中断0为下降沿触发 while (1) { program1(); // 运行程序1 } } ``` 在上面的示例代码中,按键被按下时,会触发外部中断0,进入中断服务函数button_isr(),里面会取反标志位flag的值。在程序1和程序2中,不断检测flag的值,如果flag为1,则退出当前程序,进入另一个程序。在主函数中,不断运行程序1。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ANTRK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值