找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1149|回复: 0
收起左侧

EV1527学习码无线遥控汽车防盗器单片机程序资料

[复制链接]
ID:1012383 发表于 2024-7-30 08:45 | 显示全部楼层 |阅读模式
EV1527是一片由CMOS设计制造的可预
烧内码的学习码编码芯片,由软件解码。内码共有2O位
元可预烧100万组内码组合,大大降低了使用编码上重复
的机率。更重要的是其不可复制性,并且由于可以自学
习,当发射模块丢了,只要对接收模块进行自学习就可以
使原先的发射模块失效,大大提高了安全性

单片机源程序如下:
  1. /*

  2. ;======================硬件结构======================
  3. ;
  4. ;                          __________
  5. ;         
  6. ;     
  7. */

  8. //8路控制程序
  9. //
  10. #include <pic.h>
  11. __CONFIG( WDTDIS  & PWRTEN &INTOSCIO & MCLRDIS & BOREN & CPD &  CPROTECT);


  12. #define uchar unsigned char
  13. #define uint  unsigned int




  14. #define rfin                 RA0
  15. #define        learnkey    RA5
  16. #define        LED                        RA4
  17. #define   VT        RA1

  18. #define        OUT1                        RC2
  19. #define        OUT2                        RC1
  20. #define        OUT3                        RC0
  21. #define        OUT4                        RA2
  22. #define        L_M                                RC5



  23. #define        max_how                15




  24. //学习变量
  25. uchar        learnbuf0;
  26. uchar        learnbuf1;
  27. uchar        learnbuf2;
  28. //===================//
  29. bit        learnf;
  30. bit        fun_out;
  31. bit learn_ok;
  32. bit        fun_ok;

  33. //========================//
  34. //记时间变量
  35. uchar        temp0;
  36. uchar        temp1;
  37. uchar        temp2;

  38. uchar        out_temp0;
  39. uchar        out_temp1;

  40. //=========================//
  41. //RF接收变量
  42. uchar        rec_count;
  43. uchar        lo_buf;
  44. uchar        hi_buf;
  45. uchar        cs2;
  46. uchar        cs1;
  47. uchar        cs0;

  48. //RF接收标志
  49. bit        rfstart1;
  50. bit        rfstart;
  51. bit        rfok;
  52. bit  rf_er;//接收失败



  53. //===============================//
  54. //定时中断
  55. void interrupt all ()
  56. {

  57.                

  58.         CLRWDT();
  59.         temp0++;
  60.         out_temp0++;
  61. if(T0IF==1)
  62.                         {
  63.                         T0IF=0;
  64.                         TMR0=0;
  65.                
  66.                         }

  67. if(TMR1IF==1)
  68.                           {
  69.                         TMR1IF=0;//清中断标志位
  70.                         TMR1L=180;
  71.                         TMR1H=255;
  72.                        
  73.                         }
  74. if(out_temp0>200)
  75.                         {
  76.                         out_temp0=0;
  77.                         out_temp1++;
  78.                                 if(out_temp1>20)
  79.                                         {
  80.                                         out_temp1=0;
  81.                                         VT=0;

  82.                                                 if(L_M==0)
  83.                                                 {
  84.                                                 OUT1=0;
  85.                                                 OUT2=0;
  86.                                                 OUT3=0;
  87.                                                 OUT4=0;
  88.                                                 }
  89.                                         }
  90. /*

  91.                                 if(out_temp1>30)
  92.                                         {
  93.                                         out_temp1=0;

  94.                                         if(L_M==0)
  95.                                                 {
  96.                                                 OUT1=0;
  97.                                                 OUT2=0;
  98.                                                 OUT3=0;
  99.                                                 OUT4=0;
  100.                                                 }
  101.                                
  102.                                         }
  103. */

  104.                         }





  105.                
  106. //时间程序
  107. if(temp0>200)//2MS
  108.                         {
  109.                         CLRWDT();
  110.                         temp0=0;
  111.                         temp1++;
  112.                         if(temp1>10)
  113.                                                 {
  114.                                                 fun_ok=0;
  115.                                        
  116.                                                 }

  117.                         if(temp1>50)
  118.                                                 {
  119.                                        
  120.                                                
  121.                                                 }

  122.                         if(temp1>8)
  123.                                                 {
  124.                                                 learn_ok=0;//400ms

  125.                                                 }

  126.                         if(temp1>200)
  127.                                                 {
  128.                                                
  129.                                                 CLRWDT();
  130.                                                 temp1=0;
  131.                                                 temp2++;
  132.                                                 if(temp2>6)
  133.                                                                 {
  134.                                                                 learnf=0;//学习时间为20秒
  135.                                                                 }
  136.                                                 }
  137.                         }

  138. //RF接受程序

  139.    if(rfin==1)
  140.              {  

  141.                         if(rfstart1==1)//由低到高开始接收
  142.                                                 {
  143.                                                         if(lo_buf>hi_buf)//判断是否低电平
  144.                                                                                          {
  145.                                                                                         if(lo_buf>5&&lo_buf<19&&hi_buf>2&&hi_buf<9)
  146.                                                                                                                                   {
  147.                                                                                                                                 rec_count++;//是低电平
  148.                                                                                                                                 cs0<<=1;//移动一位                       
  149.                                                                                                                             }
  150.                                                                                         else
  151.                                                                                                                                 {//接收失败       
  152.                                                                                                                                 rf_er=1;
  153.                                                                                                                                 }
  154.                                                                        
  155.                                                                                      }       
  156.                                
  157.                                                           else if(lo_buf<hi_buf)//判断是否低高电平
  158.                                                                                            {
  159.                                                                                         if(lo_buf>2&&lo_buf<9&&hi_buf>5&&hi_buf<19)//判断高电平是否大于900US和低电平大于200US
  160.                                                                                                                            {
  161.                                                                                                                          rec_count++;//是高电平
  162.                                                                                                                          cs0<<=1;//移动一位
  163.                                                                                                                          cs0++;
  164.                                                                                                                        
  165.                                                                                                                          }
  166.                                                                                  else
  167.                                                                                                                      {       
  168.                                                                                                                
  169.                                                                                                                                 rf_er=1;
  170.                                                                                                                          }
  171.                                                                                  
  172.                                                                                     }


  173.                                                      else if(lo_buf==hi_buf)
  174.                                                                                         {                               
  175.                                                                                
  176.                                                                                         rf_er=1;               
  177.                                                                                         }


  178.                                                   if(rf_er==1)
  179.                                                                         {
  180.                                                                         rfstart=0;//接收失败       
  181.                                                                         rec_count=0;
  182.                                                                         rfok=0;
  183.                                                                         }
  184.                                                   else
  185.                                                                         {
  186.                                                                         if(rec_count==8){cs2=cs0;}
  187.                                                                     else if(rec_count==16){cs1=cs0;}               
  188.                                               
  189.                                                                         }
  190.             
  191.                                     
  192.                                                    if(rec_count==24)
  193.                                                                  {
  194.                                                                    rfok=1;//接收成功        
  195.                                                                  }
  196.                                              hi_buf=0;//rfstart1==1函数                          
  197.                                                 }

  198.                                                                                   
  199.          else   if(lo_buf>30&&lo_buf<180)//判断同步头
  200.                                       {                                                                     
  201.                                                   rfstart=1;//检测到正确的同步头                                               
  202.                                                   rec_count=0;//接收位数,清除0                                                                                                                                                                                                       
  203.                                       }

  204.                 hi_buf++;                                                                                                            
  205.                 lo_buf=0;
  206.                 rfstart1=0;
  207.             rf_er=0;//接收失败标志
  208.            }
  209.                                                                                                    
  210.                  
  211.                                                                                                
  212. //===================================//                                                                                                                                                                                                                                                                                                                                                                                                                                                                
  213. else
  214.              {      //输入端口为低电         
  215.                         lo_buf++;        
  216.                         if(rfstart==1)//开始接收标志
  217.                                         {
  218.                                         rfstart1=1;
  219.                                         }
  220.                         else
  221.                                         {
  222.                                 hi_buf=0;   
  223.                                         }
  224.                  }
  225.   }//TMR1IF==1函数内



  226.           



  227.        
  228. //==============================//                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
  229. void learnkeypr(void)
  230.                         {

  231.                         if(learn_ok==0)//正在学习
  232.                                         {
  233.                                        
  234.                                         uchar  i,b;
  235.                                         uint        j;
  236.                                         LED=0;
  237.                                         CLRWDT();
  238.                                         CLRWDT();
  239.                                         CLRWDT();
  240.                                                
  241.                                         if(learnkey==0)
  242.                                                                 {
  243.                                                                
  244.                                                                         //LED=1;
  245.                                                                         for(j=0;j<=50000;j++){}
  246.                                                                         if(learnkey==0)                                               
  247.                                                                                                 {
  248.                                                                                                 PORTC=0;
  249.                                                                                                 PORTA=0;
  250.                                                                                                 LED=1;
  251.                                                                                                 temp0=0;
  252.                                                                                                 temp1=0;
  253.                                                                                                 temp2=0;
  254.                                                                                                 while((temp2<2)&&learnkey==0)//6==20S
  255.                                                                                                                                         {
  256.                                                                                                                                         LED=1;
  257.                                                                                                                                         CLRWDT();
  258.                
  259.                                                                                                                                         }//长按25秒擦除EE                                                                       
  260.                                                                                                 if(learnkey==0)
  261.                                                                                                                          {
  262.                                                                                                                         LED=1;                       
  263.                                                                                                                         b=0x0ff;
  264.                                                                                                                         for(i=0;i<=127;i++){EEPROM_WRITE(i=i,b);}                                       
  265.                                                                                                                         LED=0;
  266.                                                                                                                         CLRWDT();
  267.                                                                                                                         while(learnkey==0){}                                                                                                                                       
  268.                                                                                                                         }
  269.                                                                                                 else       
  270.                                                                                                                         {
  271.                                                                                                                
  272.                                                                                                                         CLRWDT();

  273.                                                                                                                         temp0=0;
  274.                                                                                                                         temp1=0;
  275.                                                                                                                         temp2=0;
  276.                                                                                                                
  277.                                                                                                                         LED=0;
  278.                                                                                                                         learnf=1;//进入学习
  279.                                                                                                                         }
  280.                                                                                                         }
  281.                                                                 }

  282.                                         }
  283.                         }


  284.                                                

  285. //===============================================//

  286.                                        
  287. void init(void){        //初始化函数
  288.                 CLRWDT();
  289.         OSCCAL=_READ_OSCCAL_DATA();
  290.                 CMCON=0X07;  //关闭比较器
  291. //MOVLW           TRISAV                               ; 0111B
  292. //MOVWF           TRISA
  293. //MOVLW     TRISBV
  294. //MOVWF            TRISC


  295.                 TRISA=0b11101001;
  296.                 TRISC=0b11111000;
  297.        
  298.                 GIE=1;//开总中断
  299.                 PEIE=1;
  300.                 TMR1IE=1;   //开启定时中断1
  301.                 T0IE=0;                //关闭定时器1中断
  302.                 OPTION=0X00; //开内部上拉
  303.                 T1CON=0X01;//使用定时器1
  304.                 TMR1L=180;
  305.                 TMR1H=255;  //定义100US中断一次
  306.                 WPUA=0X0;//关闭上拉
  307.        
  308.                 PORTA=0;
  309.                 PORTC=0;
  310.                         }

  311. void learnok(void)
  312.                         {
  313.                                 LED=1;//学习成功
  314.                                 learn_ok=1;//学习成功
  315.                                 learnf=0;
  316.                                 temp0=0;
  317.                                 temp1=0;
  318.                                 temp2=0;

  319.                         }
  320. void save_learn(void)

  321.                         {
  322.                                
  323.                                 EEPROM_WRITE(127,learnbuf0);//存入指针
  324.                                 learnbuf0=learnbuf0*3;
  325.                                 EEPROM_WRITE(learnbuf0=learnbuf0,cs0);
  326.                                 learnbuf0++;
  327.                                 EEPROM_WRITE(learnbuf0=learnbuf0,cs1);
  328.                                 learnbuf0++;
  329.                                 EEPROM_WRITE(learnbuf0=learnbuf0,cs2);

  330.                                 learnok();
  331.                        
  332.                                
  333.                         }

复制代码


回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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