当前位置: 代码迷 >> 单片机 >> 单片机来帮小弟我看个程序
  详细解决方案

单片机来帮小弟我看个程序

热度:333   发布时间:2016-04-28 16:34:59.0
单片机高手进来帮我看个程序
#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.有些任务具有互斥性,不能并行执行,否则可能堆栈溢出,死机。

一点浅见:接收的时候关闭串口,开串口的时候关闭接收。
再有:养成良好的变成习惯,流程图要做。

关闭发送,
停止刷新显示,
准白接收,
如果有合法数据 -》 关闭接收,刷新显示。-》启动发送-》准备下次接收。
如果数据非法,关闭接收,刷新显示,-》准备下次接收。
  相关解决方案