微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 红外遥控程序里一个想不通的地方~~~~(>_<)~~~~

红外遥控程序里一个想不通的地方~~~~(>_<)~~~~

时间:10-02 整理:3721RD 点击:

程序如下:请直接看void ReadIr() interrupt 0就行

  1. </blockquote></div><div class="blockcode"><blockquote>#include<reg52.h>

  2. sbit LED1=P2^0;
  3. sbit LED2=P2^1;
  4. sbit IRIN=P3^2;

  5. unsigned char IrValue[3];
  6. unsigned char Time;

  7. void IrInit();
  8. void DelayMs(unsigned int );

  9. void main()
  10. {
  11.         IrInit();
  12.         LED1=1;
  13.         LED2=0;
  14.        
  15.         while(1)
  16.         {
  17.                 if(IrValue[2]==0x42)
  18.                         LED1=0,LED2=0;
  19.                 else if(IrValue[2]==0x52)
  20.                         LED1=0,LED2=1;
  21.                 else if(IrValue[2]==0x4A)
  22.                         LED1=LED2=1;
  23.         }
  24. }
  25. void IrInit()
  26. {
  27.        
  28.         IT0=1;//下降沿触发
  29.         EX0=1;//打开中断0允许
  30.         EA=1;        //打开总中断

  31.         IRIN=1;//初始化端口
  32. }
  33. void ReadIr() interrupt 0
  34. {
  35.         unsigned char j,k;
  36.         unsigned int err;
  37.         Time=0;       
  38.    EA=0;//关闭总中断       
  39.         DelayMs(70);

  40.         if(IRIN==0)                //确认是否真的接收到正确的信号
  41.         {         
  42.                
  43.                 err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
  44.                 /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
  45.                 侯,程序死在这里*/       
  46.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去                 
  47.                 {                       
  48.                         DelayMs(1);
  49.                         err--;
  50.                 }
  51.                 if(IRIN==1)                        //如果正确等到9ms低电平
  52.                 {
  53.                         err=500;
  54.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高电平过去
  55.                         {
  56.                                 DelayMs(1);
  57.                                 err--;
  58.                         }
  59.                         for(k=0;k<4;k++)                //共有4组数据
  60.                         {                               
  61.                                 for(j=0;j<8;j++)        //接收一组数据
  62.                                 {

  63.                                         err=60;               
  64.                                         while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
  65. //                                        while (!IRIN)
  66.                                         {
  67.                                                 DelayMs(1);
  68.                                                 err--;
  69.                                         }
  70.                                         err=500;
  71.                                         while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
  72.                                         {
  73.                                                 DelayMs(1);//0.14ms
  74.                                                 Time++;
  75.                                                 err--;
  76.                                                 if(Time>30)
  77.                                                 {
  78.                                                         EX0=1;
  79.                                                         return;
  80.                                                 }
  81.                                         }
  82.                                         IrValue[k]>>=1;         //k表示第几组数据
  83.                                         if(Time>=8)                        //如果高电平出现大于565us,那么是1
  84.                                         {
  85.                                                 IrValue[k]|=0x80;
  86.                                         }
  87.                                         Time=0;                //用完时间要重新赋值                                                       
  88.                                 }
  89.                         }
  90.                 }
  91.                 if(IrValue[2]!=~IrValue[3])
  92.                 {
  93.                         return;
  94.                 }
  95.         }
  96.     EA=1;//打开总中断

  97. }
  98. void DelayMs(unsigned int x)   //0.14ms误差 0us
  99. {
  100. unsigned char i;
  101.   while(x--)
  102. {
  103.   for (i = 0; i<13; i++)
  104. {}
  105. }
  106. }

复制代码


就是 void ReadIr() interrupt 0中断函数里的43行和103行的总中断开关。我在想因为红外线接收器会不断地给外部中断引脚高低电平,我怕会导致不断地进入中断,所以加了红色部分,避免进入中断,但是却运行不正常,无法红外遥控。去掉红色部分就能正常运行了。  表示很不解,就算我做的是多余的,但是也不应该导致程序运行不正常吧

支持分享 学习……。

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

网站地图

Top