现在把晶振改为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;//否则熄灭
}
}
怎么也找不到错误,还是有请大家帮帮忙吧~~
|