打印
[应用相关]

红外解码出问题了……

[复制链接]
1279|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tianli1980|  楼主 | 2014-2-12 17:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本来按理一开始数码管应显示255,可是却显示乱码,连本不可能出现的小数点,在一些按键中也出现了
sbit RDATA=P3^3;   //红外接口 与外部中断一相连
unsigned char RedKey=255;   //红外摇控的键值,无键按下时为255


//红外初始化
void Red_Init(void)
{
RDATA=1;  //P3^3输出高电平
EX1=1;   //开启红外中断 P3^3
EA=1;     //开总中断
IT1=1;   //外部中断下降沿触发
}

//检测高电平脉冲宽度,逻辑0 560微秒 逻辑1 1680微秒
//高电平最长脉冲不超过5毫秒
//返回值:T  脉宽为T*20微秒
unsigned char Get_PulseWidth(void)
{
    unsigned char t=0,a=0;
    while(RDATA)//高电平到来,检测其脉宽
    {
        t++;
  for(a=0;a<68;a++); // 延时20微秒
        if(t==250)return t; //超时溢出
    }
    return t;
}     
/*-------------------------协议--------------------------
开始拉低9ms,接着是一个4.5ms的高脉冲,通知器件开始传送数据了
接着是16位前导脉冲,用于识别该型号的摇控。
然后是发送8位数据的原码,接着又发送8位数据的反码.
最后是一个长脉冲,和开始位一样,拉低9ms和一个4.5ms脉冲表示结束。
每个按键不同这处只在于那8位数据的原码和反码,因些只须要识别
8位原码就可以识别按键了
---------------------------------------------------------*/
/****** 外部中断1服务程序,按键处理 ******/
void EXTI1_ISR() interrupt 2
{
    unsigned char res=0,aa=0;  //aa用于取位         
    char OK=0; //收到前导位的标志
    char RODATA=0;
    while(1)
    {        
        if(RDATA)//有高脉冲出现
        {
            res=Get_PulseWidth();//获得此次高脉冲宽度   
            if(res==250)break;//非有用信号
            if(res>=200&&res<250)OK=1; //获得前导位(4.5ms) 介于4毫秒与5毫秒之间
            else if(res>=70&&res<100)  //如果是宽脉冲,则RODATA=1
            {
                aa++;
                RODATA=1;//1.5ms            
            }
            else if(res>=10&&res<50)  //如果是窄脉冲,则RODATA=0      
            {
                aa++;
                RODATA=0;//500us              
            }
            //舍去16位前导脉冲,从第17位开始接着的8位是数据的正码,再后8位是反码
            //获取正码
            if(OK&&(aa>=17)&&(aa<25))
            {
                RedKey<<=1;
                RedKey+=RODATA;
            }
            

        }   
    }
}  
void main()
{
    char temp=255;
    P0=0x00;
    Red_Init();
    while(1)
   {
     temp=RedKey;
     SMG_display(temp);//显示
    }
}



下面是数码馆程序,以前一直用,现在只是把int换为char,问题应该不大,也复制过来吧
int smg[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
sbit HC595_REG=P0^6;
sbit HC595_RCK=P0^5;
sbit HC595_SCK=P0^4;
sbit HC595_SEG=P0^7;
void delay_ms(unsigned char time)
{
unsigned int t;
for(;time>0;time--)
{
  t = 1500;
  while(t--);

}
}
void HC595_send_byte(char byte)
{
  char i,temp;
for(i=0;i<8;i++)
{
   temp=byte&(1<<i);
  if(temp)
  {
    HC595_SEG=1;
  }
  else
  {
    HC595_SEG=0;
  }
   HC595_SCK=1;
   HC595_SCK=0;
}
HC595_RCK=0;
HC595_RCK=1;
}
void HC595_show_num(char num)
{
HC595_send_byte(smg[num]);
}
void SMG_display(char dat)
{
   P0=0x01;
  HC595_show_num(dat/1000);
  delay_ms(2);
  P0=0x02;
  HC595_show_num(dat%1000/100);
  delay_ms(2);
  P0=0x04;
  HC595_show_num(dat%100/10);
  delay_ms(2);
  P0=0x08;
  HC595_show_num(dat%10);
  delay_ms(2);
}



沙发
airwill| | 2014-2-13 10:20 | 只看该作者
恐怕是时间冲突了.
有没有计算一下 EXTI1_ISR() 函数执行要多久? 这段时间里, 数码显示的代码不能执行, 会发生什么情况?

使用特权

评论回复
板凳
jxmzzr| | 2014-2-14 18:11 | 只看该作者
你先把数码管显示搞定啊.
能正常的显示各种需要的数据,再去整解码.

使用特权

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

本版积分规则

482

主题

2214

帖子

11

粉丝