红外遥控程序里一个想不通的地方~~~~(>_<)~~~~
时间:10-02
整理:3721RD
点击:
程序如下:请直接看void ReadIr() interrupt 0就行
- </blockquote></div><div class="blockcode"><blockquote>#include<reg52.h>
- sbit LED1=P2^0;
- sbit LED2=P2^1;
- sbit IRIN=P3^2;
- unsigned char IrValue[3];
- unsigned char Time;
- void IrInit();
- void DelayMs(unsigned int );
- void main()
- {
- IrInit();
- LED1=1;
- LED2=0;
-
- while(1)
- {
- if(IrValue[2]==0x42)
- LED1=0,LED2=0;
- else if(IrValue[2]==0x52)
- LED1=0,LED2=1;
- else if(IrValue[2]==0x4A)
- LED1=LED2=1;
- }
- }
- void IrInit()
- {
-
- IT0=1;//下降沿触发
- EX0=1;//打开中断0允许
- EA=1; //打开总中断
- IRIN=1;//初始化端口
- }
- void ReadIr() interrupt 0
- {
- unsigned char j,k;
- unsigned int err;
- Time=0;
- EA=0;//关闭总中断
- DelayMs(70);
- if(IRIN==0) //确认是否真的接收到正确的信号
- {
-
- err=1000; //1000*10us=10ms,超过说明接收到错误的信号
- /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
- 侯,程序死在这里*/
- while((IRIN==0)&&(err>0)) //等待前面9ms的低电平过去
- {
- DelayMs(1);
- err--;
- }
- if(IRIN==1) //如果正确等到9ms低电平
- {
- err=500;
- while((IRIN==1)&&(err>0)) //等待4.5ms的起始高电平过去
- {
- DelayMs(1);
- err--;
- }
- for(k=0;k<4;k++) //共有4组数据
- {
- for(j=0;j<8;j++) //接收一组数据
- {
- err=60;
- while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
- // while (!IRIN)
- {
- DelayMs(1);
- err--;
- }
- err=500;
- while((IRIN==1)&&(err>0)) //计算高电平的时间长度。
- {
- DelayMs(1);//0.14ms
- Time++;
- err--;
- if(Time>30)
- {
- EX0=1;
- return;
- }
- }
- IrValue[k]>>=1; //k表示第几组数据
- if(Time>=8) //如果高电平出现大于565us,那么是1
- {
- IrValue[k]|=0x80;
- }
- Time=0; //用完时间要重新赋值
- }
- }
- }
- if(IrValue[2]!=~IrValue[3])
- {
- return;
- }
- }
- EA=1;//打开总中断
- }
- void DelayMs(unsigned int x) //0.14ms误差 0us
- {
- unsigned char i;
- while(x--)
- {
- for (i = 0; i<13; i++)
- {}
- }
- }
就是 void ReadIr() interrupt 0中断函数里的43行和103行的总中断开关。我在想因为红外线接收器会不断地给外部中断引脚高低电平,我怕会导致不断地进入中断,所以加了红色部分,避免进入中断,但是却运行不正常,无法红外遥控。去掉红色部分就能正常运行了。 表示很不解,就算我做的是多余的,但是也不应该导致程序运行不正常吧
支持分享 学习……。