一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 8383|回复: 2
收起左侧

[其他综合] 转发一个带学习功能的无线遥控解码编码程序,标题加入315MHzPT2240PT2262PT2272EV1527

[复制链接]
发表于 2011-2-13 21:10 | 显示全部楼层 |阅读模式
大家新年好!我也发一个带学习功能的无线遥控解码编码程序,标题加入315MHzPT2240PT2262PT2272EV1527是为了搜索的需要
遥控接收使用超外差模块,芯片是RX3310A,再生式接收暂时还没有测试,不知道是否可以通过
/*****************************************************
CodeWizardAVR V1.25.9 Professional
Chip type           : ATmega48V
Clock frequency     : 7.372800 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 128
*****************************************************/
#include <mega48.h>
#define lck1   10                       //lck1*4=lck4
#define lck4   40                       //数据位H和L电平只和 lck4*wucha4<255
#define wucha1  2                       //lck1的允许正负误差   
#define wucha4  8                       //wucha1*4=wucha4
#define in_1   PINC.0==1                //定义遥控接收端口
#define in_0   PINC.0==0
#define k_1    PINC.1==1
#define k_0    PINC.1==0

unsigned int  time_init;
unsigned char time, time_h, time_l, data0, data1, data2, n, jishu, biaoji, linshi;
unsigned char eeprom e_data0, e_data1, e_data2;

interrupt [TIM0_OVF] void timer0_ovf_isr(void)  
{
  if(in_1) {if(jishu<5) jishu++;} else {if(jishu>0) jishu--;}  //积分检测 jishu<lck1-wucha1
  if(jishu==5) biaoji=1;                //上升沿判断
  if(jishu==0) biaoji=0;                //下降沿判断
  if(time<255) time++;
  if(time_init<65535) time_init++;
}

void main(void)
{   
  DDRC=252;  PORTC=255;                 //C0接收信号 C1记忆按键 C2点亮LED
  UCSR0B=8; UCSR0C=0x06; UBRR0L=3;      //串口初始化/监视辅助语句
  TCCR0A=0; TCCR0B=1; TIMSK0=1;         //时钟1分频/溢出中断使能 255/7.3728=34.6us中断一次
  SREG|=128;                            //全局中断使能           
   
  while (1)
  {   
    while(biaoji==0);                   //等待上升沿
    while(biaoji==1);                   //等待下降沿
    time_init=0;                        //同步信号L电平计时复位
    while(biaoji==0);                   //等待上升沿
     
    time=0; time_h=0; time_l=0;         //时间清零
    data0=0; data1=0; data2=0;          //数据清零
     
    if(time_init>(lck1-wucha1)*31 && time_init<(lck1+wucha1)*31)
    {        
      for(n=0; n<24; n++)
      {
        while(biaoji==1);               //等待下降沿
        time_h=time;                    //记录高电平的持续时间   
        time=0;   
        //UDR0=time_h;                  //辅助语句/通过串口输出H电平的时间值     
        while(biaoji==0);               //等待上升沿
        time_l=time;                    //记录低电平的持续时间
        time=0;  
        //UDR0=time_l;                  //辅助语句/通过串口输出L电平的时间值     
         
        linshi=time_h+time_l;
           
        if(time_h==time_l || time_h>lck4 || time_l>lck4) break;  //这条语句和下面那条语句要分先后
        if(linshi>lck4+wucha4 || linshi<lck4-wucha4) break;

        if(time_h>time_l)               //如果数据位是1则更新记录/实际应用时建议再检测1和0的H和L电平的宽度
        {
          if(n<16) {if(n<8) data0+=1<<(7-n); else data1+=1<<(15-n);} else data2+=1<<(23-n);
        }  
      }
    }
    if(data0==e_data0 || data1==e_data1)                //遥控点亮LED测试
    {
      if(data2==e_data2+4) PORTC.2=1;
      if(data2==e_data2+8) PORTC.2=0;
    }  
    if(k_0 && n==24)                                    //记忆数据/第三个数据取高4位/低4位是按键位
    {
      e_data0=data0; e_data1=data1; e_data2=data2&240;
      while(k_0);                                       //等待按键松开/防止EEPROM被反复擦写
    }   
  }
}










/*****************************************************
CodeWizardAVR V1.25.9 Professional
Chip type           : ATtiny13
Clock frequency     : 1.200000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 16   
模拟EV1527(PT2240),它的原理是:先输出一个同步位,再依次输出3个字节(24位)的数据,循环
同步位:一个lck高电平和31个lck低电平
数据位:1就是3个lck高电平和1个lck低电平。0就是1个lck高电平和3个lck低电平
高电平就是遥控器发射315MHz的电波,低电平就是停止发射
*****************************************************/

#include <tiny13.h>
#include <delay.h>

#define lck 400                            //400微妙
#define io_1  PORTB.0=1;
#define io_0  PORTB.0=0;

unsigned char data0 = 0b********;          //20位ID码+4位按键码
unsigned char data1 = 0b********;
unsigned char data2 = 0b****0000;

