找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 28957|回复: 80
收起左侧

用STc15f104e单片机做了个学习型红外遥控开关程序分享给大家

  [复制链接]
回帖奖励 50 黑币 回复本帖可获得 50 黑币奖励! 每人限 1 次
ID:17109 发表于 2019-8-27 15:22 | 显示全部楼层 |阅读模式
用STc15f104e做了个学习型红外遥控开关
是上电学习的不带按键的,          上电学习指示灯闪烁,按遥控器,指示灯灭了下, 学习开机键成功。
指示灯继续闪,再按遥控器,指示灯灭了,学习关机键成功,进入待机状态。
上电2秒不学习退出,进入待机状态。

电路原理图如下:
108_541075_af0a4644c678d93.jpg

这个是上电学习型红外遥控开关,须要学习开,和关,须要学习两只按键,

单片机源程序如下:
#include "STC15F104E.H"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define CPU_Fosc 12000000UL//12M晶振
#define M   1//时钟
#define Tc 100 //us采样
#define TH_0 (65536-CPU_Fosc/100*Tc/M/10000)/256
#define TL_0 (65536-CPU_Fosc/100*Tc/M/10000)%256
#define TH_1 (65536-CPU_Fosc/100*5/M/10)/256
#define TL_1 (65536-CPU_Fosc/100*5/M/10)%256
#define delaytime 0x83
/*********************************************/
sbit IR = P3^4;//红外
sbit LED=P3^3;//学习指示灯
sbit JIDIANQU=P3^0;//可控硅
uint OKCode;
uint ON,OFF;
uchar tim1,tim2,sec;
bit  shan,IR_ok;
/*********************************************/
union
{
    ulong longcode;
    uchar p[4];
} Code;
/*********************************************/
void Delay(uint t);
void InitTimer();
void IAP_disable();
void byte_write(uint addr, uchar dat);
void SectorErase(uint sector_addr);
uchar byte_read(uint addr);
/********************************************/
/********************* 主函数 *************************/
void main()
{
    P3=0xFF;
    ON=byte_read(0)<<8;
    ON|=byte_read(1);
    OFF=byte_read(0x200)<<8;
    OFF|=byte_read(0x201);
    InitTimer();
    tim1=tim2=sec=0;

    while(sec<2)
    {  LED=shan;
        if(IR_ok)
        {
            SectorErase(0);
            byte_write(0,Code.p[1]);
            byte_write(1,Code.p[2]);
            ON=OKCode;
            IR_ok=0;
            LED=1;
            Delay(400);
            tim1=tim2=sec=0;
            while(sec<2)
            {
                    LED=shan;
                if(IR_ok)
                {
                    SectorErase(0x200);
                    byte_write(0x200,Code.p[1]);
                    byte_write(0x201,Code.p[2]);
                    OFF=OKCode;
                    IR_ok=0;

                    break;
                }
            }
            break;
        }
    }
    LED=1;
    TR1=0;
    while(1)
    {
        if(IR_ok)
        {
            if(OKCode==ON)
            {
                JIDIANQU=0;
            }
            if(OKCode==OFF)
            {
                JIDIANQU=1;
            }
            IR_ok=0;
        }
    }
}
/***********************************/
void InitTimer()
{
#if (M==1)
    AUXR=0xc0;//定时器1T时钟
#endif
    TH0=TH_0;
    TL0=TL_0;
    TH1=TH_1;
    TL1=TL_1;
    EA=ET0=TR0=ET1=TR1=1;
}
/***********************************/
void Delay(uint t)
{
    uchar a,b;
    for(; t>0; t--)
        for(b=222; b>0; b--)
            for(a=12; a>0; a--)
            {
                ;
            }
}
/***********************************/
void timer1() interrupt 3 using 1
{
    if(++tim1>=40)
    {
        tim1=0;
        shan=!shan;
        if(++tim2>=5)
        {
            tim2=0;
            ++sec;

        }
    }
}
/***********************************/
void timer0() interrupt 1  using 2
{
        static uint Step;
    static uchar Count;
        static bit IRb,IRa,IRsync;

    if(IR_ok)
    {
        return;
    }
    IRb = IRa;
    IRa = IR;
    ++Step;
    if(IRb && !IRa)
    {
        if(Step>(14000/Tc))
        {
            IRsync=0;
        }
        else if(IRsync)
        {
            if(Step>(3000/Tc))
            {
                IRsync=0;
            }
            else
            {
                Code.longcode<<=1;
                if(Step>(1500/Tc))
                {
                    Code.longcode|=1;
                }
                if (--Count==0)
                {
                    if(Code.p[2]=~Code.p[3])
                    {
                        OKCode=Code.longcode>>8;
                        IR_ok=1;
                    }
                    IRsync=0;
                }
            }
        }
        else if (Step>(9000/Tc-4)&&Step<(13500/Tc+4))
        {
            IRsync=1 ;
            Count=32;
        }
       Step=0;
    }
}
/***********************************/
void byte_write(uint addr, uchar dat)
{
    IAP_CONTR=delaytime;
    IAP_ADDRH=addr>>8;
    IAP_ADDRL=addr;
    IAP_CMD=0x02;
    IAP_DATA=dat;
    IAP_TRIG=0x5a;
    IAP_TRIG=0xa5;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    IAP_disable();
}
/*********************************/
void SectorErase(uint sector_addr)
{
    IAP_CONTR=delaytime;
    IAP_ADDRH=(sector_addr&0xfe00)>>8;
    IAP_ADDRL=sector_addr;
    IAP_CMD=0x03;
    IAP_TRIG=0x5a;
    IAP_TRIG=0xa5;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    IAP_disable();
}
/********************************/
uchar byte_read(uint addr)
{
    IAP_CONTR=delaytime;
    IAP_ADDRH=addr>>8;
    IAP_ADDRL=addr;
    IAP_CMD=0x01;
    IAP_TRIG=0x5a;
    IAP_TRIG=0xa5;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    IAP_disable();
    return (IAP_DATA);
}
/**********************************/
void IAP_disable()
{
    IAP_CONTR=0;
    IAP_CMD=0;
    IAP_TRIG=0;
    IAP_ADDRH=0x80;
    IAP_ADDRL=0;
}
/*********************************/
/*uchar reverse8( uchar c )
{
    c=(c&0x55)<<1|(c&0xAA)>>1;
    c=(c&0x33)<<2|(c&0xCC)>>2;
    c=(c&0x0F)<<4|(c&0xF0)>>4;
    return c;
}*/

