一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2579|回复: 11
收起左侧

[51单片机] 求助------单片机红外遥控开关的制作

[复制链接]
发表于 2015-8-4 17:39 | 显示全部楼层 |阅读模式
本帖最后由 Asdfghjkl 于 2015-8-4 17:41 编辑

想做一个红外遥控开关,在网上搜了半天没找到合适的,在某宝上看见一款很符合我的要求,但家里还有好多元件可以用来做这个东西,不想浪费钱,实在是不会编程,还请大家帮忙想做成这样的8路开关,高低电平无所谓,最好能改,想设计成两个,一个点动型一个自锁型

QQ截图20150804172758.png


现有的元件stc89c52rc  stc5a60s2单片机,红外遥控器如下图,编码不知道,红外接收头有1838和0038,其他的电阻三极管晶振都有,这个遥控器是原来做荧光管数码钟时剩下的,不想浪费了,http://bbs.mydigit.cn/read.php?tid=1242178这是做好的东西
76_178026_c8d7e2dc77bd9f3.jpg

哪位大神能帮忙设计一下程序,感激不尽,电路的话我自己可以根据程序设计出来,如果也能一起提供最好了,谢谢

发表于 2015-8-4 18:55 | 显示全部楼层
发表于 2015-8-4 19:38 | 显示全部楼层
不舍得花钱买,只好自己捣鼓了,哈哈
发表于 2015-8-4 23:57 | 显示全部楼层
PT2262 + PT2272 > 6路
 楼主| 发表于 2015-8-5 08:39 | 显示全部楼层
snoopy8008 发表于 2015-8-4 18:55
https://www.yleee.com.cn/thread-11585-1-1.html
https://www.yleee.com.cn/forum.php?mod=viewthread&tid= ...

这两个我也看了,输出太少不能满足要求啊
发表于 2015-8-5 08:49 | 显示全部楼层

有一个 个人原则:自己会就自己弄,不会就买现成的。
发表于 2015-8-5 10:09 | 显示全部楼层
用以前做的类似的改了一下,仅供参考。


//红外解码的参数是按照11.0592M来的,用其他的需修改。
#include<reg52.h>
#include "intrins.h"

sbit out_1=P1^0;
sbit out_2=P1^1;
sbit out_3=P1^2;
sbit out_4=P1^3;
sbit out_5=P1^4;
sbit out_6=P1^5;
sbit out_7=P1^6;
sbit out_8=P1^7;


sbit beep=P3^7;

sbit IR=P3^2;           //将IR位定义为P3.2引脚

unsigned char a[4];    //储存用户码、用户反码与键数据码、键数据反码
unsigned int LowTime,HighTime; //储存高、低电平的宽度
unsigned char hwcode;

void delay_ms(int ms)
{
unsigned char y ;
  while(ms--)
{
  for(y = 0 ; y<250 ; y++)
  {
   _nop_() ;
   _nop_() ;
   _nop_() ;
   _nop_() ;
  }
}
}

/************************************************************
函数功能:对4个字节的用户码和键数据码进行解码
说明:解码正确,返回1,否则返回0
出口参数:dat
*************************************************************/
bit DeCode(void)        
{

    unsigned char  i,j;
        unsigned char temp;    //储存解码出的数据
        for(i=0;i<4;i++)      //连续读取4个用户码和键数据码
          {
                 for(j=0;j<8;j++)  //每个码有8位数字
                         {
                 temp=temp>>1;  //temp中的各数据位右移一位,因为先读出的是高位数据                                                                       
                           TH0=0;         //定时器清0
                           TL0=0;         //定时器清0
                           TR0=1;         //开启定时器T0
                      while(IR==0);   //如果是低电平就等待
                                   //低电平计时
                             TR0=0;         //关闭定时器T0
                           LowTime=TH0*256+TL0;    //保存低电平宽度
                           TH0=0;         //定时器清0
                           TL0=0;         //定时器清0
                           TR0=1;         //开启定时器T0
                           while(IR==1)   //如果是高电平就等待
                               ;                          
                           TR0=0;        //关闭定时器T0
                           HighTime=TH0*256+TL0;   //保存高电平宽度


                           if((LowTime<370)||(LowTime>640))
                                              return 0;        //如果低电平长度不在合理范围,则认为出错,停止解码                       
                           if((HighTime>420)&&(HighTime<620))   //如果高电平时间在560微秒左右,即计数560/1.085=516次
                                   temp=temp&0x7f;       //(520-100=420, 520+100=620),则该位是0
                           if((HighTime>1300)&&(HighTime<1800)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次
                                   temp=temp|0x80;       //(1550-250=1300,1550+250=1800),则该位是1
                     }                                     
           a[i]=temp;        //将解码出的字节值储存在a[i]                                                                                                                                                                         
    }

                                                           
  if(a[2]=~a[3])  //验证键数据码和其反码是否相等,一般情况下不必验证用户码
         return 1;     //解码正确,返回1
return 0;

}
/************************************************************
函数功能:红外线触发的外中断处理函数
*************************************************************/
void Int0(void) interrupt 0
  {

         EX0=0;     //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号
                 TH0=0;         //定时器清0
                           TL0=0;         //定时器清0
                           TR0=1;       //开启定时器T0
           while(!IR){
                            LowTime=TH0*256+TL0;
                                if(LowTime>10000){TR0=0;EX0=1;return;}
                                }   //如果是低电平就等待        低电平计时
                             TR0=0;         //关闭定时器T0
                           LowTime=TH0*256+TL0;    //保存低电平宽度

                           TH0=0;         //定时器清0
                           TL0=0;         //定时器清0
                           TR0=1;         //开启定时器T0
                           while(IR){HighTime=TH0*256+TL0;
                                if(HighTime>5000){TR0=0;EX0=1;return;}
                                }  //如果是高电平就等待
                           TR0=0;        //关闭定时器T0
                           HighTime=TH0*256+TL0;   //保存高电平宽度
if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))
                 {
                    //如果是引导码,就开始解码,否则放弃,引导码的低电平计时
               //次数=9000us/1.085=8294, 判断区间:8300-500=7800,8300+500=8800.
                  if(DeCode()==1) // 执行遥控解码功能
                 {
                   hwcode=a[2];

                 }
                 }
