#include <reg52.h>
#define uchar unsigned char
uchar code tabledu[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0xFF,0x39,0xBF,0x79,0x71};
uchar code tablewe[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
uchar irtime;
uchar disp[8];
uchar irdata[33];
uchar ircode[4];
uchar start_flag;
uchar bitnum;
uchar irrecvok;
uchar irprosok;
uchar flag; //接收与发送标志
void time01init();
void int1init();
void chuankouinit();
void irpros();
void irwork();
void display();
void delay();
void jieshou();
void fasong();
void main()
{
time01init();
int1init();
chuankouinit();
while(1)
{
jieshou();
display();
fasong();
}
}
void time01init()
{
TMOD=0x22;
TH1=0xFD;
TL1=0xFD;
TH0=0;
TL0=0;
TR1=1;
TR0=1;
ET1=1;
ET0=1;
EA=1;
}
void int1init()
{
IT1=1;
EX1=1;
EA=1;
}
void chuankouinit()
{
SM0=0;
SM1=1;
REN=1;
ES=1;
EA=1;
}
void time0() interrupt 1
{
irtime++;
}
void int1() interrupt 2
{
if(start_flag)
{
if(irtime>32)
{
irdata[0]=irtime;
irtime=0;
bitnum=1;
}
else
{
irdata[bitnum]=irtime;
irtime=0;
bitnum++;
if(bitnum==33)
{
bitnum=0;
start_flag=0;
irrecvok=1;
}
}
}
else
{
irtime=0;
start_flag=1;
}
}
void irpros()
{
uchar i,j,k;
uchar value;
k=1;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
value>>=1;
if(irdata[k]>6)
{
value|=0x80;
}
k++;
}
ircode[j]=value;
}
irprosok=1;
}
void irwork()
{
disp[0]=ircode[0]/16;
disp[1]=ircode[0]%16;
disp[2]=ircode[1]/16;
disp[3]=ircode[1]%16;
disp[4]=ircode[2]/16;
disp[5]=ircode[2]%16;
disp[6]=ircode[3]/16;
disp[7]=ircode[3]%16;
}
void delay()
{
uchar a=50;
while(a--);
}
void display()
{
uchar i;
for(i=0;i<8;i++)
{
P1=tablewe[i];
P2=tabledu[disp[i]];
delay();
P2=0x00;
}
}
void jieshou()
{
if(irrecvok)
{
irrecvok=0;
irpros();
flag=1;
}
if(irprosok)
{
irprosok=0;
irwork();
}
}
void fasong()
{
if(flag)
{
flag=0;
SBUF=ircode[0];
while(!TI);
TI=0;
SBUF=ircode[1];
while(!TI);
TI=0;
SBUF=ircode[2];
while(!TI);
TI=0;
SBUF=ircode[3];
while(!TI);
TI=0;
}
}
这是一个红外接收程序,再用串口把编码传输回电脑,运行后单片机数码管不显示,也不能接收编码,求达人指点
------解决方案--------------------
1.任务应该有返回值:成功与失败。
2.任务应该有执行条件,满足条件才能执行。
3.有些任务具有互斥性,不能并行执行,否则可能堆栈溢出,死机。
一点浅见:接收的时候关闭串口,开串口的时候关闭接收。
再有:养成良好的变成习惯,流程图要做。
关闭发送,
停止刷新显示,
准白接收,
如果有合法数据 -》 关闭接收,刷新显示。-》启动发送-》准备下次接收。
如果数据非法,关闭接收,刷新显示,-》准备下次接收。