OpenEdv-开源电子网

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

红外解码……求原子大哥和各位热心网友帮帮忙

[复制链接]

8

主题

30

帖子

0

精华

初级会员

Rank: 2

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

在学红外解码,正打算读取遥控器上各位的码值,下载程序后只显示初值0,怎么按都没反应…………求指点 

#include"STC12C5A.h"
sbit IRIN=P3^3;//红外接收脚与INT1相连,即外部中断1
double num1=0;//定时器0计时用数
int IM[32]=0;//存贮16位地址码与8位数据码与8位反码
/*四个函数均为数码管里的函数,放在另一个c文件*/
void delay_ms(unsigned int time);
void HC595_send_byte(int byte);
void HC595_show_num(int num) ;
void SMG_display(int dat) ;
/*定时器0初始化函数*/
void delay_MS_Timer0_INit()
{
 TMOD=0x02;//模式2:8位自动重装
 TH0=6;
 TL0=6;
 EA=1;//总中断
 ET0=1;//定时器0中断
  TR0=1; //开始计时

}
/*定时器0中断函数*/
void Timer0_Isp() interrupt 1
{
  num1++;
}
/*红外初始化*/
void red_Init()
{
   IRIN=1;
  IT1=1;//外部中断1下降沿触发
    EX1=1;//允许外部中断1
}
/*延时n毫秒*/

void delay_MSS(double n)
{
 delay_MS_Timer0_INit();
 while(num1<n*8);
 TR0=0;//关闭计时器
 num1=0;//清零num1
}
/*从32位码波中获取一个位*/
int Get_bit(void)
{
  while(!IRIN);//等待0.56毫秒后的低电平过后高电平的到来
    delay_MSS(0.84);//高电平到来后延时0.84毫秒判断是否仍为高电平
 if(IRIN==1)
 {
   return 1;
 }
 else
 {
   return 0;
 }
}
void red_Isp() interrupt 2
{
  int i=0;
 EX1=0;//关中断,防止接受波形中众多下降沿的干扰
 delay_MSS(9);//跳过开始码
 while(!IRIN);//等待4.5毫秒的高电平的到来
 delay_MSS(4.5);//延时4.5毫秒,跳过结果码
/*把32位码波写入数组IM*/
 for(i=0;i<32;i++)
 {
   IM=Get_bit();
 }

}

void main()
{  
 int rednum,s;
  red_Init();//初始化
 rednum=IM[31]+IM[30]*10+IM[29]*100+IM[28]*1000;//取数组后四位
 s=100;
 while(s--)
 SMG_display(rednum);//数码管显示
}

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

使用道具 举报

28

主题

