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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9794|回復: 11
打印 上一主題 下一主題
收起左側

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

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

2.主要功能:用數碼管顯示接收到的紅外按鍵的鍵碼
3.程序如下:
//硬件連接
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit hongwai = P3^2;//此表為 數碼管的字模, 共陰數碼管 0-9  -
uchar  code table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
uchar  recieve[3];//儲存用戶碼、用戶反碼與鍵數據碼、鍵數據反碼
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; //對數碼管進行逐位掃描顯示
     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信號出現
    while (!hongwai)            //IR變為高電平,跳過9ms的前導低電平信號。
    {
           IRdelay(1);
      }
     for (j=0;j<4;j++)         //收集四組數據
     {
          for (k=0;k<8;k++)        //每組數據有8
          {
                    while (hongwai) // IR 變為低電平,跳過4.5ms的前導高電平 信號。
             {
                      IRdelay(1);
                 }
              while (!hongwai)          // IR 變為高電平
             {
                      IRdelay(1);
                 }
             while (hongwai)           //計算IR高電平時長
            {
                   IRdelay(1);
                   count++;           
                   if (count>=30)
                      {
                            EX0=1;
                            return;
                      }                  //0.14ms計數過長自動離開。
            }                        //高電平計數完畢               
             recieve [j]= recieve [j] >> 1;                  //數據最高位補"0"
             if (count>=8)
                 {
                      recieve [j] = recieve [j] | 0x80;
                 }  //數據最高位補"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;//觸發方式為脈沖負邊沿觸發
      hongwai=1;
      while(1)
      {
    //顯示紅外鍵碼
           display(recieve [2]);
   }      
}
2 主要功能:當遙控器上的數字鍵被按下時,讓八個數碼管同時顯示按下的數字
硬件連接:P0口為數碼管的段選段,P2口為數碼管的位選端,默認位選端全部開放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];//儲存用戶碼、用戶反碼與鍵數據碼、鍵數據反碼
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;//觸發方式為脈沖負邊沿觸發
      hongwai=1;
      
      while(1)
      {
           P2=0x00;
           switch(recieve[2])
           {
               case 22:P0=table[0];break;//不同的遙控器可能鍵值不一樣,可以根據程序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;
        }                            //確認紅外信號出現
    while (!hongwai)            //等紅外變為高電平,跳過9ms的前導低電平信號。
    {
           IRdelay(1);
      }
     for (j=0;j<4;j++)         //收集四組數據
     {
          for (k=0;k<8;k++)        //每組數據有8
          {
                    while (hongwai)            // IR 變為低電平,跳過4.5ms的前導高電平信號。
             {
                      IRdelay(1);
                 }
              while (!hongwai)          // IR 變為高電平
             {
                      IRdelay(1);
                 }
             while (hongwai)           //計算IR高電平時長
            {
                   IRdelay(1);
                   count++;           
                   if (count>=30)
                      {
                            EX0=1;//高電平時間過長則開外部中斷,并返回
                            return;
                      }                  //0.14ms計數過長自動離開。
            }                        //高電平計數完畢               
             recieve[j]=recieve[j] >> 1;  //各數據位右移一位,因為先讀出的是高位數據
             if (count>=8) //如果是高電平則將高位變為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];//儲存用戶碼、用戶反碼與鍵數據碼、鍵數據反碼
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;//觸發方式為脈沖負邊沿觸發
      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;
        }                            //確認紅外信號出現
    while (!hongwai)            //等紅外變為高電平,跳過9ms的前導低電平信號。
    {
           delay(1);
      }
     for (j=0;j<4;j++)         //收集四組數據
     {
          for (k=0;k<8;k++)        //每組數據有8
          {
                    while (hongwai)            // 紅外 變為低電平,跳過4.5ms的前導高電平信號。
             {
                      delay(1);
                 }
              while (!hongwai)          // 紅外 變為高電平
             {
                      delay(1);
                 }
             while (hongwai)           //計算紅外高電平時長
            {
                   delay(1);
                   count++;           
                   if (count>=30)
                      {
                            EX0=1;//高電平時間過長則開外部中斷,并返回
                            return;
                      }                  //0.14ms計數過長自動離開。
            }                        //高電平計數完畢               
             recieve[j]=recieve[j] >> 1;  //各數據位右移一位,因為先讀出的是高位數據
             if (count>=8) //如果是高電平則將高位變為1,反之則為0,不做修改
                 {
                      recieve[j] = recieve[j] | 0x80;

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


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



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

使用道具 舉報

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

評分

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

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: h视频在线观看免费 | 九九精品视频在线 | 91 在线| 色综合视频 | 久久精品亚洲成在人线av网址 | 在线观看日韩 | 色视频网站 | 97国产精品| 日本在线精品视频 | 综合一区二区三区 | 成人福利片 | 337p日本欧洲亚洲大胆 | 密室大逃脱第六季大神版在线观看 | 不卡一区| 成人一区精品 | 日韩欧美国产一区二区 | 日韩欧美中文在线 | 中文字幕二区 | 91精品国产乱码久久久久久久久 | 欧美日韩亚洲国产综合 | av香蕉| 久久综合一区 | 日韩综合 | 国产福利网站 | 免费视频一区二区 | 国产精品日韩在线观看一区二区 | 麻豆久久久久久久久久 | 在线看av网址 | 国产成人jvid在线播放 | 97日日碰人人模人人澡分享吧 | 久久成人免费视频 | 国产美女h视频 | 亚洲在线免费观看 | 超碰人人插 | 91免费在线| 中文在线一区 | 国产精品久久一区二区三区 | 亚洲久在线 | 99热这里都是精品 | 久久国产精品一区二区三区 | 国产精品久久久久久久 |