自己做的一个红外发射的程序,求请教

2020-02-05 08:44发布

此程序要一直发射,而且要离接收端很近很近才能断断续续的接受到一些乱码点亮LED灯。用相机观测红外发射头有紫 {MOD}的光。
要求是要自己软件编程产生38KHZ的方波
求大神指导




#include<reg52.h>
#define uchar unsigned char
bit launch_start=1;
bit launch_flag1,launch_flag2,launch_flag21,launch_flag22;
unsigned int launch_count,launch_endcount;
bit op;
sbit k=P1^3;//用来显示单片机是否工作,,,
sbit launch_in=P3^3;//接红外的输入口,,
uchar launch_date[32];//用来存放数据的每一位,,
uchar date[4]={0x38,0x38,0x18,0xe7};//要发送的两个客户吗和数据码及其反码,,,
uchar duc;
uchar h;


void time1_set()
{ TMOD |=0x10;//工作模式1下的,计时13US,中断一次,,,
  TH1=(65536-13)/256;
  TL1=(65536-13)%256;
  EA=1;
  ET1=1;
  TR1=0;
}


void time1() interrupt 3
{ TH1=(65536-13)/256;
  TL1=(65536-13)%256;
  launch_count++;
  if(launch_start)
  {if(duc==2){op=~op;duc=0;}  // 产生占空比1:3。,,的38KHZ方波,,
   else{ op=0; duc++;}
  }
  else{ op=0;}
  launch_in=op;
}


void datelaunch()//将上面要发送的4个数据处理成32位,,,
{ uchar i,x;
  for(x=0;x<4;x++)
  { for(i=0;i<8;i++)
   { if(date[x]%2==1){ launch_date[h]=1;}
     else{ launch_date[h]=0;}
     date[x]=date[x]>>1;
     h++;
   }
  }
  h=0;
}

void launch()
{ static uchar j=0;
  TR1=1;
  if(launch_count>=692){ launch_flag1=1; launch_count=0;launch_start=0; }//引导码的9ms,
  if(launch_flag1==1){ if(launch_count>=346){ launch_count=0; launch_flag2=1; launch_flag1=0;launch_start=1;}}//引导码的4.5ms,,
  if(launch_flag2==1)
  { if(launch_date[j]==1)//发送数据1,,
    { if(launch_count>=43){launch_count=0;launch_start=0;launch_flag21=1;}//0.56ms
      if(launch_flag21==1){ if(launch_count>=129){ launch_flag21=0; launch_count=0; launch_start=1;j++;}}//1.68ms
    }
    else//发送数据0,,
    { if(launch_count>=43){ launch_count=0;launch_start=0;launch_flag22=1;}//0.56ms
      if(launch_flag22==1){ if(launch_count>=43){ launch_flag22=0; launch_count=0; launch_start=1;j++;}}//0.56ms
    }
  }
  if(j>32){ launch_flag2=0,TR1=0;j=0;}
}


void main()
{ time1_set();//定时器1初始化,,
  datelaunch();//4位要发送的数据处理成32个位数据,,,
  k=0;//led灯显示正常工作,,
  while(1)
  { launch();//发送,,
  }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。