单片机/MCU论坛
直播中

陈梓淳

5年用户 8经验值
私信 关注
[问答]

用51单片机做了一个红外通信遥控的程序,但是没有成功,可以帮我看一下代码错误在哪吗?

#include

typedef unsigned char u8;
typedef unsigned int u16;

***it k1=P3^1;
***it k2=P3^0;
***it k3=P3^2;
***it PWM=P2^0;
                           ***it IRIN=P3^2;

u8 IrValue[7];
u16 value=12,timer1=0;count=0;Time;
void delay(unsigned int x)
{
unsigned int i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}

void IrInit()
{
        IT0=1;//下降沿触发
        EX0=1;//打开中断0允许
        EA=1;        //打开总中断

        IRIN=1;//初始化端口
}

void ReadIr() interrupt 0
{
        u8 j,k;
        u16 err;
        Time=0;                                         
        delay(700);        //7ms
        if(IRIN==0)                //确认是否真的接收到正确的信号
        {         
               
                err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
                /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
                侯,程序死在这里*/        
                while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去                  
                {                        
                        delay(1);
                        err--;
                }
                if(IRIN==1)                        //如果正确等到9ms低电平
                {
                        err=500;
                        while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高电平过去
                        {
                                delay(1);
                                err--;
                        }
                        for(k=0;k<4;k++)                //共有4组数据
                        {                                
                                for(j=0;j<8;j++)        //接收一组数据
                                {

                                        err=60;               
                                        while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
                                        {
                                                delay(1);
                                                err--;
                                        }
                                        err=500;
                                        while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
                                        {
                                                delay(10);         //0.1ms
                                                Time++;
                                                err--;
                                                if(Time>30)
                                                {
                                                        return;
                                                }
                                        }
                                        IrValue[k]>>=1;         //k表示第几组数据
                                        if(Time>=8)                        //如果高电平出现大于565us,那么是1
                                        {
                                                IrValue[k]|=0x80;
                                        }
                                        Time=0;                //用完时间要重新赋值                                                        
                                }
                        }
                }
                if(IrValue[2]!=~IrValue[3])
                {
                        return;
                }
        }
         IrValue[4]=IrValue[2]>>4;                //高四位变低四位
  IrValue[5]=IrValue[2]&0X0F;        //取键值得低四位
  IrValue[7]=IrValue[4]*16+IrValue[5];//十六进制换算成十进制
  EX1=1;                        
}
void Time1init()
{
        
        
        
        EA=1;
        ET1=1;
         TMOD=0x10;
                 TH1=(65535-65)/256;
        TL1=(65535-65)%256;
                           TR1=1;
        }

        

void keys()
{
        if(IrValue[7]==7)
        {

          if (value>=5)
          value--;
          }
         
         if (IrValue[7]==21)
         {

         if (value<=25)
         value++;}
                                   }
         
         
         
void main()
{
        IrInit();
                k1=1;
                k2=1;
                Time1init();
                while(1)
                {
                  keys();
                  }}
void time1stop()interrupt 3        using 0
{
        
        timer1++;
        if (timer1<=value)
        PWM=1;
        else
        PWM=0;
        if (timer1==200)
        timer1=0;
        TH1=(65535-65)/256;
        TL1=(65535-65)%256;
        }
谢谢大家~
已退回3积分

回帖(1)

chenwei6991627

2019-3-1 15:18:10
一步一步查,看有没有进入中断
举报

更多回帖

发帖
×
20
完善资料,
赚取积分