久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9842|回復: 11
打印 上一主題 下一主題
收起左側(cè)

51單片機紅外的一些小程序

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:198748 發(fā)表于 2017-5-9 18:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
由于我剛開始學紅外的時候,什么都不懂,在網(wǎng)上到處找資料,可是在這些找到的資料中,很多都是沒有用的,找到的程序,大多都是拷貝的某某公司提供的示例源程序,大多都是千篇一律,看過很多的百度提問,可是基本上都沒有從根本上解決問題,也上過豆丁之類的,看看東西還要積分,我郁悶了,當時我就立志等我學會紅外紅一定做個紅外的專題,免費的分享給大家,以方便苦苦探索的莘莘學子。
苦惱了好一陣后,幸好認識一位嵌入的大哥,給我了幫助,給我資料,功夫不負有心人,今天我終于學了紅外的一些知識,為了謝謝幫助過我的大哥,我只能將他交給我的分享給大家,以此回報他,因此在這里將我所學到的免費的分享給大家,供大家交流學習。
至于程序,它是靈活多變,大家不要習慣性的CTRl+ACTRL+C,要讀懂它的意思,根據(jù)程序的思想,然后自己發(fā)揮,從而真正掌握它的原理。
大家如有疑問的可以和我交流,我的QQ925171906,在此祝福所有在學習道路上孜孜不倦的可敬可佩的學子們,學業(yè)大成!對于經(jīng)濟窘迫的我來說,習慣了拿不收費的資料,并對變相收費有一種深惡痛絕的感覺;讓更多的人來(更容易)了解紅外,貢獻自己的一點力
量。也希望大家有好資料的多分享一下,不要那么小氣,還要什么積分什么的。
1硬件連接:P0口為數(shù)碼管的段選段,P2口的高四位為數(shù)碼管的位選端,紅外接連在P3.2端,即連接在外部中斷0

2.主要功能:用數(shù)碼管顯示接收到的紅外按鍵的鍵碼
3.程序如下:
//硬件連接
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit hongwai = P3^2;//此表為 數(shù)碼管的字模, 共陰數(shù)碼管 0-9  -
uchar  code table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
uchar  recieve[3];//儲存用戶碼、用戶反碼與鍵數(shù)據(jù)碼、鍵數(shù)據(jù)反碼
uchar  a[]={0,0,0,0};
void delay(uint i)
{
    char j;
    for(i; i > 0; i--)
        for(j = 200; j > 0; j--);
}
void IRdelay(uchar x)    //x*0.14MS
{
       uchar i;
  while(x--)
{
  for (i = 0; i<13; i++);
}
}
void display(uchar keyno)
{  
        uchar i,j;
        a[0]=keyno%10000/1000;
      a[1]=keyno%1000/100;
      a[2]=keyno%100/10; //十位
      a[3]=keyno%10;    //個位
     j=0xfe; //對數(shù)碼管進行逐位掃描顯示
     for(i=0; i<=3; i++)
        {                       
            j=_cror_(j,1);
            P2=j;
            P0 = table[a];      
           delay(50);
        }
        P0 = 0;   
}
void IR_IN(void) interrupt 0      //外部中斷0,即紅外接收P3.2
{
    uchar j,k,count=0;
     EX0 = 0; //關閉外部中斷0,即停止接收紅外         
       IRdelay(5);
       if (hongwai==1)
     {
           EX0 =1;
          return;
        }                            //確認IR信號出現(xiàn)
    while (!hongwai)            //IR變?yōu)楦唠娖剑^9ms的前導低電平信號。
    {
           IRdelay(1);
      }
     for (j=0;j<4;j++)         //收集四組數(shù)據(jù)
     {
          for (k=0;k<8;k++)        //每組數(shù)據(jù)有8
          {
                    while (hongwai) // IR 變?yōu)榈碗娖剑^4.5ms的前導高電平 信號。
             {
                      IRdelay(1);
                 }
              while (!hongwai)          // IR 變?yōu)楦唠娖?/font>
             {
                      IRdelay(1);
                 }
             while (hongwai)           //計算IR高電平時長
            {
                   IRdelay(1);
                   count++;           
                   if (count>=30)
                      {
                            EX0=1;
                            return;
                      }                  //0.14ms計數(shù)過長自動離開。
            }                        //高電平計數(shù)完畢               
             recieve [j]= recieve [j] >> 1;                  //數(shù)據(jù)最高位補"0"
             if (count>=8)
                 {
                      recieve [j] = recieve [j] | 0x80;
                 }  //數(shù)據(jù)最高位補"1"
             count=0;
          }//end for k        
     }//end for j   
   if (recieve [2]!=~ recieve [3])//校驗鍵值碼與鍵值反碼的值,
   {
              EX0=1;    //如果鍵值碼與鍵值反碼取反后相等,則開外部中斷中斷0,開始接收下一個紅外信號
       return;      
      }      
      EX0 = 1;
}
void main()
{
    EA=1;//開放全局中斷
      EX0=1;//開外部中斷0
      IT0=1;//觸發(fā)方式為脈沖負邊沿觸發(fā)
      hongwai=1;
      while(1)
      {
    //顯示紅外鍵碼
           display(recieve [2]);
   }      
}
2 主要功能:當遙控器上的數(shù)字鍵被按下時,讓八個數(shù)碼管同時顯示按下的數(shù)字
硬件連接:P0口為數(shù)碼管的段選段,P2口為數(shù)碼管的位選端,默認位選端全部開放0x00P3.2接紅外接收頭
程序如下:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit hongwai = P3^2;
uchar  code    table[]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,
                                                  0x7C,0x39,0x5E,0x79,0x71};
