大哥大姐们进来帮调试下小弟的红外遥控系统,小弟新手

2019-07-16 06:20发布

                   谢谢你们!小弟想做一个红外遥控系统,就是用单片机编码发射红外数据,用另一个单片机接收并解码。这边按下 key2,key3,key4,那边相应的灯1,灯2,灯3点亮。下面是小弟的程序,新手写的不好,调了几天没有现象,请哥哥姐姐们帮忙调试下。由于红外不能仿真,我用导线代替了发送和接收。 用导线代替了发送和接收   下边是程序         
//*****************************红外发射***************************************************
#include<reg51.h>
#define  uint unsigned int
#define  uchar unsigned char
sbit ir=P1^4;
sbit k1=P2^1;
sbit k2=P2^2;
sbit k3=P2^3;
sbit k4=P2^4;
sbit k5=P2^5; //备用
uint count,set_count;
bit irflag,keyflag,irsendok;
uchar irdata,ircode;
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
  for(j=110;j>0;j--);
}
void init()
{
EA=1;
TMOD=0x02;     //定时0 8位自动重装模式
ET0=1;
TH0=0xe6;   //定时13us,38K红外矩形波,晶振24M
TL0=0xe6;
count=0;
irflag=0;
ir=0;   
}
void keyscan()
{
if(k1==0)
{
  delay(10);
  if(k1==0)
  {
   keyflag=1;
    irdata=0x01;
   }
}
if(k2==0)
{
  delay(10);
  if(k2==0)
  {
   keyflag=1;
    irdata=0x02;
   }
}
if(k3==0)
{
  delay(10);
  if(k3==0)
  {
   keyflag=1;
    irdata=0x03;
   }
}
if(k4==0)
{
  delay(10);
  if(k4==0)
  {
   keyflag=1;
    irdata=0x04;
   }
}
if(k5==0)
{
  delay(10);
  if(k5==0)
  {
   keyflag=1;
    irdata=0x05;
   }
}
}
void sendbyte()
{
uchar n;
for(n=8;n>0;n--)
{
    set_count=43; //发送编码中的0.56ms高电平
    irflag=1;      //启动红外发射二极管发射
    count=0;     //中断计数先清0
    TR0=1;      //开启定时器0
    while(count<set_count); //等待发送完
    TR0=0; //关闭定时器0
    if(ircode&0x01) set_count=130; //判断红外编码最低位,若为1则1.69ms的低电平
    else set_count=43;    //为0则0.565ms的低电平
    irflag=0; //低电平则不发射
    count=0; //中断计数清0
    TR0=1; //开启定时器0
    while(count<set_count); //等待发送完
    TR0=0; //关闭定时器0
    ircode=ircode>>1; //将数据右移,即从低位到高位发送
}
}
void senddata()
{
set_count=346; //发送编码中的引导码(4.5ms高电平)
irflag=1;    //启动红外发射二极管发射
count=0;    //中断计数清0
TR0=1;
while(count<set_count);
TR0=0;
set_count=346; //发送编码中的4.5ms低电平
irflag=0; //低电平则不发射
count=0;
TR0=1;
while(count<set_count); //等待发送完
TR0=0;   
ircode=irdata;   //发送8位数据码
sendbyte();
ircode=~irdata; //发送8位数据反码
sendbyte();
irsendok=1;
}
void main()
{
init();
while(1)
{
  keyscan();   //键值扫描
     if(keyflag)   //若有按键按下
     {  
      senddata();   //发送红外编码
      if(irsendok==1)
      {
    keyflag=0;   //按键标志清零
    irsendok=0;
   }
     }
}
}
void timer0() interrupt 1 //定时器0中断
{
count++;
if(irflag==1) ir=~ir; //有发射标志,则发射38khz的矩形波
    else ir=0;     //否则不发射,即相当于发射编码中的低电平
}




//******************************红外接收***********************************************
#include<reg52.h>
//#define uint unsigned int
#define uchar unsigned char
sbit led1=P2^1;
sbit led2=P2^2;
sbit led3=P2^3;
uchar irtime,startflag,irrecieveok;
uchar bitnum;
uchar irworkok;
uchar irdata[17];
uchar ircode[2];
void display();
void irwork();
/*void delay50us(uint t)
{
uchar j;
for(;t>0;t--)
  for(j=19;j>0;j--);
} */
void init()
{
TMOD=0x02;
TH0=0x00;
TL0=0x00;
ET0=1;
IT0=1;
EX0=1;
EA=1;
TR0=1;
}
void main()
{
init();
while(1)
{
  if(irrecieveok==1)
  {
   irwork();
   if(irworkok==1)
   display();
  }
}
}
void timer0() interrupt 1
{
irtime++;
}
void int0()  interrupt 0
{
if(startflag)
{
  if(irtime>32)
  {
   bitnum=0;
   irdata[bitnum]=irtime;
   irtime=0;
   bitnum++;
   if(bitnum==17)
   {
    bitnum=0;
    irrecieveok=1;
   }
  }
  
   
}
else
{
  startflag=1;
  irtime=0;
}
}
void irwork()
{
char k,j,i,value;
k=1;
for(j=0;j<4;j++)
{
  for(i=0;i<8;i++)
  {
   value=value>>1;
   if(irdata[k]>6)
   {
    value=value|0x80;
   
   }
    k++;
  }
  ircode[j]=value;
}
  irworkok=1;

}
void display()
{
if(ircode[0]==~ircode[1])
{
  //uchar m;
   switch(ircode[1])
  {
    case 0x80:
   led1=1;
   led2=1;
   led3=1;
   break;
   case 0x40:
   led1=0;
   led2=1;
   led3=1;
   break;
   case 0xC0:
   led2=0;
   led1=1;
   led3=1;
   break;
   case 0x20:
   led3=0;
   led1=1;
   led2=1;
   break;

   //case 0xA0:  备用

  }
}
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。