三菱无机房通讯解析

#include "elenessamessage.h"


u8 ioio;
/******************** IO配置函数 **************************/     //-------
void    tongxunGPIO_config(void)                         // ------//改一下输出模式,复位值改装
{
/****模块下面做完注释掉*******——————————————————————————————————————————————————————————————————————————————————————————————*
    P2M0 = 0;         //设置准双向口
    P2M1 = 0;       **/


    P5M0 = 0;         //设置准双向口       //
    P5M1 = 0;
/****模块下面做完注释掉*******——————————————————————————————————————————————————————————————————————————————————————————————**
        P1M0 = 0xff;    //设置led推挽输出模式(调试专用)  //模块调用不需要
    P1M1 = 0;     **/

   TXGZ1=0;TXGZ2=0;

}
//***************100us软定时----------------------------//大概采样中间值
//版本2017年10月31日 15:14:08
     void Delay100us()        //@11.0592MHz
{
    unsigned char i, j;

    _nop_();
    _nop_();
    i = 2;
    j = 15;
    do
    {
        while (--j);
    } while (--i);
}



//***************200us软定时----------------------------
//版本2017年10月31日 15:14:08
void Delay200us()        //@11.0592MHz   软件定时器
{
    unsigned char i, j;

    i = 3;
    j = 35;
    do
    {
        while (--j);
    } while (--i);
}

/*******这个直接累加多少个200us
//版本2017年10月31日 15:14:08

void  delay_200us(unsigned char us)
{     unsigned char k;
for(k=0;k<us;k++)
Delay200us();
}
****/

/******************** 判断是否有数据变化否者将停止运行寻找id地址,将亮通讯故障灯 **************************/
//版本2017年10月31日
u8 tongxunguzhang()
 {
   u8  i;i=0;
   while(KEYGAODI)                 //如果电平下降跳出
   {i++; Delay200us();
   if(i==250)
   return 0;} //如果电平一直不下降或者上升,将返回故障
   i=0;
   while(!KEYGAODI)
   {i++; Delay200us();if(i==12)return 0;} //如果电平一直不下降或者上升,将返回故障
   i=0;
   while(KEYGAODI)
   {i++; Delay200us();if(i==12)return 0;} //如果电平一直不下降或者上升,将返回故障
   return 1;
 }



/******************** 寻找数据头下降沿下降函数 **************************/
//版本2017年10月31日
//
//     寻找5ms          10次是2ms  15次 刚好3ms  就是连续采集到15次,表示高电平
//--------______----

bit xunzhi()
{
 unsigned char i=0;
 unsigned char j=0;
 //TXGZ3=1;           //避免陷入死循环,如果不陷入死循环,将很快灭掉
 do
 {
 if(KEYGAODI==1)
 i++;
 else
 {i=0;j++;if(j>254)return 0;}         //如果一直低电平故障,将跳出0值
 Delay200us();
 } while (i<15);
 return 1;                             //检测到大于3ms的高电平值1
}


