打印
[PIC®/AVR®/dsPIC®产品]

12F675不能接收编码信号,请高手解答一下

[复制链接]
948|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aacccc|  楼主 | 2015-4-10 15:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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;
        }
}
沙发
MOn51| | 2015-4-18 20:07 | 只看该作者
你如果把一个函数分成多个小功能函数来写的话,就不会来提问了。

使用特权

评论回复
板凳
JY-DX-JY| | 2015-4-18 20:15 | 只看该作者
是个新手。

使用特权

评论回复
地板
aacccc|  楼主 | 2015-4-20 07:48 | 只看该作者
刚学的,请问那有I/O口应该怎么设置呢?还有怎么改成外部中断,外部中断要怎么设置I/O呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

1

粉丝