那位师博能修改一下程序改成学习一只按键就有开,和关的功能,修改分亨一下谢谢大家!

全部资料51hei下载地址:
上电自动学习型红外遥控开关.rar (1.49 KB, 下载次数: 183)

评分

参与人数 2黑币 +59 收起 理由
AAA_MCU + 9 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1168467 发表于 2026-3-19 21:50 | 显示全部楼层
谢谢分享,就是原理图画得有点寒碜了
回复

使用道具 举报

ID:1107340 发表于 2026-3-15 20:20 | 显示全部楼层
一直在找这方面的资料,谢谢分享!
回复

使用道具 举报

ID:1107340 发表于 2025-10-16 19:14 | 显示全部楼层
这个好,谢谢
回复

使用道具 举报

ID:1144925 发表于 2025-3-6 09:21 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:813985 发表于 2025-1-17 17:34 | 显示全部楼层
感谢 分享,好人卡。
回复

使用道具 举报

ID:953538 发表于 2025-1-17 14:40 | 显示全部楼层

好资源,向大师学习
回复

使用道具 举报

ID:1142026 发表于 2024-12-30 17:51 | 显示全部楼层
感谢楼主共享资料
回复

使用道具 举报

ID:624685 发表于 2024-12-25 21:05 | 显示全部楼层
谢谢楼主分享。收藏学习,慢慢研究
回复

使用道具 举报

ID:136502 发表于 2024-12-25 11:02 | 显示全部楼层
学习学习!谢谢分享!!
回复

使用道具 举报

ID:1045731 发表于 2022-9-24 10:58 | 显示全部楼层
感谢楼主分享,学习下先。
回复

使用道具 举报

ID:409399 发表于 2022-9-20 21:57 | 显示全部楼层
新乡家电维修 发表于 2020-3-30 09:55
很好的东西,我做的遥控开关是随时可以学习按键,单键开关,连续6次2秒内按同一个按键就自动学习

你发的主题里为什么不说要连续6次2秒内按同一个按键就自动学习
回复

使用道具 举报

