|
我接收发送的原理是:用T0记录高低电平的宽度,保存至一个数组当中,然后原封不动把它调制在用T1做定时产生的38kHZ信号上,问题是为什么 发送出去的红外编码不正确 望大虾指点:多谢程序如下:
#include<stc89c58.h>
#define unchar unsigned char
#define unint unsigned int
sbit LED=P4^1;
sbit Ir_in=P1^6; //红外接收口
sbit Ir_out=P1^7; // 红外发送头
bit flag=0; //红外接收完毕标志位
bit flag1=0; //允许红外发送标志
unchar IR[150]; //用来保存脉冲宽度
void IrDA_decode();
void IrDA_send();
/*************************************/
/*延时函数*/
/*************************************/
void delay(unsigned int T)
{
unsigned char i;
while(T--) {
for(i=0;i<120;i++);
}
}
/*************************************/
/*倒序函数*/
/*************************************/
unsigned char rearrange(unsigned char a)
{
unsigned char i,b;
b=a&0x01;
for(i=1; i<8; i++)
{
b=b<<1;
a=a>>1;
b=b+(a&0x01);
}
return(b);
}
/*************************************/
/*串口初始化*/
/*************************************/
void serial_init()
{
TMOD=0x21;
EA=1;
ET1=1;
//TL1=0xfd;TH1=0xfd;
//SCON=0xd8;PCON=0x00;
//TR1=1; //串口初始化,波特率9600
TH1=0xf4;TL1=0xf4; //定时产生38kHZ载波信号
}
/*************************************/
/*数据发送,查询方式*/
/*************************************/
void Uart_Transmit1(unsigned char i) {
SBUF=i;
while(TI==0);
TI=0; /*清标志*/
}
/*************************************/
/*数据接收,查询方式*/
/*************************************/
unsigned char Uart_Receive( void ) {
unsigned char j;
while (RI==0); /* 等待接收数据*/
RI=0;
j=SBUF;
return j;
}
/*************************************/
/*定时器1中断函数*/
/*************************************/
void timer1() interrupt 3 using 2
{
Ir_out=~Ir_out;
}
/*************************************/
/*主函数*/
/*************************************/
main()
{
serial_init(); //初始化串口和定时器,T0方式1计数,T1产生9600的波特率
while(1) {IrDA_decode();}
}
/*************************************/
/*解码函数*/
/*************************************/
void IrDA_decode()
{ unchar i=0;
while (Ir_in==1) ;
loop:
TH0=0x00;TL0=0x00;TR0=1; //启动定时器0开始计时低电平宽度
while(Ir_in==0);
TR0=0; //关闭定时器
IR=TH0;
i++;
IR=TL0;
i++; //记录低电平宽度
TH0=0;TL0=0;TR0=1; //启动定时器0开始计时高电平宽度
while(Ir_in==1) ;
if(TF0==1) {TR0=0; flag=1;goto send; } //计时溢出表明数据接受完毕 ,关闭计时器置位标志
TR0=0; //关闭定时器
IR=TH0;
i++;
IR=TL0;
i++; //记录高电平宽度
goto loop; //循环捕捉高低电平
send:
while(1){
IrDA_send();
} //红外发送
//Uart_Transmit1(IR[134]) ;
//Uart_Transmit1(IR[135]) ;
}
/*************************************/
/*红外发送*/
/*************************************/
void IrDA_send()
{
unsigned char i=0;
LED=~LED;
delay(500);
LED=~LED;
delay(500);
while(i<144){
TH0=~IR;
i++;
TL0=~IR;
i++;
TR1=1;TR0=1;
while(TF0==0); //发送“1”
TR1=0;TR0=0;
TH0=~IR;
i++;
TL0=~IR;
i++;
TR0=1;
while(TF0==0); //发送“0”
TR0=0;
}
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|