⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dx_rf.c

📁 本程序为RF收发程序
💻 C
字号:
#include <reg51.h>                             /* define 8051 registers */
//用外部中断判断脉冲长度,最后一位不收
//Jam_kiss根据zizzfish大虾的提示更改后的遥控接收程序
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;

sbit rmt = P3^2;


bit rf_end;     //用以标志遥控器已经接收完毕
bit rf_ax;      //遥控已经有键按下标示位

unsigned char time100ms,time10ms;
unsigned char count_bit;         //用以计数8位数据计数,>8表示完
unsigned char count_byte;        //用以计数遥控器4BYTE计数,>4表示完
bdata unsigned char rf_key[4];   //用以保存遥控器接收数据的保存,前2字节为地址,后2字节为数据
//sbit rf_bcw_h = rf_key[3]^7;   //用以招收数据用与 rf_key[3]


//以下为遥控接收程序
void rf_zx()
{
//遥控功能执行程序
}
bit rf_comp()
{
     bit add_comp=0;

    if ((((rf_key[2] ^ rf_key[3])|0x80)==0x0ff)&&(rf_key[0]==0x02)&&(rf_key[0] ^ rf_key[1]==0x0ff))//比较接收的数据是否正确,
        { add_comp=1;  }
    return(add_comp);
}
void rf_lf()
{
     //遥控连发功能程序
}
void rf_cl(bit rec_data)
{
     uchar temp;
     rf_key[3]>>=1;
     temp=temp|(uchar)(rec_data);
     temp<<=7;
     rf_key[3]|=temp;
     if((count_byte==3)&&(count_bit==6))
     {count_bit++;rf_end=1;rf_key[3]>>=1;}
     if((++count_bit)==8)    //是否一个字节读完
     {
          count_bit=0;
          rf_key[count_byte]=rf_key[3];//保存数据
          if((++count_byte)==4)     //判断是否读完4个字节数据
          {
               if(rf_comp()==1) //判断是否招收数据
               {
                    time100ms=0;
                    rf_ax=1;     //设置有键按下标志
                    rf_zx();
               }
          }
     }
}
//120--30.9ms  连发占空脉冲
//52---13.5ms  头脉冲
//44.9--11.5ms  连发头脉冲
//8.75--2.24ms  1脉冲
//4.3--1.12ms   0脉冲
void rf()
{
     if(TH1<100)
     {
          if(TH1>50){count_bit=0;count_byte=0;}
          else if((TH1>40))
          {
               if(rf_ax==1)
               {
                    time100ms=0;
                    rf_lf();
               }
          } //连发头脉冲,调用连发处理程序
          else if(TH1>5)
          {rf_cl(1);}//遥控1值保存
          else if(TH1>1)
          {rf_cl(0);}//遥控0保存
     }
}
void ex0() interrupt 0
{
     TR1=0;
     if(rf_end==1)
     {rf_end=0;}
     else
     {
          rf();
          TH1=TL1=0;
          TR1=1;
     }
}
void scan() interrupt 1    //定时器中断为200US
{
      ET0=0;
      if (time10ms<50)//50*200us
      {
            time10ms++;
      }
      else
      {
            time10ms=0;
            if(rf_ax==1)
            {
               if(++time100ms>11)//; //1140ms遥控用以计数连发脉冲时间有效接收时间
               {
                    rf_ax=0;
                    TH1=TL1=0;
                    TR1=0;
               }
            }
      }
      ET0=1;
}/*******************************************************/
void main()
{
    TMOD=0x12;           //设置定时器1为模式1,定时器0为模式2
    TH0=TL0=256-200;       //100us      //改为200
    EA=1;
    EX0=1;
    PX0=1;
    IT0=1;
    ET0=1;
    TR0=1;
    while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -