找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14577|回复: 70
收起左侧

用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, 下载次数: 178)

评分

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

查看全部评分

回复

使用道具 举报

ID:604426 发表于 2019-8-27 17:53 | 显示全部楼层
好资源,收藏先
回复

使用道具 举报

ID:69311 发表于 2019-8-27 23:25 | 显示全部楼层
学习学习!谢谢分享
回复

使用道具 举报

ID:67356 发表于 2019-8-28 05:36 | 显示全部楼层
好资源,收藏先
回复

使用道具 举报

ID:343102 发表于 2019-8-28 07:04 | 显示全部楼层
可用反相函数完成单键开和关。
回复

使用道具 举报

ID:17109 发表于 2019-8-28 10:18 来自手机 | 显示全部楼层
风158 发表于 2019-8-28 07:04
可用反相函数完成单键开和关。

劳烦师傅修改上传一下谢谢
回复

使用道具 举报

ID:343102 发表于 2019-8-28 19:30 | 显示全部楼层
你这个程序用了T0和T1两个定时器,无法使用性能更好的stc15w系列。我有一个程序只用T0一个定时器,兼容性更强,并根据你的电路做了修改。已发新帖。等审核通过后可搜索:两路学习型风扇遥控开关带自然风
回复

使用道具 举报

ID:17109 发表于 2019-8-29 10:22 | 显示全部楼层
风158 发表于 2019-8-28 19:30
你这个程序用了T0和T1两个定时器,无法使用性能更好的stc15w系列。我有一个程序只用T0一个定时器,兼容性更 ...

我还有一个15F104W版本的  ,功能也是一样,上电学习的不带按键的,上传给你看看,
修改一下程序改成学习一只按键就有开,和关的功能,修改分亨一下谢谢
回复

使用道具 举报

ID:17109 发表于 2019-8-29 10:23 | 显示全部楼层
15F104W学习遥控开关

15F104W学习遥控开关.rar

4.08 KB, 下载次数: 81, 下载积分: 黑币 -5

回复

使用道具 举报

ID:343102 发表于 2019-8-29 11:50 | 显示全部楼层
我刚发的15W104的遥控程序,兼容15F104。在这里:http://www.51hei.com/bbs/dpj-169020-1.html
回复

使用道具 举报

ID:17109 发表于 2019-8-29 15:44 来自手机 | 显示全部楼层
你这个是控制两路的,能够用我这个控制一路的程序修改吗谢谢
回复

使用道具 举报

ID:512205 发表于 2019-8-29 16:30 | 显示全部楼层
学习学习!谢谢分享!!
回复

使用道具 举报

ID:343102 发表于 2019-8-29 19:13 | 显示全部楼层
我上传的那个两路遥控程序已被我改成一路了,一个按键控制开关,另一个按键只是控制延时,形成自然风。实际使用时还可以只学习一个按键,仅实现开关机就行。
有兴趣的话就自己改程序吧,DIY的乐趣就在于自己动手。我也是刚玩单片机没多久。
回复

使用道具 举报

ID:601770 发表于 2019-8-29 19:19 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:391781 发表于 2019-8-30 09:30 | 显示全部楼层
感谢分享。学习学习!
回复

使用道具 举报

ID:17109 发表于 2019-8-31 06:48 来自手机 | 显示全部楼层
风158 发表于 2019-8-29 11:50
我刚发的15W104的遥控程序,兼容15F104。在这里:http://www.51hei.com/bbs/dpj-169020-1.html

师傅你好:你会给这程序用中文注释定义吗,上传过来,谢谢
回复

使用道具 举报

ID:214520 发表于 2019-8-31 22:00 | 显示全部楼层
学习学习!谢谢分享!
回复

使用道具 举报

ID:17109 发表于 2019-9-1 18:43 来自手机 | 显示全部楼层
zimo123 发表于 2019-8-31 22:00
学习学习!谢谢分享!

师傅你好:你会给这程序用中文注释定义吗,上传过来,谢谢
回复

使用道具 举报

ID:416951 发表于 2019-9-1 23:10 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:596378 发表于 2019-9-2 09:32 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:32289 发表于 2019-9-3 20:15 | 显示全部楼层

15F104W学习遥控开关
回复

使用道具 举报

ID:96744 发表于 2019-9-4 12:28 | 显示全部楼层
学习学习!谢谢分享!
回复

