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

📄 rf2272.c

📁 解码2272模拟程序,调试通过,需要者也可和我联系
💻 C
字号:
/*头码时间4.7ms,每个码1.3ms,码长17ms,单片机晶振为12M时,一个周期为1us
每个码均长为1300/4=325us ,time>325 and time <650时,bit =1
time >100(干扰)and time <325时, bit=0; 
*/
#include <my_89x51.h>

#define uint unsigned int
#define ulong unsigned long
#define uchar unsigned char

sbit RemPin  =   P3^3  ; 
sbit LEDR =P1^3; 
sbit LEDG =P1^4;
uchar receive[3];//二位地址码+一位数据码



//------------------------------------- sub functon ----------------------------------------------

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void d1ms (uint ljh_in)    /*1mS延时函数*/
{
 uint data ljh_i;
 uchar data ljh_j;
 for(ljh_i=0;ljh_i<ljh_in;ljh_i++){
 for(ljh_j=0;ljh_j<108;ljh_j++){
 _nop_(); _nop_();
 _nop_(); _nop_();
 _nop_(); _nop_();
 }
 }
}
//<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<
void ledg()
{
		d1ms(100);
		LEDG=1;
		d1ms(100);
		LEDG=!LEDG;
		d1ms(100);
		LEDG=!LEDG;
		d1ms(100);
		LEDG=0;
}
//<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<
void ledr()
{
		d1ms(50);
		LEDR=1;
		d1ms(50);
		LEDR=0;
		d1ms(50);
		LEDR=1;
		d1ms(50);
		LEDR=1;
		d1ms(50);
		LEDR=0;
}
//对接收的数据进行分析处理
void RW_E2ROM()
{	
	uchar i,j,temp,num,temp1;
	i2c_read(0xb0, 1, &num);
	j = 0xb1;
	for(i=0;i<num;i++)
	{
		i2c_read(j, 1, &temp);
		j++;
	}	
;

	temp1 = temp + 0x30; 
	i2c_write(0x2d, 1, &temp1);
}

//无线中断接收int 
void RemIn(void) interrupt 2 using 1
{
    unsigned char i,j;
    unsigned int temp;

 	EA=0;
	TH0 = TL0 = 0;
   while (!RemPin); //等待高电平
    TR0=1;
    while (RemPin)  //等待低电平
        {if (TF0==1)  goto RemExit;}  //超时就退出;
    TR0=0;
    temp=TH0;
    temp=(temp<<8)+TL0;
//    if (temp>6000 || temp<4000)   //判断同步码的宽度
    if (temp>3000 || temp<2000)   //判断同步码的宽度 6M晶振
    {
        temp=TH0;
		goto RemExit;
    }
//同步码检测成功
    for (i=0; i<3; i++) {//解 3*8=24 位码 
	    for (j=0; j<8; j++)
	    {
	        while (!RemPin);  //等待高电平
	        TH0=0;
	    	TL0=0; 
		 	TR0=1;
	        while (RemPin)  //等待低电平
	            {if (TF0==1) goto RemExit; }//超时就退出
	  			TR0=0;
	    	    temp=TH0;
	    	    temp=((temp<<8)+TL0);

//	        if (temp>400 && temp<600)
	        if (temp>200 && temp<300)//6m晶振
	        {
	            receive[i]=receive[i]<<1;
	            receive[i]=receive[i]+1; //保存 1
	        }
//	        else if (temp>100 && temp<234)
	        else if (temp>50 && temp<117)//6M晶振
	            {
	                receive[i]=receive[i]<<1;   //保存0
	            }
	            else goto RemExit;
	    }
	}
    temp=0;//在这里设置一个断点,运行到这里后看看receive里的三个字节数据就是解码的结果

    while ((receive[0] == 0xea)&&(receive[1] == 0xaa))
	ledg();
	RemExit:
   	{
 	    TR0=0;
  		EA=1;
        RemPin=1;
        TF0=0;
        return; 
   	}
 
}

main()
{
	P1 =0xff;
	P3 =0xff;
    RemPin=1;
    IT1=1;  //设定INT1的触发方式为脉冲负边沿触发
    EX1=1;  //打开INT1中断请求
    TMOD=0x01;
    EA=1;
 	ledr();  
   while (1)
   {ledr();  
   	RW_E2ROM();
   }
 //RemPin=1;
}


⌨️ 快捷键说明

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