为什么我的红外接收程序在STC15F104E上用遥控按几次就不行了,有时候能按几十次??求大神指导

2019-07-15 16:09发布

为什么我的红外接收程序在STC15F104E上用遥控按几次就不行了,有时候能按几十次??
程序.zip 下载积分: 积分 -1 分
28.75 KB, 下载次数: 50, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
DHTDHT
2019-07-16 00:47
elecfans跑堂 发表于 2015-9-7 14:02
请将详细的程序内容复制出来  方便查看回答

#include<reg51.h>
#include <intrins.h>
sbit LSA  = P3^5;
sbit IRIN = P3^2;
unsigned char DisplayData[8]; //用来存放要显示的8位数的值
unsigned char IrValue[6];          //用来存放读取到的红外值
unsigned char Time;
//--声明全局函数--//
void DigDisplay(); //动态显示函数
void IrInit();
void DelayMs(unsigned int );         
/*******************************************************************************
* 函数名         : DelayMs()
* 函数功能                   : 延时
* 输入           : x
* 输出                  : 无
*******************************************************************************/
void DelayMs(unsigned int x)   //0.14ms误差 0us
{
        unsigned char i;
        while(x--)
        {
                for (i = 0; i<13; i++)
                {}
        }
}
void Delay140us()                //@11.0592MHz
{
  unsigned char i, j;

        i = 2;
        j = 126;
        do
        {
                while (--j);
        } while (--i);
}
/*******************************************************************************
* 函数名         : IrInit()
* 函数功能                   : 初始化红外线接收
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void IrInit()
{
        IT0=1;//下降沿触发
        EX0=1;//打开中断0允许
        EA=1;        //打开总中断
        IRIN=1;//初始化端口
}
/*******************************************************************************
* 函数名         : ReadIr()
* 函数功能                   : 读取红外数值的中断函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void ReadIr() interrupt 0
{
        unsigned char j,k;
        unsigned int err;
        Time=0;                                         
        DelayMs(70);
        if(IRIN==0)                //确认是否真的接收到正确的信号
        {         
               
                err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
                /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
                侯,程序死在这里*/       
                while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去                 
                {                       
                        Delay140us();
                        err--;
                       
                }
                if(IRIN==1)                        //如果正确等到9ms低电平
                {
                        err=470;
                        while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高电平过去
                        {
                                Delay140us();
                                err--;
                        }
                        for(k=0;k<4;k++)                //共有4组数据
                        {                               
                                for(j=0;j<8;j++)        //接收一组数据
                                {

                                        err=60;               
                                        while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
                                        {
                                                Delay140us();
                                                err--;
                                        }
                                        err=500;
                                        while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
                                        {
                                                Delay140us();//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;       
                }
        }                       
}

/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能                   : 使用数码管显示
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void DigDisplay()
{
switch(IrValue[2])
        {
                 case 0x45:{
                           LSA=0;
                                  
                           }break;
                 case 0x46:{
                           LSA=1;
                                  
                           }break;                    
         default:break;
        }
}
void main()
{
        IrInit();
       
        while(1)
        {
                IrValue[4]=IrValue[2]>>4;                          //高位
                IrValue[5]=IrValue[2]&0x0f;                //低位
                DigDisplay();
        }
}

一周热门 更多>