csq74123 发表于 2012-7-22 11:23:01

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

此程序要一直发射,而且要离接收端很近很近才能断断续续的接受到一些乱码点亮LED灯。用相机观测红外发射头有紫色的光。
要求是要自己软件编程产生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;//用来存放数据的每一位,,
uchar date={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%2==1){ launch_date=1;}
   else{ launch_date=0;}
   date=date>>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==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();//发送,,
}
}

lxa0 发表于 2012-7-22 12:24:48

发射常规的红外信号
一般要有两部分
1.产生38KHz的载波
2.要有调制信号

csq74123 发表于 2012-7-22 14:10:14

if(launch_start)
{if(duc==2){op=~op;duc=0;}// 产生占空比1:3。,,的38KHZ方波,,
我这一部分是用来产生载波的
if(launch_date==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
    }
这一部分就是产生调制的信号

longwu911 发表于 2012-7-22 21:28:39

不知道你用的是STC的哪哪种单片机,我用的是STC15D204EA。你可以用定时器的可编程时钟输出38KHZ的方波,然后采取延时或者是计数的方法实现对红外线的调制

csq74123 发表于 2012-7-23 09:39:21

我用的是stc89c54rd+         我上面的程序就是用定时器产生38KHZ的方波在进行调制的
页: [1]
查看完整版本: 自己做的一个红外发射的程序,求请教