void txd_out(unsigned char id)
{
  unsigned char n=128;
  while(n)
  {
    if(id&n)
    {
      io_1; delay_us(lck*3); io_0; delay_us(lck);
    }
    else
    {
      io_1; delay_us(lck); io_0; delay_us(lck*3);
    }
    n/=2;
  }
}  

void txd_init(void)
{
  io_1; delay_us(lck); io_0; delay_us(lck*31);
}

void main(void)
{           
  PORTB.0=0;
  DDRB.0 =1;
  DDRB.1=0;
  DDRB.2=0;
  while (1)  
  {  
    if(PINB.1==1 && PINB.2==1) while(1);   
    if(PINB.1) { txd_init(); txd_out(data0); txd_out(data1); txd_out(data2+4); } //开
    if(PINB.2) { txd_init(); txd_out(data0); txd_out(data1); txd_out(data2+8); } //锁
  }   
}
未命名.jpg
我想用如下的接收头,能否帮改为89s52上面用的程序呀?谢谢啦!
315MHZ超再生接收模块.gif DFS1.jpg DFS2.jpg 谢谢!
发表于 2011-2-13 21:52 | 显示全部楼层
感谢好资料,帮顶
 楼主| 发表于 2011-2-13 22:08 | 显示全部楼层
本帖最后由 LBQ691477940 于 2011-2-13 22:09 编辑

回复 1# LBQ691477940
看看能否帮改为89s52上面用的程序呀?谢谢啦!


    发射端为PT2262 3.3M 的电阻 接收端为 M8 内部1M RC振荡。解码成功后输出D口显示。编译软件为 ICCAVR。
#include <iom8v.h>
#include <macros.h>

void delay_ms(void)                         //毫秒延时  
{     
     unsigned int i;
     for (i=0;i<140;i++)  
  {
  }
}

void delay_nms(unsigned int n)              //延时周期
{
     unsigned int i;
     for (i=0;i<n;i++)
  {
   delay_ms();
  }
}
  
void spaz(void)                             //响蜂鸣器
{
     PORTC|=(1<<5);                          
delay_nms(50);                          
PORTC&=~(1<<5);                           
}   
  
unsigned long decode(void)                 //无线解码
{
     unsigned long DATA;                    //记录数据
     unsigned char count,i;                 //暂时计数
  
/*一共接收三字节*/
     
     DATA=0;                                //   
     for (count=0;count<24;count++)         //开始收集
  {
   
/*测量高电平宽度*/

       i=0;                                 //宽度计数
   while (PINC&(1<<4))           //高位计数
    {        
asm("nop");           //
i++;                  //计数增加  
                        
if (i>192) goto end;  //限时解码
}                                    

/*分辨出电平高低*/
        
  DATA*=2;                       //数据左移
  
      if (i<64)                             //分辨高低  
   {     
    if (!((56>i)&(i>24))) goto end;     //电平合法                                 
    DATA+=0;                            //记低电平
   }
   
  else
   {      
    if (!((168>i)&(i>72))) goto end;    //电平合法                                 
    DATA+=1;                            //记高电平
   }
   
/*测量低电平宽度*/
   
   while (!(PINC&(1<<4)))               //低位计数
    {        
asm("nop");                 //
i++;                        //计数增加  
                        
if (i>224) goto end;        //限时解码
}           

/*低电平是否过窄*/
  
   if (i<96) goto end;                  //对比宽度                           
      }
         
/*解码成功返结果*/
                                       
return  DATA;                          //成功返回  
  
/*有误码结束解码*/   
  
     end:   
return 0;                              //误码结束
}   
  
void main(void)
{
     unsigned long DATA;                    //
unsigned char D[3];             //  
signed char i;                  //   
     
     DDRB =0B00000000;                      //定义输入
     PORTB=0B11111111;                      //上拉使能
  
     DDRC =0B11101111;                      //输入通道
PORTC=0B11011111;               //上拉选择
      
     DDRD =0B11111111;                      //定义输出
PORTD=0B00000000;               //输出显示  
  
while (1)
  {
   DATA =decode();                      //解码程序
   
   if (DATA>0)                          //
    {
     spaz();                            //解码成功
  
for (i=2;i>=0;i--)                 //数据转换
  {  
   D=DATA;                       //
   DATA>>=8;                        //  
  }
  
i=0;                               //转换完毕   
while (1)                          //输出显示   
  {
   if (!(PINB&(1<<0)))              //按键检查
    {
delay_nms(20);                 //防误处理
if (!(PINB&(1<<0)))            //
  {
   i++;                         //显示值加
   spaz();
  }
while (!(PINB&(1<<0)))         //按键弹起
  {
   delay_nms(20);               //防误处理
  }
}  
   if (i>2) break;                  //
   PORTD=D;                      //输出显示   
  }
}
  }
}
Q.jpg
AX.jpg

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-27 15:32 , Processed in 0.073217 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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