微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 红外遥控的解码程序 运行不出来 跪求大神指点 小女子不...

红外遥控的解码程序 运行不出来 跪求大神指点 小女子不...

时间:10-02 整理:3721RD 点击:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint tf,temp,rok,getnumok,start;                                                   //定义溢出时间,       ,接收完成标志,转换完成标志
uchar rtime[],value[],rcode[];                       //定义数组  存放接收时间,存放4段码,存放用户码和数据码
uint i,j,k;
uchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};   //0~F共阴显示子码
uchar code dispbit[]={0xfd,0xfb,0xf7,0xef};                   //数码管位选码,低电平为选通,分别是P11,P12,P13,P14
                                                                           

void delayms(uint ms)
{
uchar b;
while(ms--)
{
for(b=0;b<125;b++);
}
}
void outside0(void)                     //外部中断初始化
{
EA=1;
IT0=1;
ET0=1;
}
void timer0(void)                                        //定时器0初始化
{
TMOD=0x02;
TH0=0x00;
TH0=0x00;
EA=1;
ET0=1;
}                                               
void timer0inter()interrupt 1   //定时器0中断函数
{
tf++;                                                        //计算TF溢出次数
}
void outside0inter() interrupt 0  //外部中断0中断服务函数
{
if(start)
TR0=1;                                                         //启动定时器0
if(tf>35)                      //检测引导码
{
i=0;
}
rtime[i]=tf;                                   //把每位对应的溢出时间存档
tf=0;
i++;
if(i==33)                                           //4段码接收完毕
{
TR0=0;                         //关闭定时器0
i=0;
rok=1;                                                        //接收完毕
}
else
{
start=1;
tf=0;
}
}
void getnum(void)                                  //把溢出时间转换成0、1
{
i=1;                                          
for(j=0;j<4;j++)                     //4段码
{                                                  
for(k=0;k<8;i++)                    //8位数
{
temp=temp>>1;                           //点到每个位的次序
if(rtime[i]>6)                         
temp=temp|0x80;                       //大于六秒为1
else temp=0x00;                          //小于六秒为0
i++;
}
value[j]=temp;
}
getnumok=1;                                  //转换完毕
}
void apart(void)                   //把用户码和用户反码,数据码和数据反码分开
{
rcode[0]=value[0]/16;   //把用户码前四位和后四位分开
rcode[1]=value[0]%16;
rcode[2]=value[3]/16;   //把数据码前四位和后四位分开
rcode[3]=value[3]%16;
}
void display(void)                   //数码管显示函数
{
for(i=0;i<4;i++)
{
P0=dispcode[rcode[i]];
P1=dispbit[i];
delayms(50);
}
}
void main()
{
outside0();
timer0();
while(1)
{
if(rok)
{                                        
getnum();
rok=0;
}
if(getnumok==1)
{
apart();
getnumok=0;
}
display();
}
}

求大神们指点~初学单片机 第一次做project~还请大家多多帮助

首先,鉴于上面凌乱的程序,我读不出来。但是我可以给你一个实测可以使用的程序,解码部分完全没有问题。你可以稍稍修改就行了。

  1. //#################################################################################################
  2. //文件:51单片机的红外遥控解码程序
  3. //属性:使用外部中断0连接遥控头,接收红外遥控键值送P2口显示,12MHz外部晶振
  4. //资源:P3.2=接收头输入,P2=8LED
  5. //#################################################################################################
  6. #include"reg52.h"

  7. #define uint unsigned int
  8. #define uchar unsigned char

  9. uchar led=0x00;

  10. void io_init(void);
  11. void int_init(void);

  12. void main(void)
  13. {
  14.         io_init();
  15.         int_init();
  16.         while(1);
  17. }

  18. void io_init(void) //I/O口初始化       
  19. {
  20.         P0=0xff;
  21.         P1=0xff;
  22.         P2=0xff;
  23.         P3=0xff;
  24. }

  25. void int_init(void)                   //开外部中断0
  26. {
  27.         EX0=1;
  28.         EA=1;
  29. }

  30. void interrupt0()interrupt 0          //中断子函数
  31. {
  32.         uchar i=0,j=0,k=0,us=0;
  33.         uchar addr[4]={0};

  34.         EX0=0;

  35.         for(i=0;i<255;i++)  //延时9毫秒,9ms内有高电平认为是干扰
  36.         {
  37.                 if(P3&0x04)            //延时结束,如果还是高电平,执行下一句。255的值实际时间为800us
  38.                 {
  39.                         EX0=1;                  //开外部中断0
  40.                         return;
  41.                 }                                                 
  42.         }                                //         解码程序开始执行
  43.         while(!(P3&0x04));        //等待9ms低电平过去,
  44.            for(i=0;i<4;i++)
  45.         {
  46.                 for(j=0;j<8;j++)
  47.                 {
  48.                         while(P3&0x04);        //等待4.5ms高电平过去       
  49.                         while(!(P3&0x04));        //等待0.56ms(无论0或1都有这个0.56ms的低电平引导。)低电平后面的高电平       
  50.                         //低电平脉宽为0.565ms、之后是0.56ms高电平、周期为1.125ms的组合表示二进制的“0”;
  51.                         //低电平脉宽为0.565ms、之后是1.685ms高电平、周期为2.25ms的组合表示二进制的“1”
  52.                         while(P3&0x04)                //计算这个高电平的时间
  53.                         {
  54.                                 for(us=0;us<=32;us++);        //100us的延时语句
  55.                                 if((k++)>=30)                //高电平时间过长退出程序
  56.                                 {
  57.                                         EX0=1;
  58.                                         return;
  59.                                 }
  60.                         }
  61.                         addr[i]=addr[i]>>1;        //接收一位数据
  62.                         if(k>=8)
  63.                                 addr[i]=addr[i]|0x80;        //高电平大于0.56ms,则为1
  64.                         k=0;
  65.                 }
  66.         }       

  67.         P2=~(addr[2]);         //P2的LED显示二进制键值

  68.         EX0=1;          
  69. }          

复制代码

其实 什么东西都是需要自己去动手的,尤其是写程序这方面, 我前些日子就是对红外解码进行了研究,在查阅了一些资料,知道了它的原理后 我就自己动手写了一个解码的程序, 然后逐个排除错误 最后就可以运行了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top