IR=1;
EX0=1;  //开启外中断EX0
  }




//主程序

void main()
{
   EA=1;        //开启总中断
   EX0=1;       //开外中断0
   ET0=1;       //定时器T0中断允许
   IT0=1;                 //外中断的下降沿触发
   ET1=1;        
   TMOD=0x11;   //使用定时器T0的模式1       
   TR0=0;

while(1)
{
//自锁模式
switch(hwcode)
{case 0x1F:out_1=!out_1;break;
  case 0x02:out_2=!out_2;break;
  case 0x03:out_3=!out_3;break;
  case 0x04:out_4=!out_4;break;
  case 0x05:out_5=!out_5;break;
  case 0x06:out_6=!out_6;break;
  case 0x07:out_7=!out_7;break;
  case 0x08:out_8=!out_8;break;
}
//点动模式,按一下保持100MS
/*switch(hwcode)
{case 0x1F:out_1=1;delay_ms(100);out_1=0;break;
  case 0x02:out_2=1;delay_ms(100);out_2=0;break;
  case 0x03:out_3=1;delay_ms(100);out_3=0;break;
  case 0x04:out_4=1;delay_ms(100);out_4=0;break;
  case 0x05:out_5=1;delay_ms(100);out_5=0;break;
  case 0x06:out_6=1;delay_ms(100);out_6=0;break;
  case 0x07:out_7=1;delay_ms(100);out_7=0;break;
  case 0x08:out_8=1;delay_ms(100);out_8=0;break;
}
*/
hwcode=0;

}
}
 楼主| 发表于 2015-8-5 15:45 | 显示全部楼层
本帖最后由 Asdfghjkl 于 2015-8-5 15:52 编辑
xrff_z 发表于 2015-8-5 10:09
用以前做的类似的改了一下,仅供参考。

请问切换自锁和点动的是遥控器上的哪个按键?数字1-8对应8路开关吗?帖子里图片上的那个遥控器能直接用这个程序吗?这个用stc89c52rc单片机可以吗?
发表于 2015-8-6 08:59 | 显示全部楼层
Asdfghjkl 发表于 2015-8-5 15:45
请问切换自锁和点动的是遥控器上的哪个按键?数字1-8对应8路开关吗?帖子里图片上的那个遥控器能直接用这 ...

这个程序还不能直接用的。
自锁和点动是两段分开的,不是通过按键切换,而是编程的时候 选择某段而把另一段注释掉,这样最简单。
要使用按键切换的话,考虑的就多了,比如是一个按键切换8个,还是8个分开。切换的时候,原来开关状态怎么处理等等。

遥控器的使用还得知道遥控器每个键的代码,知道了代码之后,把case后面的数字改成你想用的按键的对应代码就行了。现在程序中的,只是随便写的,当然不能用。
(遥控器代码可以通过单片机+1602显示出来。)

stc89c52rc可以的。

不知道楼主急不急,不急的话可以慢慢折腾。












 楼主| 发表于 2015-8-6 10:17 | 显示全部楼层
xrff_z 发表于 2015-8-6 08:59
这个程序还不能直接用的。
自锁和点动是两段分开的,不是通过按键切换,而是编程的时候 选择某段而把另 ...

我不急,现在在外地出差,等9月份回家了再弄,我还得先做一个遥控器解码的,然后才能做这个,不知道您有没有我这种遥控器的编码

本版积分规则

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

GMT+8, 2024-5-6 19:08 , Processed in 0.070183 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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