| 现在把晶振改为24MHZ,单片机为STC89C52RC,发射部分和接收部分都是用单片机做; 发射部分:
 #include<reg52.h>
 sbit TR_DATA=P3^5;//定义发射端口
 sbit key=P2^3;
 void delay_ms(unsigned int z)
 {
 unsigned int x,y;
 for(x=z;x>0;x--)
 for(y=218;y>0;y--);
 }
 void TransData(unsigned char _data)//发送数据(_data为要发送的8为数据)
 {
 unsigned char i;
 TR0=1;//启动38KHZ脉冲
 delay_ms(9);
 TR0=0;//关闭脉冲
 TR_DATA=0;//红外发射管输出0
 delay_ms(5);//5毫秒低电平
 for(i=0;i<8;i++)
 {
 //下面为要发送的数据“1”,1毫秒38KMZ,和1毫秒低电平
 TR0=1;//启动38KMHZ
 delay_ms(1);//一毫秒
 TR0=0;//关闭
 TR_DATA=0;//红外管输出0
 if(_data&(1<<i))delay_ms(1);//关键点!
 //_data是准备要发送的8位数据,1“与”的位置就是要发送的数据
 else delay_ms(3);//否则发送0,即低电平发送3毫秒
 }
 //以下为结束时序
 TR0=1;//先发送5毫秒38K
 delay_ms(5);
 TR0=0;//关闭
 TR_DATA=0;//发射管输出0
 }
 void main()
 {
 unsigned char key;
 TMOD=0x02;//定时器工作方式为2
 TH0=0xe6;
 TL0=0xe6;
 EA=1;
 ET0=1;
 key=1;
 while(1)
 {
 TR_DATA=0;
 if(key==0)
 {
 delay_ms(3);
 if(key==0)
 {
 TransData(1);//把“1”转化为0000 0001发送过去
 while(!key);
 }
 }
 }
 }
 void T0_interrupt() interrupt 1//定时器0产生38K方波        (中断部分由质疑,因为改为12MHZ)
 {
 TR_DATA=~TR_DATA;//不断取反
 TR0=1;
 }
 接收部分:
 #include<reg52.h>
 sbit RE_DATA=P2^6;
 sbit LED=P2^7;//红外测试LED
 unsigned char  Recived_Data = 0;//接收脚
 void delay_ms(unsigned int  n)//0.5毫秒
 {
 unsigned int i=106;
 for(;n>0;n--)
 {
 while(i--);
 i=106;
 }
 }
 void CheckRE(void)
 {
 unsigned char i;
 Recived_Data = 0;
 delay_ms(3);          //延迟1.5ms
 if(RE_DATA==1)return; //没有出现足够的9ms低电平出错
 delay_ms(14);                  //延迟7 ms,再加上前面的1.5ms达到延迟8.5ms
 if(RE_DATA==1)return;  //高电平,没达到9ms的低电平时间,出错
 
 while(!RE_DATA);      //等待出现5ms高电平的开始信号,即等待RE_DATA=1
 delay_ms(3);          //延迟1.5ms
 if(RE_DATA==0)return; //没到5 ms就出现低电平,出错返回
 delay_ms(6);          //延迟3 ms,加上前面的1.5ms达到延迟4.5ms
 if(RE_DATA==0)return; //低电平没达到5ms出错
 
 while(RE_DATA);                  //等待出现低电平,即等待数据发送
 for(i=0;i<8;i++)
 {
 while(!RE_DATA);    //等待出现低电平,即等待1ms的38KHz脉冲
 delay_ms(3);      //延迟1.5ms(加上其他指令接近2ms即接收信号0所经历的时间)
 //由于发送的时候硬件把电平反相了,所以解码的时候也要反相处理相处理
 if(RE_DATA==0)    //RE_DATA==0即下一位数据信号已来到,接收到的信号是接收信号"0"该位就是则红外发射发射的发射信号"1"
 {
 Recived_Data|=(1<<i); /*注意!!是或等于,把接收回来的数据再反相处理,反反得正,变为按键值*/
 }
 else        //1.5ms后仍是高电平即下一信号还没有来即接收信号是1,就是发射信号0
 {
 while(RE_DATA);//等待出现低电平即等待数据0发送完毕
 }
 }
 while(!RE_DATA);
 }
 //主函数
 void main()
 {
 unsigned int n=0;
 RE_DATA=1;
 while(1)
 {
 
 while(RE_DATA);//等待出现低电平---由于发送时经过反相所以等待的是低电平
 CheckRE();         //解码
 if(Recived_Data==1)//反相为1111 1110
 LED=0;//led发亮
 else LED=1;//否则熄灭
 }
 
 
 }
 怎么也找不到错误,还是有请大家帮帮忙吧~~
 |