使用道具 举报

ID:515878 发表于 2019-9-6 07:55 | 显示全部楼层
不错不错,学习学习
回复

使用道具 举报

ID:568756 发表于 2019-9-12 13:38 | 显示全部楼层
我整了个电路,咋不能工作呢?
回复

使用道具 举报

ID:138448 发表于 2019-9-12 13:59 | 显示全部楼层
一直以来,都想自己搞个遥控器。谢谢分享。
回复

使用道具 举报

ID:138119 发表于 2019-9-20 01:18 | 显示全部楼层
if(IR_ok)
        {
            if(OKCode==ON)
            {
                JIDIANQU=~JIDIANQU;
            }
            IR_ok=0;
        }
回复

使用道具 举报

ID:138119 发表于 2019-9-20 01:19 | 显示全部楼层
if(IR_ok)
{
    if(OKCode==ON)
    {
        if(JIDIANQU==1)
            JIDIANQU=0;
        else
            JIDIANQU=1;
    }
    if(OKCode==OFF)
    {
        if(JIDIANQU==1)
            JIDIANQU=0;
        else
            JIDIANQU=1;
    }
    IR_ok=0;
}
回复

使用道具 举报

ID:391781 发表于 2019-9-20 08:51 | 显示全部楼层
感谢分享。可以借鉴学习学习。
回复

使用道具 举报

ID:17109 发表于 2019-9-20 11:47 | 显示全部楼层
yfpc2006 发表于 2019-9-20 01:19
if(IR_ok)
{
    if(OKCode==ON)

师博你好不知道什么修改可以把,修改好的复制上传吗?谢谢
回复

使用道具 举报

ID:138119 发表于 2019-9-20 19:33 | 显示全部楼层
ll13536121668 发表于 2019-9-20 11:47
师博你好不知道什么修改可以把,修改好的复制上传吗?谢谢

你想表达什么啊?
回复

使用道具 举报

ID:138119 发表于 2019-9-20 19:37 | 显示全部楼层
        if(IR_ok)
        {
            if(OKCode==ON)
            {
                //JIDIANQU=0;
                                if(JIDIANQU == 1)
                                        JIDIANQU = 0;
                                else
                                        JIDIANQU = 1;

            }
            if(OKCode==OFF)
            {
                //JIDIANQU=1;
                                if(JIDIANQU == 1)
                                        JIDIANQU = 0;
                                else
                                        JIDIANQU = 1;
            }
            IR_ok=0;
        }

51黑论坛_上电自动学习型红外遥控开关.rar

7.47 KB, 下载次数: 41, 下载积分: 黑币 -5

回复

使用道具 举报

ID:17109 发表于 2019-9-22 01:20 来自手机 | 显示全部楼层
yfpc2006 发表于 2019-9-20 19:37
if(IR_ok)
        {
            if(OKCode==ON)

测试了原来也是学习两次,两只红外遥控按键,都能单独开和关,师傅可以最增加一路端口,用两只红外遥控按键,分别给两只继电器单独控制吗?谢谢修改传上传
回复

使用道具 举报

ID:402515 发表于 2019-9-22 16:29 | 显示全部楼层
谢谢楼主分享                  
回复

使用道具 举报

ID:17109 发表于 2019-9-23 08:44 来自手机 | 显示全部楼层
ll13536121668 发表于 2019-9-22 01:20
测试了原来也是学习两次,两只红外遥控按键,都能单独开和关,师傅可以最增加一路端口,用两只红外遥控按 ...

师傅可以最增加一路端口,用两只红外遥控按键,分别给两只继电器单独控制吗?谢谢修改
上传
回复

使用道具 举报

ID:109115 发表于 2019-10-15 11:12 | 显示全部楼层
谢谢楼主分享。收藏学习
回复

使用道具 举报

ID:109115 发表于 2019-10-15 11:12 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:423660 发表于 2019-10-19 16:48 | 显示全部楼层
谢谢了,在学习中。
回复

使用道具 举报

ID:618933 发表于 2019-10-20 11:42 | 显示全部楼层
感谢分享!!!
回复

使用道具 举报

ID:385168 发表于 2020-1-7 05:29 | 显示全部楼层
一直在找这方面的资料,谢谢分享。
回复

使用道具 举报

ID:67857 发表于 2020-1-12 12:37 | 显示全部楼层
学习学习!谢谢分享!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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