3258|7

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

没有任何计时器做了个红外线接收程序 有问题 帮忙看一下 [复制链接]

只用了一个外部0中断
问题我的数据码和反码总是不对
发我的部分代码上来:
void Infr(void) interrupt 0 using 2
{
        uchar i;
        i=15;
        KeyData=0;//清除数据码和反码
        KeyData2=0;
        //***********************************************  判断引导码
        while(i&&InfData==0)//查看在7500us内有没有高电平  有就为干扰信号         
        {
                Delay_500us();
                i--;
        }
       
        if(i!=0) //说明在7500us内有高电平  则为干扰信号
        {       
                Error_LED0=0;    //just for test 干扰码指示灯 亮
                goto Error_Infr;//Error_Infr();
        }
       
        while(InfData==0);//跳过9ms的引导低电平 //这个也起到纠正同步作用       
       
        i=5;//2500后判断电平        看这个信号是引导 还是连发信号
        while(i--)
        {
                Delay_500us();
        }
        if(InfData==0)//如果电平为低 那么这个信号为连发信号
        {
                ReSend_Inf();  //这个连发信号函数里只有一个us的延时语句
        }
        while(InfData==1);//跳过引导高电平  //这个也起到纠正同步作用
        //********************************************以下为接受32bit的数据码        低系统码SysNOL
        for(i=0;i<8;i++)    //接收8位bit 变成为一个uchar
        {
                while(InfData==0);//跳过低电平
                Delay_500us();
                Delay_150us();
                //跳到650us后判断电平 是数据0还是1
                if(InfData==0)
                {
                        SysNOL=SysNOL&0x7f;//对最高位清0 其他位不变
                }               
                else
                {
                        SysNOL=SysNOL|0x80; //对最高位置1  其他位不变
                }
                if(i!=7)  //接收最后一位不用移位
                {
                        SysNOL=SysNOL>>1;          //移位 空出最高位  准备接收下一个高位
                }
                while(InfData==1);//如果SysNOL为1 则跳过其他的高电平 准备另一个位的低电平到来         如果SysNOL为0也就直接跳出来了
        }
        //********************************************以下为接受32bit的数据码         高系统码SysNOH
        for(i=0;i<8;i++)    //接收8位bit 成为一个uchar
        {
                while(InfData==0);//跳过低电平
                Delay_500us();
                Delay_150us();
                //跳到650us后判断电平 是数据0还是1                 
                if(InfData==0)
                {
                        SysNOH=SysNOH&0x7f;//对最高位清0
                }               
                else
                {
                        SysNOH=SysNOH|0x80; //对最高位置1
                }
                if(i!=7)
                {
                        SysNOH=SysNOH>>1;          //移位  准备接收下一个高位
                }
                while(InfData==1);//跳过其他的高电平 准备另一个位的到来
        }
        //********************************************以下为接受32bit的数据码        数据码KeyData
        for(i=0;i<8;i++)    //接收8位bit 成为一个uchar
        {
                while(InfData==0);//跳过低电平
                Delay_500us();
                Delay_150us();
                //跳到650us后判断电平 是数据0还是1
                if(InfData==0)
                {
                        KeyData=KeyData&0x7f;//对最高位清0
                }               
                else
                {
                        KeyData=KeyData|0x80; //对最高位置1
                }
                if(i!=7)
                {
                        KeyData=KeyData>>1;          //移位  准备接收下一个高位
                }
                while(InfData==1);//跳过其他的高电平 准备另一个位的到来
        }
        //********************************************以下为接受32bit的数据码        数据反码KeyData2
        for(i=0;i<8;i++)    //接收8位bit 成为一个uchar
        {
                while(InfData==0);//跳过低电平
                Delay_500us();
                Delay_150us();
                //跳到650us后判断电平 是数据0还是1
                if(InfData==0)
                {
                        KeyData2=KeyData2&0x7f;//对最高位清0
                }               
                else
                {
                                KeyData2=KeyData2|0x80; //对最高位置1
                }
                if(i!=7)
                {       
                        KeyData2=KeyData2>>1;          //移位  准备接收下一个高位
                }
                while(InfData==1);//跳过其他的高电平 准备另一个位的到来
        }
        ReInf=1;  //说明不是干扰信号  有遥控按键接收
        Error_LED0=1;//说明不是干扰信号 灭Error_LED0灯
        Error_Infr:
        Re_LED1=1;   //just for test有按键 灭掉有接收的灯 延时1s
        Delay_1s();
}

void main()
{
        //初始化外部0中断
        EA=0;
        IT0=0;
        IE0=0;
        EX0=1;  //外部中断允许
        EA=1;
        while(1)
        {
                if(ReInf==1)
                {
                        ReInf=0;    //处理了按键后就对其复位
                        Re_LED1=0;  //处理了按键后就对其复位
                        if((KeyData2=~KeyData2)==KeyData)  //查看数据码和反码时候对了
                        {
                                //查看在LCD显示数据码 这个绝对没问题的
                                Write_Date(1,1,1,&ID[(KeyData&0xf0)>>4]);
                                Write_Date(1,2,1,&ID[KeyData&0x0f]);
                        }
                        else       //just for test 如果数据码和反码错了 就输出一个信息
                        {
                                Write_Date(1,9,1,&ID[13]);
                        }
                }
        }
}

最新回复

期待你更多的消息  详情 回复 发表于 2007-4-30 00:22
点赞 关注

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
由于没有计时器计时 所以用while(InfData==1);或者while(InfData==0);//跳过引导高/低电平  起到纠正同步作用 来减少时间的误差!   不知道这种思想对不?
还有输出测试信号的用法不知道合理不?

有什么建议都可以提出来  我去试试看!
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
现在不知道修改了那里 它总是判断为干扰码了!
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
你那中断太牛了!!

呵呵
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
lbing7(向青润老大学习!!!) :"你那中断太牛了!!"

不懂  难道我的中断程序太多了??
但是我最近做那个时钟的T1中断更多程序(那个程序也向你请教过的)啊 为什么又可以啊?
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

6
 
lbing7(向青润老大学习!!!) :"你那中断太牛了!!"

不懂  难道我的中断程序太多了??


能回答吗
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

7
 
自个顶
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

8
 
期待你更多的消息
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表