|
二十出頭 發(fā)表于 2015-6-1 19:01
最后先分析出波形,再解碼!
#include
#define uchar unsigned char
#define uint unsigned int
int irtime;
uchar disp[8];
uchar startflag;//開始標(biāo)志
uchar irdata[33];//數(shù)據(jù)一共33位加上引導(dǎo)碼
uchar bitnum;
uchar irreceok;//接收一幀數(shù)據(jù)完成
uchar ircode[4];//4個(gè)字節(jié)的數(shù)據(jù)
uchar irprosok;//處理完成
sbit SH_CP=P2^4;
sbit DS=P2^5;
sbit ST_CP=P1^5;
uchar code wei[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
uchar code duan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //0123456789abcdef
void send_dat(unsigned dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DS=dat&0x80;
SH_CP=1;
SH_CP=0;
dat<<=1;
}
}
void timer0init(void)
{
TMOD=0X02;
TH0=0;
TL0=0;
ET0=1;
EA=1;
TR0=1;
}
void int0init(void)
{
IT0=1;
EX0=1;
EA=1;
}
void irwork()
{
//disp[0]=ircode[0]/16;
//disp[1]=ircode[0];
//disp[2]=ircode[1]/16;
//disp[3]=ircode[1];
// disp[4]=ircode[2]/16;
// disp[5]=ircode[2]/100;
// disp[6]=ircode[2]0/10;
// disp[7]=ircode[2];
switch (ircode[2])
{
case 6 : disp[6]=0;disp[7]=1;break;
case 12 :disp[6]=0;disp[7]=2 ;break;
case 47 :disp[6]=0;disp[7]=3;break;
case 4 : disp[6]=0;disp[7]=4;break;
case 14 :disp[6]=0;disp[7]=5 ;break;
case 45 :disp[6]=0;disp[7]=6;break;
case 33: disp[6]=0;disp[7]=7;break;
case 41 :disp[6]=0;disp[7]=8 ;break;
case 37 :disp[6]=0;disp[7]=9;break;
default : disp[5]=0;
disp[6]=15;
disp[7]=15 ;
}
}
void irpros(void) //處理函數(shù)
{
uchar k,i,j;
uchar value;
k=1;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
if(irdata[k]>10)//時(shí)間長(zhǎng)度等于1.125ms就是0 等于2.25ms就是1;
{
value=value|0x80;
}
else
{
value=value;
}
if(i<8)
{
value=value>>1;
}
k++;
}
ircode[j]=value;//ircode[j]返回的是十六進(jìn)制數(shù)。
value=0;
}
irprosok=1;
}
void display(void)
{
uchar i;
for(i=5;i<8;i++)
{
send_dat(duan[disp]); //定義段 0亮
send_dat(wei); //定義位 1亮
ST_CP=1;
ST_CP=0;
//delay(2);
}
}
void main()
{
timer0init();
int0init();
while(1)
{
if(irreceok)
{
irpros();
irreceok=0;
}
if(irprosok)
{
irwork();
irprosok=0;
}
display();
}
}
void timer0 () interrupt 1
{
irtime++;
}
void int0 () interrupt 0
{
if(startflag)
{
if(irtime<126&&irtime>=66)//檢測(cè)引導(dǎo)碼9ms
{
bitnum=0;
}
irdata[bitnum]=irtime;
irtime=0;
bitnum++;
if(bitnum==33)
{
bitnum=0;
irreceok=1;
}
}
else
{
startflag=1;
irtime=0;
}
}
比如這個(gè)改成三個(gè)控制繼電器應(yīng)該怎么改?
|
|