多语言展示
当前在线:927今日阅读:39今日分享:10

51单片机程序设计:[12]模拟PT2272无线解码

该经验介绍如何使用单片机模拟PT2272进行315M无线模块的解码。对于无线控制窗帘等项目有借鉴意义。
工具/原料
1

51单片机开发板

2

Keil C IDE开发环境

3

315M发射模块和接收模块

方法/步骤
1

硬件实物图下图:通过原理图可以见,无线模块的数据端连接在P32引脚上。可以根据需求,修改该引脚。

2

具体代码如下://因为他的格式是00表示'0'11表示'1'01表示'F'所以我们要把12位乘以2等于24位刚好是3个字节//第一二个字节是地址码,第三个字节是数据码//发射芯片采用的是PT2262芯片用4.7M的震荡电阻315M发射//遥控我们全部默认地址码是 FFFFFFFF 单片机解码出来就是0x55 0x55//遥控处理函数

3

可以复制的源代码如下:/************************************************ ; 跳线设置:默认跳线位 ; 晶振:12MHz ; 注意:断电后将接受模块插入板子WX口,切记方向不能错误,看图片目录有图 ;      接受模块有元件的这面朝9针串口插座,在接受模块的天线孔 ;      接上24cm长的普通导线能增加控制距离 ; 效果:按手持式4键发射器上的任意按键,程序能解码出来,并在发光管上显示 ;======= 模拟 pt2272 接收=========================************************************************/#include'AT89x52.h'//#include'global.h'#include'intrins.h'#include'51hei.H'#define  uchar  unsigned char#define  uint   unsigned intuchar Rem_Code[3];uint TimeCount;sbit Get_Rem=P3^2;void delay8(uint t){while(--t);}void Delay100us(void){delay8(13); //8-18}//因为他的格式是00表示'0'11表示'1'01表示'F'所以我们要把12位乘以2等于24位刚好是3个字节//第一二个字节是地址码,第三个字节是数据码//发射芯片采用的是PT2262芯片用4.7M的震荡电阻315M发射//遥控我们全部默认地址码是 FFFFFFFF 单片机解码出来就是0x55 0x55//遥控处理函数void Remote_Process(void){ uchar i,j,Count=0; Delay100us(); if(TimeCount>0)//当按键按下释放后该值不在赋值就同通过递减直到该值等于0 {//等于0后表示按键释放  TimeCount--; } if(Get_Rem==0)//如果有低电平就进入解码 {    for(Count=0;Count<100;Count++)//判断12毫秒左右的引导码    {     Delay100us();//100us*100=10ms     if(Get_Rem==1)//如果在延时10毫秒期间有高电平出现就是干扰信号退出解码     {      return;     }    }   while(Get_Rem==0);//等待低电平结束   for(j=0;j<3;j++)//8位地址码加4位数据码     {    for(i=0;i<8;i++)    {     Count=0;    do    {     Delay100us();     Count++;     if(Count>20)//如果在大于2毫秒高电平还没有结束认为是干扰退出解码     {//理论上是1.2毫秒,我们2毫秒留有余量,防止遥控批量中的误差      return;     }    }while(Get_Rem==1);//计算高平时间并等待结束    Count=0;    do    {      Delay100us();     Count++;     if(Count>20)//如果在大于2毫秒低平还没有结束认为是干扰退出解码     {      return;     }    }while(Get_Rem==0);//计算低电平时间并等待结束    Rem_Code[j]<<=1;//数据从高位开始接收所以每次向左移一位          if(Count<8)//如果低电平时间小于800毫秒认为该位为1          {     Rem_Code[j]++;          }     }  }        ACC=Rem_Code[2];        if(ACC==0xc0)  P0=0xef;  if(ACC==0x30)  P0=0xdf;  if(ACC==0x0c)  P0=0xbf;  if(ACC==0x03)  P0=0x7f;     if(TimeCount==0)//为0表示是新的一次按下对其进行处理   {   }   TimeCount=1000;//按键按下标志 }}void main(){AUXR=0x01;P1_4=0;guandz();guanled(); while(1) {  Remote_Process();//遥控处理 }}

推荐信息