OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6271|回复: 8

求助!红外解码显示时各种不可理喻~

[复制链接]

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-1-29
在线时间
0 小时
发表于 2013-2-15 01:04:14 | 显示全部楼层 |阅读模式

被折磨一天了……各位好心的网友帮帮忙吧
本来按理一开始数码管应显示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);
}

当我的世界不一样,那就让我不一样
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-2-15 19:38:45 | 显示全部楼层
你先把数码管显示搞定啊.
能正常的显示各种需要的数据,再去整解码.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-1-29
在线时间
0 小时
 楼主| 发表于 2013-2-15 22:48:10 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子大哥,我发现问题主要是出现在数据类型这里,数码管里我习惯用int型,而红外这里我习惯用char型,结果数码管乱码了。但是如果数码管改用char型后,遥控器里的按键只能使数码管闪一下,数值仍是初值255.而若红外改用int型后,遥控器里的按键也只能使数码管闪一下,数值仍是初值的乱码。
本来我的理解里char型应该本质是int型,只是范围小了点,可为什么会出现这样的结果呢
当我的世界不一样,那就让我不一样
回复 支持 反对

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2013-2-23 16:22:18 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2012-3-16
在线时间
0 小时
发表于 2013-3-17 10:21:51 | 显示全部楼层
你的解码程序还少了点东西吧,           
if(OK&&(aa>=17)&&(aa<25))
            {
                RedKey<<=1;
                RedKey+=RODATA;
            } 

下面不是还要一句if(OK&&(aa==32)),这时才能把RedKey读出来。
回复 支持 反对

使用道具 举报

10

主题

74

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2013-3-22
在线时间
0 小时
发表于 2013-3-23 16:33:07 | 显示全部楼层
回复【楼主位】越不出雷池:
---------------------------------
您有没有发现你的发送函数void HC595_send_byte(char byte)类型是char  而您定义数组int smg[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};是int型  当您在调用函数的时候HC595_send_byte(smg[num]); 您想想数据累型不对结果会怎样? 鄙陋之见望海涵!谢谢!
http://mcu-web.taobao.com 有zigbee 无线电压、温湿度、继电器实验 zigbee自组网实验 stm32开发板 enc28j60以太网 web服务器
回复 支持 反对

使用道具 举报

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-1-29
在线时间
0 小时
 楼主| 发表于 2013-3-25 23:03:09 | 显示全部楼层
啊。。。我都把这帖子忘了(囧)。其实这问题很早就解决了。。确实是正点原子说的那样,是数据类型的问题!感谢各位热心的网友~~
当我的世界不一样,那就让我不一样
回复 支持 反对

使用道具 举报

31

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2010-12-14
在线时间
5 小时
发表于 2013-4-24 11:33:33 | 显示全部楼层
回复【7楼】越不出雷池:
---------------------------------
为什么读出来的都是FF呢?
你用多大的晶振?
回复 支持 反对

使用道具 举报

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-1-29
在线时间
0 小时
 楼主| 发表于 2013-4-24 17:55:35 | 显示全部楼层
回复【8楼】shilang0304:
---------------------------------
24MHzs
不过觉得应该不是晶振的问题哦,你按不同的键时数码管会变吗?
如果会的话,应该是数码管显示的问题,可能跟我一样是数据类型的原因,也可能是其他原因再找找吧
如果不会的话,那极可能就是红外程序没写好,推荐看看正点原子的《例说STM32不完全教程》里面关于红外遥控的描述,很好的
当然也可能是硬件问题
祝你成功啦!




当我的世界不一样,那就让我不一样
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表