306

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
1320
金钱
1320
注册时间
2012-6-3
在线时间
353 小时
发表于 2013-2-14 23:10:11 | 显示全部楼层
回复【楼主位】越不出雷池:
---------------------------------
可以参考。
#include<reg52.h>                            
#define uchar unsigned char            
#define uint  unsigned int
//1602   3个口
sbit rs=P2^0;
sbit rw=P2^1;
sbit e= P2^2;                                  
uchar irdata[33];//1+8+8+8+8=33
uchar irreceok;//接收完毕
uchar ircode[4];//提取出来,解码
uchar disp[33];
uchar k,value,i,j,p,b,m,irprosok,startflag;//p红外接收时间b编码的位;startflag标志位                 
void delay(int a)                   
{
    while(a--);     
}
void delay1(void)   //误差 0us
{
    uchar a,b;
    for(b=8;b>0;b--)
        for(a=25000;a>0;a--);

void zhongduan(void)//中断函数
{
    TMOD = 0x02;
    TH0 = 0x00;
    TL0 = 0x00;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
EX0=1;
IT0=1;//边沿触发方式
}
void  write_com(uchar com)//写指令
{
   e=0;
   rs=0;
   rw=0;
   0=com;
   delay1();
   e=1;
   delay1();
   e=0;
}
void  write_date(uchar date)//写数据
{  e=0;
   rs=1;
   rw=0;
   0=date;
   delay1();
   e=1;
   delay1();
   e=0;
}
void init()//初始化
{
    delay1();
    write_com(0x38);
delay1();
    write_com(0x38);
delay1();
    write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
}
void irpros(void)//每一位进行解码
{
 k=1;
 for(j=0;j<4;j++)
 {
     for(i=0;i<8;i++)
     {
     value=value>>1;
         if(irdata[k]>6)
          {
       value=value|0x80;//得到的十六进制数
          }
       k++;
   }
   ircode[j]=value ;
}
   irprosok=1;  
}
void irwork()//进制转换
{
  disp[0]=ircode[0]/16 ;//将16进制分成2进制显示
  disp[1]=ircode[0]%16 ;
  disp[2]=ircode[1]/16 ;
  disp[3]=ircode[1]%16 ;
  disp[4]=ircode[2]/16 ;
  disp[5]=ircode[2]%16 ;
  disp[6]=ircode[3]/16 ;
  disp[7]=ircode[3]%16 ;
}
void display(void)//液晶显示
{
  write_com(0xc0);
  for(m=0;m<8;m++)
  {
    write_date(disp[m]+0x30); 
delay(220);
  }

void main()//主函数                     
{  
   zhongduan();   
   init();
 /*write_com(0x80);
for(j=0;j<15;j++)
 {
 write_data(plc[j]) ;
  delay1();
  }*/
   while(1)
  {
  if(irreceok)
  {
   irpros();
   irreceok=0;
  }
   if(irprosok)
  {
   irwork();
   irprosok=0;
     }  
  display();                 
  }  
}
void hongwai()interrupt 0 //外部中断
{
 if(startflag)
   {
    if(p>32)   //检测引导码
      {
       b=0;
       }
       irdata=p;
       p=0;
       b++;
        if(b==33)
     {  
   b=0;
       irreceok=1;
          }
    }  
    else
   {
     p=0;
startflag=1;    
    }   
}
void hongwai1()interrupt 1 //定时器中断
{
p++;
}
回复 支持 反对

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

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

使用道具 举报

10

主题

74

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2013-3-22
在线时间
0 小时
发表于 2013-3-26 08:32:27 | 显示全部楼层
main函数那里有问题,应该改成如下
void main()
{  
 int rednum,s;
  red_Init();//初始化
 rednum=IM[31]+IM[30]*10+IM[29]*100+IM[28]*1000;//取数组后四位
 s=100;
 while(1)
 SMG_display(rednum);//数码管显示
}
如果解码不正确,可以用逻辑分析仪进行解码分析,这样会大大提高您的效率 
http://mcu-web.taobao.com 有zigbee 无线电压、温湿度、继电器实验 zigbee自组网实验 stm32开发板 enc28j60以太网 web服务器
回复 支持 反对

使用道具 举报

69

主题

289

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1294
金钱
1294
注册时间
2013-3-14
在线时间
62 小时
发表于 2013-3-26 16:33:55 | 显示全部楼层
回复【2楼】艾科:
---------------------------------
#include<reg52.h> 
#include"config.h"
#include"delay.h"

#define LED_DATA 0

sbit duanxuan=P2^2;
sbit weixuan=P2^3;
sbit IR=P3^2;

uchar code duanma[]=
{
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
uchar code weima[]=
{
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f
};

void display(uchar FirstBit,uchar Num);
void timer0_init();
void INT0_init();
void irpros();
void irwork();

uchar TempData[8];
uchar irdata[33];
uchar ircode[4];
uchar irtime;
uchar bitnum;
bit startflag;
bit irreceok;
bit irprosok;

void main()
{
timer0_init();
INT0_init();
while(1)
{
  if(irreceok)
{
irpros();
irreceok=0;
}
if(irprosok)
{
irwork();
irprosok=0;
}
display(0,8);
}
}

void display(uchar FirstBit,uchar Num)
{
uchar i;
for(i=0;i<Num;i++)

   LED_DATA=0;
       duanxuan=1;
       duanxuan=0;

       LED_DATA=weima[i+FirstBit]; 
       weixuan=1;
       weixuan=0;

       LED_DATA=TempData;
       duanxuan=1;
       duanxuan=0;
   delay1ms(2);
}
}

void timer0_init()
{
TMOD|=0x02;
TH0=0x00;
TL0=0x00;
ET0=1;
EA=1;
TR0=1;
}

void INT0_init()
{
EX0=1;
EA=1;
IT0=1;
}

void timer0() interrupt 1
{
irtime++;
}

void INT0interrupt() interrupt 0
{
if(startflag)
{
if(irtime>93)//检测引导码
{
bitnum=0;
}
irdata[bitnum]=irtime;
irtime=0;
bitnum++;
if(bitnum==33)
{
bitnum=0;
irreceok=1;
}
}
else
{
startflag=1;
irtime=0;
}
}

void irpros()
{
uchar k=1,i,j,value;
for(j=0;i<4;j++)
{
for(i=0;i<8;i++)
{
value>>=1;
if(irdata[k]>12)
{
value|=0x80;
}
k++;
}
ircode[j]=value;
}
irprosok=1;
}

void irwork()
{
TempData[0]=duanma[ircode[0]/16];
TempData[1]=duanma[ircode[0]%16];
TempData[2]=duanma[ircode[1]/16];
TempData[3]=duanma[ircode[1]%16];
TempData[4]=duanma[ircode[2]/16];
TempData[5]=duanma[ircode[2]%16];
TempData[6]=duanma[ircode[3]/16];
TempData[7]=duanma[ircode[3]%16];
}这个可以看看,也是数码管显示的
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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