标题:
单片机红外遥控的程序修改,求帮助
[打印本页]
作者:
DIY电子
时间:
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--)
{
;
}
}
作者:
liugao888
时间:
2021-3-27 00:05
修改按键码处理程序位置,检测到处理码就置低电平,然后开启一个定时器。在一定时间内入果继续检测到这个码就把定时器时间复位重新开始计时直到放开按键,定时器中断后置高电平
作者:
mengzhixinheng
时间:
2021-3-27 01:14
这个与你的红外解码程序没什么关系。当你按下某个按键时,单片机解码,如果一直按下就是红外连续按键功能,但键码并没有变,只要键码没变就一直输出低电平就行了,按键释放键码归零输出高电平。前提是必须有连续按键的解码功能,这个就多两三行代码。
作者:
xiaomo1513
时间:
2021-3-27 10:08
中断服务函数的问题,完成一个接收后,IR_OK=1,而前面又有if(IR_Ok) return,主程序未处理完遥控指令前,没有执行IR_OK=0,所以程序不会再接收遥控信号。
作者:
DIY电子
时间:
2021-3-28 12:06
xiaomo1513 发表于 2021-3-27 10:08
中断服务函数的问题,完成一个接收后,IR_OK=1,而前面又有if(IR_Ok) return,主程序未处理完遥控指令前,没 ...
是不是IR_OK=0改为IR_OK=1 就可以?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1