|
此程序要一直发射,而且要离接收端很近很近才能断断续续的接受到一些乱码点亮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[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();//发送,,
}
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|