单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 479|回复: 0
打印 上一主题 下一主题
收起左侧

用pic16f630 MCU實現的315MHZ无线軟件解碼和編碼.代替PT2272和pt2262

[复制链接]
跳转到指定楼层
楼主
jarno 发表于 2019-3-8 14:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <pic.h>   
  2. //#include <pic16630.h>   
  3. #define uchar unsigned char   
  4. #define uint unsigned int   
  5. #define PORTAIT(adr,bit) ((unsigned)(&adr)*8+(bit)) ///絕對尋址位操作指令   
  6. #define PORTCIT(adr,bit)((unsigned)(&adr)*8+(bit)) ///絕對尋址位操作指令   


  7. static bit KEY1 @ PORTAIT(PORTA,0);   
  8. static bit KEY2 @ PORTAIT(PORTA,1);   
  9. static bit KEY3 @ PORTAIT(PORTA,4);   
  10. static bit KEY4 @ PORTAIT(PORTA,5);   

  11. static bit DECODE_POWER_ON_OFF @ PORTCIT(PORTC,0);   
  12. static bit LED1 @ PORTCIT(PORTC,1);   
  13. static bit LED2 @ PORTCIT(PORTC,5);   
  14. static bit BEEP @ PORTCIT(PORTC,2);   
  15. static bit DIN  @ PORTCIT(PORTC,3);   
  16. static bit DOUT @ PORTCIT(PORTC,4);   

  17. uint i;   

  18. uchar keyCode;   
  19. bit sign_key;   




  20. #define Err 0xFF                //當解碼程序發現接收的數據是無效數據時返回此值   

  21. char DeviceAddr[9]="1010ffff";  //報警器的地址,1 接高電平,0 接低電平(地), F 為懸空.(人可讀)   

  22. uchar AddrH,AddrL;              //產品地址(機可讀)   

  23. void delay_150us(uchar t)   
  24. {   uchar k;   
  25.     uchar j;   
  26.       for(k=t;k>0;k--)   
  27.       for(j=50;--j;);   
  28. }   
  29. void delay_50us(uchar t)   
  30. {        
  31.       uchar k;   
  32.       uchar i;   
  33.       for(k=t;k>0;k--)   
  34.       for(i=14;--i;);   
  35. }   

  36. void Convert()          //人可讀地址轉換為MCU可讀   
  37. {   
  38.     uchar i;   
  39.     for(i=0;i<4;i++){   
  40.         if(DeviceAddr[i]=='0')   
  41.         {   AddrH<<=2;   
  42.             AddrH|=0;   
  43.         }   
  44.         if(DeviceAddr[i]=='1')   
  45.         {   
  46.             AddrH<<=2;   
  47.             AddrH|=3;   
  48.         }   
  49.         if(DeviceAddr[i]=='f')   
  50.         {   
  51.             AddrH<<=2;   
  52.             AddrH|=1;   
  53.         }   
  54.     }   
  55.         for(i=4;i<8;i++){   
  56.         if(DeviceAddr[i]=='0')   
  57.         {      
  58.             AddrL<<=2;   
  59.             AddrL|=0;              
  60.         }   
  61.         if(DeviceAddr[i]=='1')   
  62.         {   
  63.             AddrL<<=2;   
  64.             AddrL|=3;   
  65.         }   
  66.         if(DeviceAddr[i]=='f')   
  67.         {   
  68.             AddrL<<=2;   
  69.             AddrL|=1;   
  70.         }   
  71.     }   
  72. }   
  73. void Send(uchar *DAddr,uchar SendData)   
  74. {       uchar temp,i;   
  75.         DOUT=1;   
  76.         delay_150us(2);   
  77.         DOUT=0;   
  78.         delay_150us(60);   
  79.         for(i=0;i<8;i++)//Send AddrCode   
  80.         {   temp=*DAddr++;   
  81.             if(temp=='1')   
  82.             {   DOUT=1;   
  83.                 delay_150us(6);   
  84.                 DOUT=0;   
  85.                 delay_150us(2);   
  86.                 DOUT=1;   
  87.                 delay_150us(6);   
  88.                 DOUT=0;   
  89.                 delay_150us(2);               
  90.             }   
  91.             if(temp=='f')   
  92.             {   DOUT=1;   
  93.                 delay_150us(2);   
  94.                 DOUT=0;   
  95.                 delay_150us(6);   
  96.                 DOUT=1;   
  97.                 delay_150us(6);   
  98.                 DOUT=0;   
  99.                 delay_150us(2);   
  100.             }   
  101.             if(temp=='0')   
  102.             {   DOUT=1;   
  103.                 delay_150us(2);   
  104.                 DOUT=0;   
  105.                 delay_150us(6);   
  106.                 DOUT=1;   
  107.                 delay_150us(2);   
  108.                 DOUT=0;   
  109.                 delay_150us(6);   
  110.             }   
  111.         }   
  112.         for(i=0;i<4;i++)///Send Data   
  113.         {   if(SendData&(8>>i))   
  114.             {   
  115.                 DOUT=1;   
  116.                 delay_150us(6);   
  117.                 DOUT=0;   
  118.                 delay_150us(2);   
  119.                 ////////////////////   
  120.                 DOUT=1;   
  121.                 delay_150us(6);   
  122.                 DOUT=0;   
  123.                 delay_150us(2);   
  124.             }   
  125.             else   
  126.             {         
  127.                 DOUT=1;   
  128.                 delay_150us(2);   
  129.                 DOUT=0;   
  130.                 delay_150us(6);   
  131.                 ///   
  132.                 DOUT=1;   
  133.                 delay_150us(2);   
  134.                 DOUT=0;   
  135.                 delay_150us(6);   
  136.             }   
  137.         }   
  138. }   
  139. uchar GetData()//解碼程序   
  140. {      
  141.          uchar i,j,k;   
  142.          uchar ReadCode[3],GetCode;   
  143.          //------------------------找同步頭-------------------------   
  144.          if(!DIN)return Err;   
  145.          delay_150us(3);   
  146.          for(i=0;i<28;i++)   
  147.          {   
  148.             if(DIN)return Err;   
  149.             delay_150us(2);   
  150.          }   
  151.          for(i=0;i<30;i++)   
  152.          {   
  153.             if(DIN)break;   
  154.             delay_50us(1);   
  155.             if(i>25)return Err;//如果超時則返回   
  156.          }   
  157.         //-----------------------接收地址碼和數據碼-----------------   
  158.          for(j=0;j<3;j++)   
  159.          {   
  160.             for(i=0;i<8;i++)   
  161.             {   
  162.                 delay_150us(2);   
  163.                 delay_50us(1);   
  164.                 ReadCode[j]=ReadCode[j]<<1;   
  165.                 ReadCode[j]=ReadCode[j]|DIN;   
  166.                 if(DIN)   
  167.                 {       //while(DIN);//等待0出現   
  168.                         for(k=0;k<255;k++)   
  169.                          {  delay_50us(2);   
  170.                             if(DIN==0)break;   
  171.                             if(k>12)return Err;//超時,返回錯誤代碼   
  172.                          }   
  173.                 }   
  174.                 //while(!DIN);//等待1出現   
  175.                 for(k=0;k<255;k++)   
  176.                  {  delay_50us(2);   
  177.                     if(DIN==1)break;   
  178.                     if(k>12)return Err;//超時,返回錯誤代碼   
  179.                  }   
  180.             }   
  181.          }            
  182.         //-------------------校驗地址及運算數據---------------------   
  183.               if(ReadCode[0]!=AddrH)return Err;   
  184.               if(ReadCode[1]!=AddrL)return Err;//校驗地址   
  185.               GetCode=ReadCode[2]&0x01;   
  186.               GetCode|=(ReadCode[2]&0x04)>>1;   
  187.               GetCode|=(ReadCode[2]&0x10)>>2;   
  188.               GetCode|=(ReadCode[2]&0x40)>>3;   
  189.               return GetCode;   
  190. }   


  191. void delay(){ for(i=6553;i!=0;i--)continue;}   

  192. void beep(void)   
  193. {   uchar i;   
  194.     for(i=0;i<0xff;i++)   
  195.     {   delay_150us(5);   
  196.         BEEP=!BEEP;   
  197.     }   
  198.     BEEP=0;   
  199. }   

  200. void interrupt ISR(void) //中斷服務程序   
  201. {   
  202.     if(RAIE && RAIF)   
  203.     {   RAIF = 0;   
  204.         delay();   
  205.         if(KEY1==0){sign_key=1;keyCode=1;}   
  206.         if(KEY2==0){sign_key=1;keyCode=2;}   
  207.         if(KEY3==0){sign_key=1;keyCode=3;}   
  208.         if(KEY4==0){sign_key=1;keyCode=4;}   
  209.         //PORTA = PORTA;   
  210.     }   
  211. /* if(T0IE && T0IF) //判TMR0 中斷  
  212.     {  
  213.         T0IF = 0; //清除TMR0 中斷標誌  
  214.     }  
  215.     if(TMR1IE && TMR1IF) //判TMR1 中斷  
  216.     {  
  217.         TMR1IF = 0; //清除TMR1 中斷標誌  
  218.     }*/   
  219. }   

  220. void main()   
  221. {   

  222. uchar mydata;   

  223.     DOUT=0; //發送數據端口上電為低電平   
  224.     CMCON=0x07;     //關閉比較器   
  225.     TRISA=0x33;     //PORTA_1為輸入。   
  226.     OPTION=0x7f;    //弱上拉全局控制位使能   
  227.     WPUA=0xFF;      //PORTA弱上拉控制位使能   
  228.     TRISC=0x08;     //設置C口輸入輸出   

  229.   RAIF=0;           //中斷標誌位清零   
  230.   PORTA=0x00;       //配合  PORTA = PORTA 給電平中斷做準備   
  231.   RAIE=1;           //A口電平中斷允許   
  232.   IOCA=0x33;        //A口各個中斷允許   
  233.   GIE =1;           //總中斷允許   
  234.   PORTA = PORTA;      
  235.   Convert();   
  236.   Send("1010ffff",1);   
  237. for(;;){   
  238.     if(sign_key)   
  239.         {   switch(keyCode){   
  240.             case 1:   
  241.                 LED1=0;   
  242.                 Send(DeviceAddr,1);   
  243.                 Send(DeviceAddr,1);   
  244.                 Send(DeviceAddr,1);   
  245.                 Send(DeviceAddr,1);   
  246.                 break;   
  247.             case 2:   
  248.                 Send(DeviceAddr,2);   
  249.                 Send(DeviceAddr,2);   
  250.                 Send(DeviceAddr,2);   
  251.                 Send(DeviceAddr,2);   
  252.                 LED1=1;   
  253.                 break;   
  254.             case 3:   
  255.                 Send(DeviceAddr,4);   
  256.                 Send(DeviceAddr,4);   
  257.                 Send(DeviceAddr,4);   
  258.                 Send(DeviceAddr,4);   
  259.                 LED2=1;   
  260.                 DECODE_POWER_ON_OFF=1;   
  261.                 break;   
  262.             case 4:   
  263.                 Send(DeviceAddr,8);   
  264.                 Send(DeviceAddr,8);   
  265.                 Send(DeviceAddr,8);   
  266.                 Send(DeviceAddr,8);   
  267.                 DECODE_POWER_ON_OFF=0;   
  268.                 LED2=0;   
  269.                 break;   
  270.             }   
  271.             sign_key=0;   
  272.             //beep();   
  273.         }   

  274.         mydata=GetData();   
  275.             if(mydata!=Err)   
  276.             {   
  277.                 if(mydata==1)LED1=0;   
  278.                 if(mydata==2)LED1=1;   
  279.                 if(mydata==4)LED2=0;   
  280.                 if(mydata==8)LED2=1;   
  281.             }   


  282. }   



  283. }   
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机 联系QQ:125739409;技术交流QQ群582644647

Powered by 单片机教程网

快速回复 返回顶部 返回列表