打印

这个红外线程序怎么理?看了半天没看不懂

[复制链接]
1819|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
长缨在手|  楼主 | 2011-8-15 12:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>         
#include<intrins.h>

sbit hwx=P3^3;            

code unsigned char table[]=
            {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
            0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
            //共阴数码管 0-9 a-f - 表
unsigned char l_tmpdate[8]={0,0,0x10,0,0};

unsigned char l_lhj[66];        //定义66位数组变量来存储接收的时间参数
void delay();//延时子函数
void display(unsigned char *lp,unsigned char lc);//数字的显示函数;lp为指向数组的地址,lc为显示的个数

void main(void)     //入口函数
{
    EA=1;            //首先开启总中断
    EX1=1;          //开启外部中断 1
    IT1=1;        // 设置成 下降沿触发方式
    while(1){        //循环显示,接收都由中断处理
        display(l_tmpdate,5);        
    }        

}
void display(unsigned char *lp,unsigned char lc)//显示
{
    unsigned char i;        //定义变量
    P2=0;                    //端口2为输出
    P1=P1&0xF8;                //将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管
    for(i=0;i<lc;i++){        //循环显示
    P2=table[lp[i]];        //查表法得到要显示数字的数码段
    delay();                //延时
    P2=0;                    //清0端口,准备显示下位
    if(i==7)                //检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据
        break;   
    P1++;                    //下一位数码管
    }
}
void delay(void)                                //空5个指令
{
    unsigned char i=13;
    while(i)
        i--;
}
void hongwai(void)   interrupt 2     //外部中断 1 ,INT1(P3^3)连接红外线接收IC数据脚
{
    unsigned char i,j,tmp;
    EX1=0;
//    hwx=1;
    j=33;            //传送一组数包括引导码1位,地址码8位加反码8位,指令码8位加反码8位,总共33位
    i=0;            //从第一维数组开始
    tmp=100;        //加八延时,
    while(tmp){
    tmp--;
    }
    if(hwx){        //然后再检测红线接收脚是有数据招收,有继续,没有则退出
        EX1=1;
        return;
    }   
    while(j){        //循环接收33位数据,为何我们用到66位数组,我们可以不接收高电平时间常数,只接低电平常数就
                //可以判断1或0了,在这里我们都接收,为串口调试软件接收计算波形
                //还有一点要知道,接收波形是反向,在没有接收时端口为高电平
        tmp=0;
        l_lhj[i]=1;        //时间量从1开始
        while(!hwx){    //检测高低电平的变化
            l_lhj[i]++;        //没变继续加1
            delay();        //加入延时,是因为我们采用8位二进来存储,如果不加延时,时间量将计满
            tmp++;            //此变量为防止干扰带来的死循环
            if(tmp==250)
                break;
        }
        i++;
        tmp=0;
        l_lhj[i]=1;        //时间量从1开始
        while(hwx){        //检测高低电平的变化
            l_lhj[i]++;    //没变继续加1   
            delay();        //同上
            tmp++;
            if(tmp==250)
                break;
        }   
        i++;        
        j--;
    }
    i=255;                //加入循环延时,抗干扰
    while(i){
    tmp=255;
    while(tmp){
    P2=0XF0;
    tmp--;
    }
    i--;            
    }
    tmp=0;
    for(i=3;i<19;i++,i++){        //处理地址位,对低电平时间数据的数理,这里我们只处理地址码和指令码,引导码和反码我们就忽略
        tmp>>=1;                //右移一位,接收低电平在前
        if(l_lhj[i]>30)            //检测低电平时间超过30就确认为1
            tmp+=0x80;
    }   
    l_tmpdate[0]=tmp/16;        //分开2位以16进制显示
    l_tmpdate[1]=tmp%16;
    tmp=0;
    for(i=35;i<51;i++,i++){        //同上,这里处理指令位
        tmp>>=1;
        if(l_lhj[i]>30)
            tmp+=0x80;
    }
    l_tmpdate[3]=tmp/16;
    l_tmpdate[4]=tmp%16;   
    EX1=1;   
}



主要是void hongwai(void)   interrupt 2  这块?

相关帖子

沙发
草履虫| | 2011-8-15 18:40 | 只看该作者
看明白这段程序,需要先看一下NEC的遥控器编码方式才行.
0,1的判断是根据delay()延时的长短及P3.3电平高低来判断的.至于是头开始,还是0,1,一定要接合nec的IR协议才能得出结果.

使用特权

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

本版积分规则

1

主题

27

帖子

1

粉丝