用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--)
{
;
}
}
|