初级会员

- 积分
- 148
- 金钱
- 148
- 注册时间
- 2014-11-9
- 在线时间
- 13 小时
|
5金钱
我想用51做一个红外发射器,发送信号给MIni stm32处理。现在遇到一点问题,想请教大家。
控制端:PNP+红外LED(低电平发送脉冲)51的引脚低=》红外LED脉冲=》Mini板接收端低
协议:引导码(9ms低+4.5ms高)+地址码(0x00)+地址反码(0xff)+控制码(0x98,模拟原有遥控器“2”的键值152)+控制反码(0x67)
问题:51发射的波形能满足要求,用示波器观察接收端也有脉冲变化,但是不能读出信号,想知道哪里还需要改正呢?
以下是51程序:
#include<STC12C5A60S2.H> //头文件
#define uchar unsigned char
#define uint unsigned int
sbit IR_OUT=P3^1;
void delay_ms(uint ms)
{
uint i,j;
for(i=0;i<120;i++)
{
for(j=0;j<ms;j++);
}
}
//T1 13us产生一次中断 用于产生38K载波
//T0 方式1 16位 用于定时
void Init_Timer(void)
{
TMOD=0x21; //T0 mode 1 T1 mode 2
TH1=256-(1000*12/38.0/12)/2+0.5;
//特殊
TL1=TH1;
ET1=1;
EA=1;
} //发送引导码 发送方:9ms高电平 4.5ms低电平
void Send_Start_Bit(void) //TR1的值=发送的电平
{
//9ms 1
TH0=(65536-17600)/256;
TL0=(65536-17600)%256;
TR0=1;
TR1=0;
while(!TF0);
TR1=0;
TF0=0;
TR0=0;
IR_OUT=1;
//4.5ms 0
TH0=(65536-9200)/256;
TL0=(65536-9200)%256;
TR0=1;
TR1=1;
while(!TF0);
TR1=0;
TF0=0;
TR0=0;
IR_OUT=1;
}
//发送0
void Send_Bit_0(void)
{
//0.565ms 1
TH0=(65536-968)/256;
TL0=(65536-968)%256;
TR0=1;
TR1=0;
while(!TF0);
TR1=0;
TF0=0;
TR0=0;
IR_OUT=1;
//0.565ms 0
TH0=(65536-968)/256;
TL0=(65536-968)%256;
TR0=1;
TR1=1;
while(!TF0);
TR1=0;
TF0=0;
TR0=0;
IR_OUT=1;
}
//发送1
void Send_Bit_1(void)
{
//0.565ms 1
TH0=(65536-968)/256;
TL0=(65536-968)%256;
TR0=1;
TR1=0;
while(!TF0);
TR1=0;
TF0=0;
TR0=0;
IR_OUT=1;
//1.685ms 0
TH0=(65536-2904)/256;
TL0=(65536-2904)%256;
TR0=1;
TR1=1;
while(!TF0);
TR1=0;
TF0=0;
TR0=0;
IR_OUT=1;
}
void Send_over(void)//发送一个结束码,因为最后一个位只有遇到下降沿才能读取(发射端的上升沿)
{ //0.500ms 1
//小于0.5ms 接收端很难识别到
TH0=(65536-800)/256;
TL0=(65536-800)%256;
TR0=1;
TR1=0;
while(!TF0);
TR1=0;
TF0=0;
TR0=0;
IR_OUT=1;
//0.500ms 0
TH0=(65536-800)/256;
TL0=(65536-800)%256;
TR0=1;
TR1=1;
while(!TF0);
TR1=0;
TF0=0;
TR0=0;
IR_OUT=1;
}
//发送一字节 8位
void Send_Char()
{
unsigned char i,j1,j2,j3,j4;
j1=0x00;
j2=0xff;
j3=0x98;
j4=0x67;
Send_Bit_0();//给9ms产生一个下降沿
Send_Start_Bit();
//Send_Bit_0();//发射引导吗
for(i=0;i<8;i++)
{
if(j1&0x01)
Send_Bit_1();
else
Send_Bit_0();
j1>>=1;//先发射低位
}
for(i=0;i<8;i++)
{
if(j2&0x01)
Send_Bit_1();
else
Send_Bit_0();
j2>>=1;//先发射低位
}
for(i=0;i<8;i++)
{
if(j3&0x01)
Send_Bit_1();
else
Send_Bit_0();
j3>>=1;//先发射低位
}
for(i=0;i<8;i++)
{
if(j4&0x01)
Send_Bit_1();
else
Send_Bit_0();
j4>>=1;//先发射低位
}
Send_over(); //结束符,给最后一位产生一个下降沿
}
void T1_ISR(void) interrupt 3
{
IR_OUT=!IR_OUT;
}
void main(void)
{
Init_Timer();
while(1)
{
Send_Char();
delay_ms(500);
}
}
仿真波形:
stm32的程序是V3.5库函数的红外遥控器程序 |
|