//**********************读取id值****************************
//版本2017年10月31日   基本没变
void duqu()
{    ioio=0;

 while(KEYGAODI);//等待电平下降或者上  _nop_();
 Delay100us(); Delay200us();
if(!KEYGAODI)      //第一位  因为三菱编码加密缘故,从低往高读取,需右移,
     {ioio>>=1;
      ioio=(ioio|0x80);}
      else
      ioio>>=1;
    Delay200us();
if(!KEYGAODI)      //第2位  因为三菱编码加密缘故,从低往高读取,需右移,
     {ioio>>=1;
      ioio=(ioio|0x80);}
      else
      ioio>>=1;
    Delay200us();
if(!KEYGAODI)      //第3位  因为三菱编码加密缘故,从低往高读取,需右移,
     {ioio>>=1;
      ioio=(ioio|0x80);}
      else
      ioio>>=1;
    Delay200us();
if(!KEYGAODI)      //第4位  因为三菱编码加密缘故,从低往高读取,需右移,
     {ioio>>=1;
      ioio=(ioio|0x80);}
      else
      ioio>>=1;
    Delay200us();
if(!KEYGAODI)      //第5位  因为三菱编码加密缘故,从低往高读取,需右移,
     {ioio>>=1;
      ioio=(ioio|0x80);}
      else
      ioio>>=1;
    Delay200us();
if(!KEYGAODI)      //第6位  因为三菱编码加密缘故,从低往高读取,需右移,
     {ioio>>=1;
      ioio=(ioio|0x80);}
      else
      ioio>>=1;
    Delay200us();
if(!KEYGAODI)      //第7位  因为三菱编码加密缘故,从低往高读取,需右移,
     {ioio>>=1;
      ioio=(ioio|0x80);}
      else
      ioio>>=1;
    Delay200us();
if(!KEYGAODI)      //第8位  因为三菱编码加密缘故,从低往高读取,需右移,
     {ioio>>=1;
      ioio=(ioio|0x80);}
      else
      ioio>>=1;
    Delay200us();    


}

u8 panduan()
{  u8 k=0;     u8 kk=0;
 if(tongxunguzhang())  //判断是否通讯正常
 //if(1)  //判断是否通讯正常
  { 
  while(k!=40)           //找到f7  f7  f8   第4个才为楼层数据   
   {
   if(xunzhi())//需找5ms空隙 
    { duqu();        //读取ip值
     if(ioio==0xf7)  //是否这个值,如果是,找到该值_ _ _ -_ _ _ _11101111(oxf7)   //注意这个值以  测量为准
     {
     Delay200us();
     duqu();
     if(ioio==0xf7)    //在此寻找f7
        {
        Delay200us();
        duqu();
        if(ioio==0xf8)    //在此寻找f8
         {
         Delay200us();
         duqu();
         kk=ioio;
         //退出循环
         return kk;
         }
        }
     }
    }
     k++;
   }
  {TXGZ2=1;
  
  /****模块下面做完注释掉*******——————————————————————————————————————————————————————————————————————————————————————————————**
  P1=0x83;     **/

  return 0x30;
  }    //20次  找不到数据值1     ————————————————————一定要在外面做数据灯,万一陷入死循环


   }
 else
 {TXGZ1=1;
 /****模块下面做完注释掉*******——————————————————————————————————————————————————————————————————————————————————————————————**
 P1=0xff;       **/

 return 0x2f;
 }//通讯故障亮起 //可以设置
}
无机房
#ifndef __ELENESSAMESSAGE_H
//        elenessamessage.h           
#define    __ELENESSAMESSAGE_H
#include    "STC15.H"
#include <intrins.h>
#include    "config.h"
//typedef     unsigned char    u8;
//typedef     unsigned int    u16;
//typedef     unsigned long    u32;

//下面是所需要的io口
#define KEYGAODI P53       ////接受信号io
#define TXGZ1 P50           //直接没检测到信号 亮起
#define TXGZ2 P51          //20次没记录亮起
//#define TXGZ3 P52          //死循环亮起
void    tongxunGPIO_config(void);//初始化io模块        //占用了p5, 模块调试玩注释掉p2(复位)  p1(led)
u8 panduan();  //直接读取值出来, //30(20次  找不到数据值)....2f是通讯直接有问题故障吗



#endif
/*****
 u8 kkk[64]={0x40,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,
          //   10
              0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40,
             //20
             0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40,
             //30
             0x40,0x3f,0x86,0xdb, 0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40, 0x40,0x40,0x3f,0x86};
****/
无机房.h

分析了数据花了三天,有些数据不想分析了,只是分析我想要的楼显数据,这里只是做显示作用。

不提供远程控制作用,也不会做,也不想做,做了等于侵权。

本人学习用的,难免不足,不提供技术支援。

禁止商业用途,仅限学习交流使用。

猜你喜欢

转载自www.cnblogs.com/chenfeiguoguo/p/9030866.html
今日推荐