|
RT/* 紅外顯示:將讀取到的紅外信號(hào)通過串口在計(jì)算機(jī)上顯示*/
最終結(jié)果是用串口助手發(fā)到單片機(jī)并返回的值與發(fā)送的值不一樣,也無法把紅外信號(hào)發(fā)回到計(jì)算機(jī)的串口,初學(xué)51請(qǐng)給位幫忙看看是哪里的問題?
#include<reg51.h>
sbit IRIN=P3^2;
void usartconfig();
void IrInConfig();
void Delay(unsigned char x);
unsigned char Irvalue[6];
unsigned char Time;
void main()
{
IrInConfig();
usartconfig();
SBUF=Irvalue[6];
while(1);
}
void usartconfig()
{
SCON=0x50;
TMOD=0x20;
PCON=0x80;
TH1=0xFF;
TL1=0xF3;
ES=1;
EA=1;
TR1=1;
}
void IrInConfig()
{
IT1=1;
PX0=1;
EX0=1;
EA=1;
IRIN=1;
}
void Delay(unsigned char x)
{
unsigned char i;
while(x--){
for(i=0;i<13;i++)
;
}
}
void IrRead() interrupt 0
{
unsigned char j,k;
unsigned int err;
Time=0;
Delay(70);
if(IRIN==0) //確認(rèn)是否真的接收到正確的信號(hào)
{
err=1000; //1000*10us=10ms,超過說明接收到錯(cuò)誤的信號(hào)
/*當(dāng)兩個(gè)條件都為真是循環(huán),如果有一個(gè)條件為假的時(shí)候跳出循環(huán),免得程序出錯(cuò)的時(shí)
侯,程序死在這里*/
while((IRIN==0)&&(err>0)) //等待前面9ms的低電平過去
{
Delay(1);
err--;
}
if(IRIN==1) //如果正確等到9ms低電平
{
err=500;
while((IRIN==1)&&(err>0)) //等待4.5ms的起始高電平過去
{
Delay(1);
err--;
}
for(k=0;k<4;k++) //共有4組數(shù)據(jù)
{
for(j=0;j<8;j++) //接收一組數(shù)據(jù)
{
err=60;
while((IRIN==0)&&(err>0))//等待信號(hào)前面的560us低電平過去
// while (!IRIN)
{
Delay(1);
err--;
}
err=500;
while((IRIN==1)&&(err>0)) //計(jì)算高電平的時(shí)間長(zhǎng)度。
{
Delay(1);//0.14ms
Time++;
err--;
if(Time>30)
{
EX0=1;
return;
}
}
Irvalue[k]>>=1; //k表示第幾組數(shù)據(jù)
if(Time>=8) //如果高電平出現(xiàn)大于565us,那么是1
{
Irvalue[k]|=0x80;
}
Time=0; //用完時(shí)間要重新賦值
}
}
}
if(Irvalue[2]!=~Irvalue[3])
{
return;
}
}
}
void Usart() interrupt 4
{
unsigned char a[6];
if(RI){
a[6]=SBUF;
RI=0;
SBUF=a[6];
while(!TI);
TI=0;
}
}
|
|