<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > AVR紅外發(fā)送和接收的頭文件

          AVR紅外發(fā)送和接收的頭文件

          作者: 時(shí)間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
          *函數(shù)庫說明:包含了紅外通訊常用收發(fā)函數(shù)和工具*
          *版本說明:1.0Bate*
          *作者:xky183*
          *日期:2003年7月*
          *修改:GorgonMeducer*
          *日期:2005年4月21日*
          *平臺(tái):RC8M*
          **
          *說明:紅外通訊使用的格式為字節(jié)直接發(fā)送模式,提供4位自校驗(yàn)的函數(shù)*
          *通訊時(shí)記錄載波寬度。未使用串口幀格式。軟件載波。*
          **
          *硬件連接說明:PC5發(fā)送數(shù)據(jù)(可以修改宏定義)外中斷0接收數(shù)據(jù)*
          **
          *使用說明:添加必要的代碼到定時(shí)器中斷,并且使用頭函數(shù)中的定時(shí)器初*
          *始化程序。使用程序中的外中斷初始化程序,添加必要的部分*
          *到外中斷處理程序中。*
          *發(fā)送數(shù)據(jù)的時(shí)候,調(diào)用函數(shù)RaySend(),也可以調(diào)用KeyDeal()*
          *來處理并發(fā)送4位的控制信號(hào)。*
          *對于接收信號(hào),直接從Ordar或者RayDataIn中讀取收到的字節(jié)*
          *請自己清空RayDataIn變量*
          *接受到的數(shù)據(jù)保存在變量ray_ordar*
          *開啟紅外線接收時(shí)要開外中斷0:GICR=0x40;*
          ********************************************************************/


          /*------------------------------------------------------------------*
          *紅外發(fā)射程序*
          *------------------------------------------------------------------*/


          #defineray_IO_onPORTC|=0B00100000;
          #defineray_IO_offPORTC&=0B11011111;
          #defineT1I_onTIMSK|=0B00000001;
          #defineT1I_offTIMSK&=0B11111110;
          /*---------------------*/
          /*紅外發(fā)射全局變量*/
          /*---------------------*/
          charray_Flag=0;
          charray_Sign=0;

          /*---------------------*/
          /*函數(shù)聲明區(qū)*/
          /*---------------------*/
          charKeyDeal(charTempData);//數(shù)據(jù)編碼發(fā)送函數(shù)
          voidRaySend(unsignedcharDataTemp);//數(shù)據(jù)紅外發(fā)送函數(shù)
          voiddelay_1ms(void);
          voidDelay_Ms(unsignedintn);
          voidTimer0_init(void);
          voidray_send_init(void);

          /***********紅外線發(fā)射*****************
          voidray_send_init(void)*
          {*
          Timer0_init();*
          }*
          **************************************/

          /********************************************************************
          *函數(shù)說明:1MS延時(shí)程序*
          ********************************************************************/
          voiddelay_1ms(void)
          {
          unsignedinti;
          for(i=1;i<(unsignedint)(8*143-2);i++)
          ;
          }

          /********************************************************************
          *函數(shù)說明:MS延時(shí)程序*
          *輸入:需要延時(shí)的時(shí)長*
          ********************************************************************/
          voidDelay_Ms(unsignedintn)
          {
          unsignedinti=0;
          while(i
          {
          delay_1ms();
          i++;
          }
          }
          /*-------------------------------------------------------------------
          *發(fā)射程序需要定時(shí)器0的支持,請粘貼以下代碼到主程序*
          --------------------------------------------------------------------/
          /********************************************************************
          *函數(shù)說明:定時(shí)器0中斷處理程序,用來產(chǎn)生40MHz的載波*
          *********************************************************************
          #pragmainterrupt_handlertimer0_ovf_isr:10
          voidtimer0_ovf_isr(void)//需要定時(shí)器0的中斷支持本函數(shù)庫
          {
          TCNT0=0xa5;
          ray_Flag++;
          ray_Sign=1;
          }
          /********************************************************************
          *函數(shù)說明:定時(shí)器0初始化程序*
          *********************************************************************
          voidTimer0_init(void)
          {
          TCCR0=0x01;//CK
          TCNT0=0x9b;

          }
          -------------------------------------------------------------------*/

          /*******************************************************************
          *函數(shù)說明:紅外發(fā)送程序*
          *輸入:要發(fā)送的數(shù)據(jù)*
          *******************************************************************/
          voidRaySend(unsignedcharDataTemp)
          {
          unsignedchari=0,DataBit=0;

          ray_Flag=0;
          ray_Sign=0;
          T1I_off;

          for(i=0;i<8;i++)
          {
          DataBit=DataTemp&0x01;
          if(DataBit==0)
          {
          T1I_on;
          while(ray_Flag<40)
          {
          ray_IO_on;//產(chǎn)生高電平
          ray_Sign=0;
          while(ray_Sign!=1);
          ray_IO_off;//產(chǎn)生低電平
          ray_Sign=0;

          while(ray_Sign!=1);
          }
          ray_Flag=0;
          ray_Sign=0;
          ray_IO_off;//產(chǎn)生低電平
          //13.125us的時(shí)間
          while(ray_Flag<=40);//50
          T1I_off;
          ray_Flag=0;
          ray_Sign=0;

          DataTemp=DataTemp>>1;
          }
          else
          {
          T1I_on;
          while(ray_Flag<80)
          {ray_IO_on;//產(chǎn)生高電平
          ray_Sign=0;
          while(ray_Sign!=1);
          ray_IO_off;//產(chǎn)生低電平
          ray_Sign=0;

          while(ray_Sign!=1)
          ;
          }
          ray_Flag=0;
          ray_Sign=0;
          ray_IO_off;//產(chǎn)生低電平
          //13.125us的時(shí)間
          while(ray_Flag<=40);//50
          T1I_off;
          ray_Flag=0;
          ray_Sign=0;
          DataTemp=DataTemp>>1;
          }
          }

          ray_Flag=0;
          ray_IO_off;//為低電平
          i=0;
          T1I_off;

          Delay_Ms(6);//兩個(gè)字節(jié)的數(shù)據(jù)之間間隔
          }

          charKeyDeal(charTempData)
          /********************************************************************
          *函數(shù)說明:數(shù)據(jù)格式轉(zhuǎn)換(4位數(shù)據(jù)加上自己的反碼作交驗(yàn))*
          *輸入:需要轉(zhuǎn)換和發(fā)送的信息*
          *輸出:轉(zhuǎn)換好的數(shù)據(jù),并自動(dòng)發(fā)送數(shù)據(jù)*
          ********************************************************************/
          {
          charTempReturn=0;
          chari=0;
          TempReturn=~TempData&0x0f;
          TempReturn<<=4;
          TempReturn|=0x0f&TempData;
          for(i=0;i<10;i++)
          {
          RaySend(TempReturn);
          Delay_Ms(6);
          }
          returnTempReturn;
          }




          /*------------------------------------------------------------------*
          *紅外接受程序*
          *------------------------------------------------------------------*/

          /*---------------------*/
          /*紅外接收全局變量*/
          /*---------------------*/
          charray_singal_num=0;//接受信號(hào)
          charray_data_in=0;//ray_data_in為接收的數(shù)據(jù)
          charray_symbol=0;
          charray_count_array[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//Bit位數(shù)組
          charray_ordar=0;//最終得到的命令(雞肋)

          /*---------------------*/
          /*函數(shù)聲明區(qū)*/
          /*---------------------*/
          voidray_judger(void);
          voidint0_init(void);
          voidTimer1_init(void);

          /*******紅外線接收**********
          voidray_receive_init(void)
          {
          int0_init();
          Timer1_init();
          }
          ***************************/


          /*-------------------------------------------------------------------
          *發(fā)射程序需要定時(shí)器1和外中斷0的支持,請粘貼以下代碼到主程序*
          --------------------------------------------------------------------/
          /********************************************************************
          *函數(shù)說明:定時(shí)器1初始化程序*
          *********************************************************************
          voidTimer1_init(void)
          {
          TCNT1=0;
          TCCR1B=0x03;
          }
          /********************************************************************
          *函數(shù)說明:外中斷0初始化程序*
          *********************************************************************
          voidint0_init(void)
          {
          MCUCR=0x02;//開中斷0、下降沿觸發(fā)脈沖
          GIFR=0Xff;
          }
          #pragmainterrupt_handlerext_int0:2//M8參考外中斷向量
          /********************************************************************
          *函數(shù)說明:外中斷0中斷處理程序*
          *********************************************************************
          voidext_int0(void)
          {
          chartemp=0;
          temp=TIMSK;
          TIMSK=0;
          if(ray_symbol==0)
          {
          if(TCNT1>=0x00ff)//大于4MS則重置指針
          {
          ray_singal_num=0;
          }
          TCNT1=0X00;//0.5ms記數(shù)值為31
          MCUCR=0X03;//INT0上升沿觸發(fā)
          ray_symbol=1;
          }
          else
          {
          if((TCNT1H==0)&&(TCNT1<=0x00ff))
          {
          ray_count_array[ray_singal_num]=TCNT1L;
          ray_singal_num++;
          if(ray_singal_num==8)
          {
          ray_singal_num=0;
          ray_judger();
          }
          ray_symbol=0;
          }
          else
          {

          ray_singal_num=0;
          }

          MCUCR=0X02;//INT0下降沿觸發(fā)
          TCNT1=0;
          }
          TIMSK=temp;
          }
          /*******************************************************************/

          /********************************************************************
          *函數(shù)說明:紅外信號(hào)處理程序*
          ********************************************************************/
          voidray_judger(void)
          {
          chari=0;
          ray_data_in=0;

          for(i=0;i<8;i++)//加入適當(dāng)?shù)娜咤e(cuò)處理
          {
          if(ray_count_array[i]<0x38)//0.5ms為低電平
          {
          , ;ray_data_in&=~(1<
          }
          if(ray_count_array[i]>=0x38)//1ms為高電平
          {
          ray_data_in|=(1<
          }
          }
          ray_ordar=ray_data_in;
          }


          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();