ID:409399 发表于 2022-9-15 22:59 | 显示全部楼层
谢谢分享,怎么收藏来的
回复

使用道具 举报

ID:790621 发表于 2020-6-27 16:36 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:790922 发表于 2020-6-27 14:41 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:600952 发表于 2020-6-26 14:26 | 显示全部楼层
测试了原来也是学习两次,两只红外遥控按键,都能单独开和关,师傅可以最增加一路端口,用两只红外遥控按键,分别给两只继电器单独控制吗?谢谢修改传上传
感谢分享资源
回复

使用道具 举报

ID:757941 发表于 2020-6-11 09:43 | 显示全部楼层
感谢分享资源
回复

使用道具 举报

ID:763380 发表于 2020-6-11 08:47 | 显示全部楼层
谢谢分享!!
回复

使用道具 举报

ID:772010 发表于 2020-6-11 08:43 | 显示全部楼层
谢谢分享!!
回复

使用道具 举报

ID:775367 发表于 2020-6-10 18:29 | 显示全部楼层
非常的不错很好
回复

使用道具 举报

ID:580074 发表于 2020-6-2 15:44 | 显示全部楼层
好厉害,拿走学习学习,谢谢
回复

使用道具 举报

ID:709719 发表于 2020-6-2 13:49 | 显示全部楼层
学习了 不错不错  楼主很有想法 啊
回复

使用道具 举报

ID:692287 发表于 2020-6-2 08:38 | 显示全部楼层
nice不错
回复

使用道具 举报

ID:766985 发表于 2020-6-1 22:49 | 显示全部楼层
谢谢分享,收藏一下
回复

使用道具 举报

ID:750577 发表于 2020-5-13 11:10 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:17109 发表于 2020-5-8 16:27 | 显示全部楼层
lzb1989666 发表于 2020-1-28 11:21
你这个程序吧遥控部分删除,然后用一个引脚做按键开关检测。把遥控引导头处加一个if判断按键情况就行。vx44 ...

师傅你好:能修改上传吗谢谢
回复

使用道具 举报

ID:731155 发表于 2020-4-17 15:44 | 显示全部楼层
感谢分享,有空学习一下
回复

使用道具 举报

ID:108573 发表于 2020-4-9 12:27 | 显示全部楼层
我也需要学习学习
回复

使用道具 举报

ID:290153 发表于 2020-4-9 11:07 | 显示全部楼层
非常好先收藏
回复

使用道具 举报

ID:215454 发表于 2020-4-9 10:04 | 显示全部楼层
谢谢分享,正好需要此类资料!
回复

使用道具 举报

ID:718740 发表于 2020-3-30 13:45 | 显示全部楼层
好资源,收藏先
回复

使用道具 举报

ID:72088 发表于 2020-3-30 09:55 | 显示全部楼层
很好的东西,我做的遥控开关是随时可以学习按键,单键开关,连续6次2秒内按同一个按键就自动学习
回复

使用道具 举报

ID:701852 发表于 2020-3-30 08:51 | 显示全部楼层
可以做成用存储芯片存储红外码,按键更新
回复

使用道具 举报

ID:714532 发表于 2020-3-29 11:16 | 显示全部楼层
还是很困惑。
回复

使用道具 举报

ID:714532 发表于 2020-3-27 17:33 | 显示全部楼层
厉害啊
回复

使用道具 举报

ID:246783 发表于 2020-3-23 22:07 来自触屏版 | 显示全部楼层
电路有问题,极易烧稳压管,稳压管一完, 单片机也完
回复

使用道具 举报

ID:687418 发表于 2020-1-30 17:17 | 显示全部楼层
谢谢分享!只是这电路图画的有点那个。。。
回复

使用道具 举报

ID:634466 发表于 2020-1-29 13:11 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:477512 发表于 2020-1-29 08:33 | 显示全部楼层
学习学习,谢谢分享!
回复

使用道具 举报

ID:63090 发表于 2020-1-28 11:21 | 显示全部楼层
你这个程序吧遥控部分删除,然后用一个引脚做按键开关检测。把遥控引导头处加一个if判断按键情况就行。vx441593983,可以帮你
回复

使用道具 举报

ID:438886 发表于 2020-1-25 23:12 | 显示全部楼层
刚好要这类的程序,,感谢楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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