找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3616|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

[求助]懇求高手看一下問題出在哪兒,謝謝

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:40104 發(fā)表于 2012-5-12 09:51 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式

紅外控制led燈,其中一號(hào)按鍵控制等亮,二號(hào)按鍵控制燈滅,三號(hào)按鍵控制燈的亮度增加,四好按鍵控制燈的亮度減小,仿真時(shí)接收部分沒有信號(hào),謝謝

 

/********************************************單片機(jī)紅外發(fā)射*******************************************
#include <reg52.h>
sbit ir=P2^0;//紅外發(fā)射管控制腳,使用24M晶振
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
unsigned int count, set_count; //中斷計(jì)數(shù),設(shè)定中斷次數(shù)
bit irflag,keyflag; //紅外發(fā)送標(biāo)志位,按鍵標(biāo)志位
unsigned char irsys[]={0x00,0xff};//16位用戶碼
unsigned char irdata,ircode; //發(fā)送的紅外數(shù)據(jù)
//---------------------------------------------------------------------------
void delay(unsigned int a)//延時(shí)約1ms,晶振24M ,此處延時(shí)不需很精確
{
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鍵按下,則發(fā)射數(shù)據(jù)0x01
if(k2==0)
{
  delay(10);
  if(k2==0)
  {
  keyflag=1;
  while(!k2);
  irdata=0x02;

  }
} //k2鍵按下,則發(fā)射數(shù)據(jù)0x02
if(k3==0)
{
  delay(10);
  if(k3==0)
  {
  keyflag=1;
  while(!k3);
  irdata=0x03;

  }
}//k3鍵按下,則發(fā)數(shù)據(jù)0x03
if(k4==0)
{
 delay(10);
 if(k4==0)
 {
 keyflag=1;
 while(!k4);
 irdata=0x04;
 }
}//k4鍵按下,則發(fā)數(shù)據(jù)0x04
}
//---------------------------------------------------------------------------
void ir_sendbyte() //紅外發(fā)送一個(gè)字節(jié)數(shù)據(jù)
{
unsigned char i;
for(i=0;i<8;i++) //發(fā)送8位數(shù)據(jù)
{
set_count=43;//35; //發(fā)送編碼中的0.56ms高電平 (//后為12M晶振下的數(shù)值)
irflag=1; //啟動(dòng)紅外發(fā)射二極管發(fā)射
count=0; //中斷計(jì)數(shù)先清0
TR0=1; //開啟定時(shí)器0
while(count<set_count); //等待發(fā)送完
TR0=0; //關(guān)閉定時(shí)器0
if(ircode&0x01) set_count=130;//130; //判斷紅外編碼最低位,若為1則1.69ms的低電平 (//后為12M晶振下的數(shù)值)
else set_count=43;//35; //為0則0.565ms的低電平 (//后為12M晶振下的數(shù)值)
irflag=0; //低電平則不發(fā)射
count=0; //中斷計(jì)數(shù)清0
TR0=1; //開啟定時(shí)器0
while(count<set_count); //等待發(fā)送完
TR0=0; //關(guān)閉定時(shí)器0
ircode=ircode>>1; //將數(shù)據(jù)右移,即從低位到高位發(fā)送
}
}
//---------------------------------------------------------------------------
void ir_send() //發(fā)送紅外數(shù)據(jù)
{
set_count=346;//672; //發(fā)送編碼中的引導(dǎo)碼(4.5ms高電平+4.5ms低電平) (//后為12M晶振下的數(shù)值)
irflag=1; //啟動(dòng)紅外發(fā)射二極管發(fā)射
count=0; //中斷計(jì)數(shù)清0
TR0=1;
while(count<set_count);
TR0=0;
set_count=346;//336; //發(fā)送編碼中的4.5ms低電平(//后為12M晶振下的數(shù)值)
irflag=0; //低電平則不發(fā)射
count=0;
TR0=1;
while(count<set_count); //等待發(fā)送完
TR0=0;
ircode=irsys[0]; //發(fā)送16位用戶碼的前1-8位
ir_sendbyte();
ircode=irsys[1]; //發(fā)送16位用戶碼的前9-16位
ir_sendbyte();
ircode=irdata; //發(fā)送8位數(shù)據(jù)碼
ir_sendbyte();
ircode=~irdata; //發(fā)送8位數(shù)據(jù)反碼
ir_sendbyte();
set_count=43;//35; //發(fā)送編碼中的0.56ms高電平 (//后為12M晶振下的數(shù)值)
irflag=1;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
irflag=0;
delay(23); //延時(shí)23ms(編碼中的23ms低電平)
set_count=346;//670; //發(fā)送編碼中的引導(dǎo)碼(4.5ms高電平+4.5ms低電平) (//后為12M晶振下的數(shù)值)
irflag=1;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
set_count=346;//336; //發(fā)送編碼中的4.5ms低電平(//后為12M晶振下的數(shù)值)
irflag=0;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
set_count=43;//35; //發(fā)送編碼中的0.56ms高電平 (//后為12M晶振下的數(shù)值)
irflag=1;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
irflag=0;
delay(23);
}
//---------------------------------------------------------------------------
void timer0_init() //定時(shí)器初始化
{
EA=1;
TMOD=0x02; //定時(shí)0 8位自動(dòng)重裝模式
ET0=1;
TH0=0xe6;//0xf3; //定時(shí)13us,38K紅外矩形波,晶振24M (//后為12M晶振下的數(shù)值)
TL0=0xe6;
}
//---------------------------------------------------------------------------
void main()
{
timer0_init(); //定時(shí)0初始化
count=0; //中斷計(jì)數(shù)先清0
ir=0;
irflag=0;
while(1)
{
keyscan(); //鍵值掃描
if(keyflag) //若有按鍵按下
{
delay(10);
ir_send(); //發(fā)送紅外編碼
delay(500);
keyflag=0; //按鍵標(biāo)志清零
delay(100);
}
}
}
//---------------------------------------------------------------------------
void timer0() interrupt 1 //定時(shí)器0中斷
{
count++;
if(irflag==1) ir=~ir; //有發(fā)射標(biāo)志,則發(fā)射38khz的矩形波
else ir=0; //否則不發(fā)射,即相當(dāng)于發(fā)射編碼中的低電平
}

 

 

//***********紅外接收**********
#include<reg52.h>
#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)//檢測引導(dǎo)碼
            {         
               bitnum=0;
               flag=1;

             }
          if(flag)
             {
                   irdata[bitnum]=irtime;
                   irtime=0;
                   bitnum++;
              }
        }          
      else
          {
              startflag=1;
              irtime=0;
           }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表