2118|0

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

恳求高手帮忙看一下问题出在哪儿,谢谢 [复制链接]

发射和接收,程序如下:一号按键控制灯开,二号按键控制灯灭,三号按键控制亮度增加,四号按键控制亮度减小,仿真结果是不能接收,希望高手给指点一下,谢谢
//********************************************单片机红外发射*******************************************
#include
sbit ir=P2^0;//红外发射管控制脚,使用24M晶振
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
unsigned int count, set_count; //中断计数,设定中断次数
bit irflag,keyflag; //红外发送标志位,按键标志位
unsigned char irsys[]={0x00,0xff};//16位用户码
unsigned char irdata,ircode; //发送的红外数据
//---------------------------------------------------------------------------
void delay(unsigned int a)//延时约1ms,晶振24M ,此处延时不需很精确
{
unsigned char i;
while(--a!=0)
for(i=300;i>0;i--); //若是12M晶振i=125
}
//---------------------------------------------------------------------------
void keyscan() // 按键扫描
{
if(k1==0)
{
delay(10);
if(k1==0)
{
keyflag=1;
while(!k1);
irdata=0x01;

}
} //k1键按下,则发射数据0x01
if(k2==0)
{
  delay(10);
  if(k2==0)
  {
  keyflag=1;
  while(!k2);
  irdata=0x02;

  }
} //k2键按下,则发射数据0x02
if(k3==0)
{
  delay(10);
  if(k3==0)
  {
  keyflag=1;
  while(!k3);
  irdata=0x03;

  }
}//k3键按下,则发数据0x03
if(k4==0)
{
delay(10);
if(k4==0)
{
keyflag=1;
while(!k4);
irdata=0x04;
}
}//k4键按下,则发数据0x04
}
//---------------------------------------------------------------------------
void ir_sendbyte() //红外发送一个字节数据
{
unsigned char i;
for(i=0;i<8;i++) //发送8位数据
{
set_count=43;//35; //发送编码中的0.56ms高电平 (//后为12M晶振下的数值)
irflag=1; //启动红外发射二极管发射
count=0; //中断计数先清0
TR0=1; //开启定时器0
while(count TR0=0; //关闭定时器0
if(ircode&0x01) set_count=130;//130; //判断红外编码最低位,若为1则1.69ms的低电平 (//后为12M晶振下的数值)
else set_count=43;//35; //为0则0.565ms的低电平 (//后为12M晶振下的数值)
irflag=0; //低电平则不发射
count=0; //中断计数清0
TR0=1; //开启定时器0
while(count TR0=0; //关闭定时器0
ircode=ircode>>1; //将数据右移,即从低位到高位发送
}
}
//---------------------------------------------------------------------------
void ir_send() //发送红外数据
{
set_count=346;//672; //发送编码中的引导码(4.5ms高电平+4.5ms低电平) (//后为12M晶振下的数值)
irflag=1; //启动红外发射二极管发射
count=0; //中断计数清0
TR0=1;
while(count TR0=0;
set_count=346;//336; //发送编码中的4.5ms低电平(//后为12M晶振下的数值)
irflag=0; //低电平则不发射
count=0;
TR0=1;
while(count TR0=0;
ircode=irsys[0]; //发送16位用户码的前1-8位
ir_sendbyte();
ircode=irsys[1]; //发送16位用户码的前9-16位
ir_sendbyte();
ircode=irdata; //发送8位数据码
ir_sendbyte();
ircode=~irdata; //发送8位数据反码
ir_sendbyte();
set_count=43;//35; //发送编码中的0.56ms高电平 (//后为12M晶振下的数值)
irflag=1;
count=0;
TR0=1;
while(count TR0=0;
irflag=0;
delay(23); //延时23ms(编码中的23ms低电平)
set_count=346;//670; //发送编码中的引导码(4.5ms高电平+4.5ms低电平) (//后为12M晶振下的数值)
irflag=1;
count=0;
TR0=1;
while(count TR0=0;
set_count=346;//336; //发送编码中的4.5ms低电平(//后为12M晶振下的数值)
irflag=0;
count=0;
TR0=1;
while(count TR0=0;
set_count=43;//35; //发送编码中的0.56ms高电平 (//后为12M晶振下的数值)
irflag=1;
count=0;
TR0=1;
while(count TR0=0;
irflag=0;
delay(23);
}
//---------------------------------------------------------------------------
void timer0_init() //定时器初始化
{
EA=1;
TMOD=0x02; //定时0 8位自动重装模式
ET0=1;
TH0=0xe6;//0xf3; //定时13us,38K红外矩形波,晶振24M (//后为12M晶振下的数值)
TL0=0xe6;
}
//---------------------------------------------------------------------------
void main()
{
timer0_init(); //定时0初始化
count=0; //中断计数先清0
ir=0;
irflag=0;
while(1)
{
keyscan(); //键值扫描
if(keyflag) //若有按键按下
{
delay(10);
ir_send(); //发送红外编码
delay(500);
keyflag=0; //按键标志清零
delay(100);
}
}
}
//---------------------------------------------------------------------------
void timer0() interrupt 1 //定时器0中断
{
count++;
if(irflag==1) ir=~ir; //有发射标志,则发射38khz的矩形波
else ir=0; //否则不发射,即相当于发射编码中的低电平
}




//***********红外接收**********
#include
#define uchar unsigned char
#define uint unsigned int
sbit P2_0=P2^0;
sbit P2_1=P2^1;
uchar irtime;
uchar startflag;
uchar irdata[33];
uchar bitnum;
uchar irreceok;
uchar ircode[4];
uchar irprosok,flag;
uchar zkb,i;


void delay(uint z)
{
   uint i,j;
   for(i=z;i>0;i--)
     for(j=120;j>0;j--);

}

void time0init()
{
   TMOD=0x02;
   TH0=0x00;
   TL0=0x00;
   ET0=1;
   EA=1;
   TR0=1;

}


void time1init()
{
TMOD=0x01;
TH1=(65536-10)/256;
TL1=(65536-10)%256;
EA=1;
ET1=1;
TR1=1;
}


void int0init()
{
   IT0=1;
   EX0=1;
   EA=1;

}

void irpros()
{
   uchar k,i,j;
   uchar 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++;
         if(k==33)
         {
            k=1;

          }
       }
       ircode[j]=value;



   }
       irprosok=1;

}


void display()
{
     switch(ircode[2])

         {
            case 0x05:
            P2_1=1;
            break;


            case 0x02:
            P2_1=0;
            break;

            case 0x03:
              if(zkb<9)
              {
                zkb++;
               }
            break;

            case 0x04:
              if(zkb>0)
              {
               zkb--;
              }
            break;

          }
}


void main()
{
       time0init();
       time1init();
       int0init();
       zkb=2;
       while(1)
      {
             if(irreceok)
             {
                 irpros();
                 irreceok=0;
                 if(irprosok)
                 {
  
                    if(ircode[2]=~ircode[3])
                    {
                         display();
                     }
                    delay(5);
                    irprosok=0;

                  }
              }
            if(bitnum>33)
            {
                    bitnum=0;
                    irreceok=1;
                    startflag=0;
                    flag=0;

              }
        }
}

void time1(void) interrupt 2
{
        TH1=(65536-10)/256;
        TL1=(65536-10)%256;
        ++i;
        if(i>10)
          {
          i=0;
          };

        if(i<=zkb)
        {
         P2_1=1;
        }
        else P2_1=0;

}


void timer0() interrupt 1
{
       irtime++;
}


void int0() interrupt 0
{
      if(startflag)
      {
          if(irtime>31)//检测引导码
            {         
               bitnum=0;
               flag=1;

             }
          if(flag)
             {
                   irdata[bitnum]=irtime;
                   irtime=0;
                   bitnum++;
              }
        }           
      else
          {
              startflag=1;
              irtime=0;
           }
}
此帖出自单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表