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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9965|回復: 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)



回復

使用道具 舉報

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 | 顯示全部樓層
感謝分享
回復

使用道具 舉報

ID:273870 發表于 2018-1-9 16:59 | 顯示全部樓層
大神,感謝分享
回復

使用道具 舉報

ID:299539 發表于 2018-3-30 17:09 | 顯示全部樓層
你好,樓主知道利用單片機連接對射光電傳感器實現物體檢測怎么做么?
回復

使用道具 舉報

ID:301978 發表于 2018-6-5 15:54 | 顯示全部樓層
感謝您的分享
回復

使用道具 舉報

ID:345537 發表于 2018-6-5 16:37 | 顯示全部樓層
好好。。。。。
回復

使用道具 舉報

ID:345537 發表于 2018-6-5 16:38 | 顯示全部樓層
感謝分享
回復

使用道具 舉報

ID:352375 發表于 2018-6-16 02:32 | 顯示全部樓層
感謝樓主分享
回復

使用道具 舉報

ID:51975 發表于 2018-10-27 17:56 | 顯示全部樓層
看看,正在學習研究
回復

使用道具 舉報

ID:357520 發表于 2018-10-28 15:02 | 顯示全部樓層
使用的是什么芯片
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美视频免费在线 | 亚洲一区二区中文字幕 | 亚洲精品大片 | av一区二区三区四区 | 一区二区三区四区国产 | 综合激情久久 | 狠狠综合久久av一区二区老牛 | 久久久无码精品亚洲日韩按摩 | 免费观看一级毛片 | 精品少妇一区二区三区在线播放 | 久草久草久草 | 国产精品视频一区二区三区 | 午夜男人视频 | 中文字幕视频在线观看免费 | 成人精品系列 | 欧美一区二区三区在线观看 | 翔田千里一区二区 | 日韩欧美在线观看 | 国产一区在线免费 | 中文精品视频 | 91免费在线 | 日韩精品一区二区三区视频播放 | 欧美一级大片 | 欧美一级艳情片免费观看 | 中文字幕一区在线观看视频 | 免费看片国产 | 四虎影院免费在线 | 久久精品一区 | 亚洲国产看片 | 国产精品久久久久久婷婷天堂 | 91看片| 二区三区在线观看 | 久久亚洲国产精品日日av夜夜 | 国产精品视频www | 国产成人一区二区三区精 | 国产一区二区激情视频 | 国产精品日产欧美久久久久 | 97国产一区二区精品久久呦 | 成人在线免费观看av | 色综网| 亚洲一区二区三区在线 |