dengxbin 发表于 2013-9-2 14:30 
我最近在做反射型开关管,发射管电流一般是10ma-60ma不等,电压一般是1.2V-1.4V。接受管集电极电阻一般是10 ...
亮的,现在发射的问题解决了,模拟NEC编码,38K载波用定时器产生占空比1:3,发送数据还算正常,就是红外接收头解码不正确,发送的时候解码的低电平或者发送端是高电平(高电平有载波发射,接收头就输出低)时间不对,发送数据协议:9MS高电平,4.5MS低电平为前导码,560us高560us低代表“0 ” , 560us高1.69ms低代表“1”,发送时的560us高电平不准,低电平(就是没载波发送)非常准,以下为程序,就是用示波器观察的时候,接收头的560us低电平,有的准,有的不准,所以就解不了码,:
/*******************模拟NEC编码,9ms高电平,4.5ms低电平作为前导码,8位地址码,8位地址反码,8位数据位,8位数据反码*/
#include<stc12c5a60s2.h>
#include<intrins.h>
sbit LED=P1^0 ;
bit flag;
void Delay1ms() //@12.000MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 12;
j = 168;
do
{
while (--j);
} while (--i);
}
void Delay900ms() //@12.000MHz
{
unsigned char i, j, k;
i = 42;
j = 10;
k = 168;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay200us() //@12.000MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 3;
j = 81;
do
{
while (--j);
} while (--i);
}
void Delay560us() //@12.000MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 7;
j = 133;
do
{
while (--j);
} while (--i);
}
void Delay450us() //@12.000MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 5;
j = 167;
do
{
while (--j);
} while (--i);
}
void init()
{
// TMOD=0x01;
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xED; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
EA=1; //打开全局中断
ET0=1; //打开定时器0
TR0=0; //先不启动
}
void send9ms()
{
TR0=1;
Delay1ms(); //7个1ms,示波器测得只有8.6ms.后面加400us=900ms
Delay1ms();
Delay1ms();
Delay1ms();
Delay1ms();
Delay1ms();
Delay1ms();
Delay200us();
//Delay200us();
//Delay560us();
//Delay1ms();
//Delay1ms();
TR0=0;
LED=0;
}
void send4_5ms()//发送4.5ms低电平(即无红外产生)
{
TR0=0;
Delay1ms();
Delay1ms();
Delay1ms();
Delay1ms();
Delay200us();
Delay200us();
Delay200us();
//Delay560us();
//TR0=1;
}
void send(unsigned char date)
{
char j;
unsigned char date1;
date1=date;
send9ms(); //9ms前导码高电平,对于发送端
send4_5ms(); //4.5ms前导码低电平,对于发送端
for(j=0;j<8;j++) //前8位地址码 全为0
{
TR0=1; //发送0
Delay450us(); //输出高电平调试输出时间为560us
//Delay40us();
TR0=0;
LED=0;
Delay560us();
}
for(j=0;j<8;j++) //前8位地址反码码 1
{
TR0=1; //发送1
Delay450us();//输出高电平调试输出时间为560us
TR0=0;
LED=0;
Delay560us();
Delay560us();
Delay560us();
}
for(j=0;j<8;j++) //8位数据 暂时以发送0x55做测试
{
if(date&0x01) //发送低位在前
{
TR0=1; //发送数据1
Delay450us();//输出高电平调试输出时间为560us
TR0=0;
LED=0;
Delay560us();
Delay560us();
Delay560us();
}
else
{
TR0=1; //发送数据0
Delay450us();//输出高电平调试输出时间为560us
TR0=0;
LED=0;
Delay560us();
}
date>>=1;
}
for(j=0;j<8;j++)//发送8位数据反码
{
if(date1&0x01)
{
TR0=1; //发送反码
Delay450us();//输出高电平调试输出时间为560us
TR0=0;
LED=0;
Delay560us();
}
else
{
TR0=1;
Delay450us();//输出高电平调试输出时间为560us
TR0=0;
LED=0;
Delay560us();
Delay560us();
Delay560us();
}
date1>>=1;
}
send4_5ms();
}
void main()
{
init();
LED=1;
while(1)
{
send(0x55);
Delay900ms(); //间隔900ms发送一次
}
}
void timer0() interrupt 1 //定时器产生占空比为1:3的38k的载波
{
if(flag==0)
{
LED=0;
//TMOD &= 0xF0; //设置定时器模式
TL0 = 0xED; //设置定时初值 20us
TH0 = 0xFF; //设置定时初值
//TF0 = 0; //清除TF0标志
flag=1;
}
else
{
LED=1; //6us高电平,由示波器所测得赋值5刚好合适
TH0=(65536-5)/256;
TL0=(65536-5)%256;
flag=0;
}
}
|