本帖最后由 aacccc 于 2015-4-10 15:18 编辑
请高手看一下,配置位是否正确,入口函数是不是不正确,整个不正常了。本人初学很多都不懂,请高手帮帮忙。这个程序哪里有问题,这是程序一部份,太多发不上去。
#include<pic.h>
__CONFIG(0x01C4); //使用内部晶振,使用内部复位,关看门狗 配置位
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define RELAY GPIO0 //
#define PLED GPIO1 //
#define RFIN GPIO2 //信号输入 1
#define PRESS GPIO3 //
#define JMP GPIO4 //
#define IRLED GPIO5 //
uchar tong;//同步头检测次数
uint t1,t2,a,irtime;//脉冲宽度暂存变量
uchar addr1,addr2,addr3,waddr1,waddr2,waddr3,irdata;//定义地址,数据暂存区
uchar out,irok,wirok=0;//解码成功标志
uchar rdata1,rdata2,rdata3;//读出的地址数据
uchar data;//写入的地址数据
uchar write_addr=0x01;//读出的EEPROM内部地址
uchar zhankao=0x01; //上次学习后保存到EEPROM的参考地址
uchar bj,relay_out;//学习解码成功
//写EEPROM子程序
//**********************
void write(unsigned char waddr,unsigned char data)
{
GIE=0;
EEADR=waddr;//送内部地址
EEDATA=data;//获取要写入EEPROM的数据
EECON2=0x55;
EECON2=0xaa;
WR=1; //启动写
GIE=1;
while(WR);
WREN=0;
}
//入口函数
//**********************
void init()
{
CMCON=0x07;//关比较器
TRISIO=0x1C;
GIE=0;
PEIE=1;
TMR0=0xFC;//0x8a;
T0IE=1;
TMR1H=0x00;
TMR1L=0x00;
GIE=1;//开总中断
PLED=1;
}
//主函数main//
//*******************************
void main()
{
init();
relayout();
write(0x00,0x01);
while(1)
{
if(PRESS==0)
{
int i,j,k;
IRLED=1;
for (i=1000;i>0;i--)
for (j=1000;j>0;j--)
if(irok==1)
{
delay(20);
while(PRESS==0);
read(0x00); //读上次学习码保存地址
zhankao=out;
if(zhankao>=30)zhankao=0x01;
write(zhankao,waddr1);//将今次学习码高8位地址保存到下一地址;
zhankao++;
write(zhankao,waddr2);//将今次学习码低8位地址保存到下一地址;
zhankao++;
write(zhankao,waddr3);//将今次学习码低8位地址保存到下一地址;
zhankao++;
write(0x00,zhankao);
IRLED=0;//保存今次学习码地址
goto wend;
}
for (k=1000;k>0;k--);
wend:IRLED=0;
}
else if(irok==1)
{
irok=0;
for(a=0;a<=10;a++)
{
read(write_addr);
rdata1=out;
write_addr++;
read(write_addr);
rdata2=out;
write_addr++;
read(write_addr);
rdata3=out;
write_addr++;
if(write_addr>=30)write_addr=0x01;
if((rdata1==addr1)&&(rdata2==addr2)&&(rdata3==addr3))
{
if(irdata==0x1){irdata=0;IRLED=0;}
else if( irdata==0x8){irdata=0;IRLED=1;}
else if(irdata==0x2){irdata=0;IRLED=0;}
else if (irdata==0x4){irdata=0;IRLED=1;}
goto end;
}
}
end:;
}
}
}
//定时器TMR0中断 解码程序
//*********************
void interrupt T0(void)
{
uchar x,z;
if(T0IF==1)
{
T0IF=0;
GIE=0;
z++;
if(z==2)
{
z=0;
if(irok==0)
{
TMR1H=0x00;
TMR1L=0x00;
while (RFIN==1);//等待接收同步头
TMR1ON=1;
while (RFIN==0);
TMR1ON=0;
t1=TMR1H;
t1<<=8;
t1 += TMR1L;
TMR1H=0x00;
TMR1L=0x00;
if ((t1>11000)&&(t1<17000)) //是接收到同步头
{
uchar i=0,y;tong++;
rdata1=0;
rdata2=0;
rdata3=0;
addr1=0;
addr2=0;
addr3=0;
irdata=0;
if(tong>=2) //检测2次同步头,为了防干扰
{
rdata1=0;
tong=0;
for(y=0;y<24;y++)
{
irtime=0;
TMR1H=0x00;
TMR1L=0x00;
while(RFIN==0);//开始接收数据
TMR1ON=1;
while(RFIN==1);
TMR1ON=0;
irtime=TMR1H;
irtime<<=8;
irtime += TMR1L;
TMR1H=0x00;
TMR1L=0x00;
if(i<8)
{
addr1<<=1;
if(irtime>900)//检测大于900US则认为是宽脉冲
{
addr1|=1;
}
i++;
}
else if(i<16)
{
addr2<<=1;
if(irtime>900)
{
addr2|=1;
}
i++;
}
else if(i<20)
{
addr3<<=1;
if (irtime>900)
{
addr3|=1;
}
i++;
}
else if(i<24)
{
irdata<<=1;
if(irtime>900)
{
irdata|=1;
}
i++;
if(i>=24)
{
i=0;
irok=1;
wirok=1;
waddr1=addr1;
waddr2=addr2;
waddr3=addr3;
goto end;
}
}
}
}
}
}
}
end:
TMR0=0xfc;//0x8a;
GIE=1;
}
} |