uchar  recieve[3];//儲存用戶碼、用戶反碼與鍵數(shù)據(jù)碼、鍵數(shù)據(jù)反碼
uchar  a[]={0,0,0,0};
void IRdelay(uchar x)    //x*0.14MS
{
uchar i;
  while(x--)
{
  for (i = 0; i<13; i++);
}
}
void main()
{
    EA=1;//開放全局中斷
      EX0=1;//開外部中斷0
      IT0=1;//觸發(fā)方式為脈沖負邊沿觸發(fā)
      hongwai=1;
      
      while(1)
      {
           P2=0x00;
           switch(recieve[2])
           {
               case 22:P0=table[0];break;//不同的遙控器可能鍵值不一樣,可以根據(jù)程序1測出鍵值,在修改case后面的值即可
                 case 12:P0=table[1];break;
                 case 24:P0=table[2];break;
                 case 94:P0=table[3];break;
                 case 8:P0=table[4];break;
                 case 28:P0=table[5];break;
                 case 90:P0=table[6];break;
                 case 66:P0=table[7];break;
                 case 82:P0=table[8];break;
                 case 74:P0=table[9];break;
                 case 68:P2=0xff;P0=0x00;break;
           }
   }
        
}
void IR_IN(void) interrupt 0      //外部中斷0,即紅外接收P3.2
{
    uchar j,k,count=0;
     EX0 = 0; //關閉外部中斷0,即停止接收紅外         
       IRdelay(5);
       if (hongwai==1)
     {
           EX0 =1;
          return;
        }                            //確認紅外信號出現(xiàn)
    while (!hongwai)            //等紅外變?yōu)楦唠娖剑^9ms的前導低電平信號。
    {
           IRdelay(1);
      }
     for (j=0;j<4;j++)         //收集四組數(shù)據(jù)
     {
          for (k=0;k<8;k++)        //每組數(shù)據(jù)有8
          {
                    while (hongwai)            // IR 變?yōu)榈碗娖剑^4.5ms的前導高電平信號。
             {
                      IRdelay(1);
                 }
              while (!hongwai)          // IR 變?yōu)楦唠娖?/font>
             {
                      IRdelay(1);
                 }
             while (hongwai)           //計算IR高電平時長
            {
                   IRdelay(1);
                   count++;           
                   if (count>=30)
                      {
                            EX0=1;//高電平時間過長則開外部中斷,并返回
                            return;
                      }                  //0.14ms計數(shù)過長自動離開。
            }                        //高電平計數(shù)完畢               
             recieve[j]=recieve[j] >> 1;  //各數(shù)據(jù)位右移一位,因為先讀出的是高位數(shù)據(jù)
             if (count>=8) //如果是高電平則將高位變?yōu)?font face="Times New Roman">1,反之則為0,不做修改
                 {
                      recieve[j] = recieve[j] | 0x80;
                 }
             count=0;
          }      
     }  
   if (recieve[2]!=~recieve[3])//校驗鍵值碼與鍵值反碼的值,
   {
              EX0=1;    //如果鍵值碼與鍵值反碼取反后相等,則開外部中斷中斷0,開始接收下一個紅外信號
       return;      
      }      
      EX0 = 1;
}
3.紅外控制蜂鳴器,硬件連接很簡單,P3.2接紅外接收頭,蜂鳴器接在P1.5
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit hongwai = P3^2;
sbit beep=P1^5;
uchar  recieve[3];//儲存用戶碼、用戶反碼與鍵數(shù)據(jù)碼、鍵數(shù)據(jù)反碼
uchar  a[]={0,0,0,0};
void delay(uchar x)    //x*0.14MS
{
      uchar i;
    while(x--)
     {
          for (i = 0; i<13; i++);
     }
}
void main()
{
    EA=1;//開放全局中斷
      EX0=1;//開外部中斷0
      IT0=1;//觸發(fā)方式為脈沖負邊沿觸發(fā)
      hongwai=1;
      beep=1;
      while(1)
      {
           if(recieve[2]==69)
           {
                 beep=~beep;recieve[2]=98;
           }
   }      
}
void hongwaizhongduan(void) interrupt 0        //外部中斷0,即紅外接收P3.2
{
    uchar j,k,count=0;
     EX0 = 0; //關閉外部中斷0,即停止接收紅外         
       delay(5);
       if (hongwai==1)
     {
           EX0 =1;
          return;
        }                            //確認紅外信號出現(xiàn)
    while (!hongwai)            //等紅外變?yōu)楦唠娖剑^9ms的前導低電平信號。
    {
           delay(1);
      }
     for (j=0;j<4;j++)         //收集四組數(shù)據(jù)
     {
          for (k=0;k<8;k++)        //每組數(shù)據(jù)有8
          {
                    while (hongwai)            // 紅外 變?yōu)榈碗娖剑^4.5ms的前導高電平信號。
             {
                      delay(1);
                 }
              while (!hongwai)          // 紅外 變?yōu)楦唠娖?/font>
             {
                      delay(1);
                 }
             while (hongwai)           //計算紅外高電平時長
            {
                   delay(1);
                   count++;           
                   if (count>=30)
                      {
                            EX0=1;//高電平時間過長則開外部中斷,并返回
                            return;
                      }                  //0.14ms計數(shù)過長自動離開。
            }                        //高電平計數(shù)完畢               
             recieve[j]=recieve[j] >> 1;  //各數(shù)據(jù)位右移一位,因為先讀出的是高位數(shù)據(jù)
             if (count>=8) //如果是高電平則將高位變?yōu)?font face="Times New Roman">1,反之則為0,不做修改
                 {
                      recieve[j] = recieve[j] | 0x80;

…………限于本文篇幅 余下代碼請從51黑下載附件…………


所有資料下載:
紅外線.rar (2.53 MB, 下載次數(shù): 108)



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

使用道具 舉報

沙發(fā)
ID:95393 發(fā)表于 2017-5-12 21:59 來自手機 | 只看該作者
如果接收到的編碼含有a-f,是否還能正常顯示?

評分

參與人數(shù) 1黑幣 +2 收起 理由
木頭少年 + 2 贊一個!

查看全部評分

回復

使用道具 舉報

板凳
ID:29438 發(fā)表于 2017-5-14 12:28 | 只看該作者
正在學習,謝謝!
回復

使用道具 舉報

地板
ID:233756 發(fā)表于 2018-1-9 16:02 | 只看該作者
感謝分享
回復

使用道具 舉報

5#
ID:273870 發(fā)表于 2018-1-9 16:59 | 只看該作者
大神,感謝分享
回復

使用道具 舉報

6#
ID:299539 發(fā)表于 2018-3-30 17:09 | 只看該作者
你好,樓主知道利用單片機連接對射光電傳感器實現(xiàn)物體檢測怎么做么?
回復

使用道具 舉報

7#
ID:301978 發(fā)表于 2018-6-5 15:54 | 只看該作者
感謝您的分享
回復

使用道具 舉報

8#
ID:345537 發(fā)表于 2018-6-5 16:37 | 只看該作者
好好。。。。。
回復

使用道具 舉報

9#
ID:345537 發(fā)表于 2018-6-5 16:38 | 只看該作者
感謝分享
回復

使用道具 舉報

10#
ID:352375 發(fā)表于 2018-6-16 02:32 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

11#
ID:51975 發(fā)表于 2018-10-27 17:56 | 只看該作者
看看,正在學習研究
回復

使用道具 舉報

12#
ID:357520 發(fā)表于 2018-10-28 15:02 | 只看該作者
使用的是什么芯片
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品亚洲成在人线 | 日韩欧美一级片 | 国产高清在线精品一区二区三区 | www.日韩免费 | 日韩一区二区三区四区五区六区 | 国精日本亚洲欧州国产中文久久 | 国产一区在线免费观看 | 国产清纯白嫩初高生在线播放视频 | 日本黄色片免费在线观看 | 亚洲国产中文字幕 | 色婷婷亚洲国产女人的天堂 | 日本久久精品视频 | 日韩影院在线观看 | 国产1页 | 久久久男人的天堂 | 欧美精品久久久久 | 亚洲 欧美 日韩在线 | 亚洲国产伊人 | 久久久国 | 91久久久久久久久久久 | 亚洲免费精品一区 | 久久亚洲一区二区 | 在线看av的网址 | 亚洲黄色一区二区三区 | 国产一级视频在线播放 | 国产在线91| 国产在线不卡 | 久久久久久国产一区二区三区 | 日韩精品色网 | 伊人免费视频二 | 91成人在线 | 欧洲精品视频一区 | 免费观看一区二区三区毛片 | 欧美a级成人淫片免费看 | 亚洲视频在线看 | 人人干人人干人人干 | 福利一区在线观看 | 在线观看国产视频 | 狼人伊人影院 | 色本道| 婷婷成人在线 |