找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1496|回复: 4
收起左侧

单片机红外遥控的程序修改,求帮助

[复制链接]
ID:100826 发表于 2021-3-26 16:32 | 显示全部楼层 |阅读模式
用STC15F104  红外遥控  功能正常   需要修改 按键长按一直输出低电平   放开恢复高电平  2路这个功能  其它不变有时间的老大帮忙修改

由于本论坛禁止直接求程序,禁止伸手党,所以向大家请教一下大致的实现方法与思路,理清头绪后我自己来写程序去实现


#include <STC15F104E.H>
#define CPU_Fosc 12//STC15F104E  
#define M   1//???1T??
#define Tc 250 //250us??
#define Th (65536-CPU_Fosc*Tc/M)/256
#define Tl (65536-CPU_Fosc*Tc/M)%256
#define uchar unsigned char
#define uint  unsigned int
#define ulong  unsigned long
/*
#define ma1 0xbf01 //???/???
*/

sbit K1=P3^0;//K1
sbit K2=P3^1;//K2
sbit K3=P3^2;//K3
sbit K4=P3^3;//K4
sbit KZ=P3^4;//继电器1
sbit IR=P3^5; //红外接收
bit  IR_ok,state;
ulong longcode;
uint OKCode;
uint Tick,step;
uchar  Count;
bit   IRsync;
bit   IRb,IRa,IR_ok;
void Delay(uint t);
uchar reverse8( uchar c );
void InitTimer();
void main()
{
    P3=0xff;
    InitTimer();
    while(1)
    {
        if(IR_ok)
        {
            if(OKCode==0xff5c) //
            {

                 KZ=~KZ;

            }
        

                          if(OKCode==0xff18) //K1
            {
                K1=0;
                Delay(50);
                K1=1;              
             }
                          if(OKCode==0xff1a) //K2
            {
                K2=0;
                Delay(50);
                K2=1;              
             }
                          if(OKCode==0xff1b) //K3
            {
                K3=0;
                Delay(50);
                K3=1;              
             }
                          if(OKCode==0xff17) //K4
            {
                K4=0;
                Delay(50);
                K4=1;            
             }


                        
            IR_ok=0;
        }
    }
}
void InitTimer()
{
    AUXR=0xc0;
    TMOD = 0x00;
    TH0=Th;
    TL0=Tl;
    EA=ET0=TR0=1;
}
void timer0() interrupt 1
{
    if(IR_ok)
    {
        return;
    }
    IRb = IRa;     //??????
    IRa = IR;     //??????
    ++step;
    if(IRb && !IRa)         //?????(???,???)
    {
        Tick = step;
        step=0;
        if(Tick>(14000/Tc))
        {
            IRsync=0;
        }
        else if(IRsync)
        {
            if(Tick>(3000/Tc))
            {
                IRsync=0;
            }
            else
            {
                longcode<<=1;
                if(Tick>(1500/Tc))
                {
                    longcode|=1;
                }
                if (--Count==0)
                {
                    uchar x,y;
                    x= longcode;
                    y= longcode>>8;
                    if(x=~y)
                    {
                        OKCode =longcode>>8;
                        OKCode=reverse8(OKCode/256)*256|reverse8(OKCode);
                        IRsync=0;
                        IR_ok=1;
                    }
                }
            }
        }
        else if(Tick>(13500/Tc-2)&&Tick<(13500/Tc+2))
        {
            IRsync=1;
            Count=32;
        }
    }
}
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;
}
void Delay(uint t)
{
    uchar a,b;
    for(; t>0; t--)
        for(b=222; b>0; b--)
            for(a=12; a>0; a--)
            {
                ;
            }
}                                                               


回复

使用道具 举报

ID:68800 发表于 2021-3-27 00:05 | 显示全部楼层
修改按键码处理程序位置,检测到处理码就置低电平,然后开启一个定时器。在一定时间内入果继续检测到这个码就把定时器时间复位重新开始计时直到放开按键,定时器中断后置高电平
回复

使用道具 举报

ID:89515 发表于 2021-3-27 01:14 来自手机 | 显示全部楼层
这个与你的红外解码程序没什么关系。当你按下某个按键时,单片机解码,如果一直按下就是红外连续按键功能,但键码并没有变,只要键码没变就一直输出低电平就行了,按键释放键码归零输出高电平。前提是必须有连续按键的解码功能,这个就多两三行代码。
回复

使用道具 举报

ID:897199 发表于 2021-3-27 10:08 | 显示全部楼层
中断服务函数的问题,完成一个接收后,IR_OK=1,而前面又有if(IR_Ok) return,主程序未处理完遥控指令前,没有执行IR_OK=0,所以程序不会再接收遥控信号。
回复

使用道具 举报

ID:100826 发表于 2021-3-28 12:06 | 显示全部楼层
xiaomo1513 发表于 2021-3-27 10:08
中断服务函数的问题,完成一个接收后,IR_OK=1,而前面又有if(IR_Ok) return,主程序未处理完遥控指令前,没 ...

是不是IR_OK=0改为IR_OK=1  就可以?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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