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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機遙控接收器 紅外NEC協議 代碼有詳細注釋

[復制鏈接]
跳轉到指定樓層
樓主
51單片機,紅外NEC協議,ds18b20溫度傳感器(P3.7),紅外接收器7844s,三位一體共陰數碼管(段碼:P2,位碼:P1.1,P1.2,P1.3),上拉電阻A102,接觸器(5v)接P1.3,(程序已親測,放心使用)


單片機源程序如下(源代碼的注釋非常詳細):
  1. #include<reg52.h>
  2. #include"inf.h"
  3. #include"relay.h"
  4. #include"ds18b20.h"
  5. #include"dig.h"

  6. extern uchar IRCOM[5];          //用來存放讀取到的紅外值
  7. extern unsigned char DisplayData[3];
  8. extern uchar code DIG_CODE[10];
  9. extern uchar code  RecvData[];
  10. int time=2100;
  11. int SET_Flag=0;//0 是非設置狀態  1 是設置狀態

  12. /***********************************************函數聲明**********************************************************/
  13. void TempDisplayTest(void);// DS18B20進行溫度轉換并進行讀取,計算出來(并顯示)
  14. extern void Contro_lrelay(uchar ConType,uint k);
  15. void key_scan();


  16. void main()
  17. {
  18.         int tempC=0,te,biao1=0,biao2=0;
  19.         uint ss=0;
  20.         InfInit();
  21.                
  22.         while(1)
  23.         {                         
  24.                  key_scan();
  25.                  
  26.                  //獲取溫度
  27.                  tempC=LcdDisplay(Ds18b20ReadTemp());
  28.                  
  29.                  //如果設置的溫度值大于室內溫度,繼電器閉合
  30.                  te=tempC% 10000;
  31.                  if(biao1==1)

  32.                  goto end1;
  33.                  if(te>=time)
  34.                  {
  35.                          Contro_lrelay(16,1);        //繼電器斷開
  36.                           biao1=1;
  37.                           biao2=0;
  38.                  }
  39.                  end1:
  40.                  if(biao2==1)

  41.                  goto end2;
  42.                  if(te<time)
  43.                  {
  44.                          Contro_lrelay(15,1);        //繼電器閉合
  45.                         biao2=1;
  46.                         biao1=0;
  47.                  }
  48.                  end2:
  49.                  //設置狀態
  50.                  if(SET_Flag)
  51.                  {
  52.                          tempC=time;
  53.                         ss++;
  54.                  }
  55.                  //工作狀態
  56.                  else
  57.                  {
  58.                          ss=0;
  59.                  }

  60.                  if(ss<=40)
  61.                  {
  62.                     //顯示
  63.                          DigDisplay(tempC);
  64.                  }
  65.                  else if(ss<=60)
  66.                  {
  67.                          GPIO_DIG=0x00;
  68.                         if(ss==60)
  69.                         ss=0;
  70.                  }                 
  71.         }                                                       
  72. }

  73. /*******************************************************************************
  74. * 函 數 名         : key_scan()
  75. * 函數功能                   : 溫度調節用
  76. * 輸    入         : i
  77. * 輸    出         : 無
  78. *******************************************************************************/
  79. void key_scan()
  80. {
  81.         int i=0;
  82.         int j=0;
  83.         uchar Keydate=0;
  84.         for(j=0;j<9;j++)                                   //循環進行鍵碼解析
  85.         {
  86.                 if(IRCOM[2]==RecvData[j])                       //進行鍵位對應
  87.                 {
  88.                         Keydate=IRCOM[2];
  89.                         IRCOM[2]=0;
  90.                         break;
  91.                 }                                      
  92.         }               
  93.         switch(Keydate)
  94.         {
  95.                 case 0x07://-
  96.                 {
  97.                         time -=100;
  98.                         break;
  99.                 }
  100.                 case 0x15://+
  101.                 {
  102.                         time +=100;
  103.                         break;
  104.                 }
  105.                 case 0x09://Set
  106.                 {
  107.                         SET_Flag=~SET_Flag;
  108.                         break;
  109.                 }
  110.         }


  111. }
  112.           
復制代碼
  1. #include"inf.h"
  2. #include"relay.h"
  3. uchar IRCOM[5];          //用來存放讀取到的紅外值 (IrValue[4])
  4. sbit IRIN=P3^2;   //紅外接收器數據接口

  5. //存放按鍵鍵值(NEC紅外協議)
  6. uchar code  RecvData[]={0x07,0x15,0x09,0x43,0x47,0x0d,0x44,0x40,0x0D,0x0E};


  7. /***********************************************************
  8. *函 數 名        :InfInit
  9. *函數功能  :為外部中斷0,做初始化
  10. *函數參數  :x
  11. *返 回 值        :無
  12. ************************************************************/
  13. void InfInit()
  14. {
  15.         IT0=1;//下降沿觸發
  16.         EX0=1;//打開中斷0允許
  17.         EA=1;        //打開總中斷
  18.         IRIN=1;//初始化端口
  19. }


  20. /***********************************************************
  21. *函 數 名        :delayms
  22. *函數功能  :延時0.14ms
  23. *函數參數  :x
  24. *返 回 值        :無
  25. ************************************************************/
  26. static void delayms(unsigned char x)                         //0.14mS延時程序
  27. {
  28.   unsigned char i;                                    //定義臨時變量
  29.   while(x--)                                          //延時時間循環
  30.   {
  31.     for (i = 0; i<13; i++) {}                         //14mS延時
  32.   }
  33. }


  34. /***********************************************************
  35. *函 數 名        :IR_IN
  36. *函數功能  :外部中斷0
  37. *函數參數  :無
  38. *返 回 值        :無
  39. ************************************************************/
  40. void IR_IN() interrupt 0// using 0                      //定義INT2外部中斷函數
  41. {
  42.   unsigned char j,k,N=0;                              //定義臨時接收變量
  43.    
  44.   EX0 = 0;                                            //關閉外部中斷,防止再有信號到達   
  45.   delayms(15);                                        //延時時間,進行紅外消抖
  46.   if (IRIN==1)                                        //判斷紅外信號是否消失
  47.   {  
  48.      EX0 =1;                                          //外部中斷開
  49.          return;                                          //返回
  50.   }
  51.                            
  52.   while (!IRIN)                                       //等IR變為高電平,跳過9ms的前導低電平信號。
  53.   {
  54.       delayms(1);                                     //延時等待
  55.   }

  56.   for (j=0;j<4;j++)                                   //采集紅外遙控器數據
  57.   {
  58.     for (k=0;k<8;k++)                                 //分次采集8位數據
  59.     {
  60.        while (IRIN)                                   //等 IR 變為低電平,跳過4.5ms的前導高電平信號。
  61.        {
  62.          delayms(1);                                  //延時等待
  63.        }
  64.       
  65.        while (!IRIN)                                  //等 IR 變為高電平
  66.        {
  67.          delayms(1);                                  //延時等待
  68.        }
  69.    
  70.        while (IRIN)                                   //計算IR高電平時長
  71.        {
  72.          delayms(1);                                  //延時等待
  73.          N++;                                         //計數器加加
  74.          if (N>=30)                                   //判斷計數器累加值
  75.              {
  76.            EX0=1;                                     //打開外部中斷功能
  77.                return;                                    //返回
  78.          }                  
  79.        }
  80.                                        
  81.       IRCOM[j]=IRCOM[j] >> 1;                         //進行數據位移操作并自動補零
  82.      
  83.       if (N>=8)                                       //判斷數據長度
  84.       {
  85.          IRCOM[j] = IRCOM[j] | 0x80;                  //數據最高位補1
  86.       }
  87.       N=0;                                            //清零位數計錄器
  88.     }
  89.   }
  90.    
  91.   if (IRCOM[2]!=~IRCOM[3])                            //判斷地址碼是否相同
  92.   {
  93.      EX0=1;                                           //打開外部中斷
  94.      return;                                          //返回
  95. ……………………

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

所有資料51hei提供下載:
遙控控制、溫度顯示 (最終程序).zip (76.46 KB, 下載次數: 75)


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

使用道具 舉報

沙發
ID:281938 發表于 2018-3-9 19:49 | 只看該作者
請問你知道如何使用遙控功能嗎?自動的比如循跡小車我會做,但是遙控功能的卻不會
回復

使用道具 舉報

板凳
ID:289186 發表于 2018-3-31 10:23 | 只看該作者
haogege1014 發表于 2018-3-9 19:49
請問你知道如何使用遙控功能嗎?自動的比如循跡小車我會做,但是遙控功能的卻不會

遙控的需要用一個紅外接收器、和紅外遙控(NEC協議),就可以實現的
回復

使用道具 舉報

地板
ID:61973 發表于 2018-7-29 21:17 來自手機 | 只看該作者
haogege1014 發表于 2018-3-9 19:49
請問你知道如何使用遙控功能嗎?自動的比如循跡小車我會做,但是遙控功能的卻不會

那只能說明循跡小車也是抄的
回復

使用道具 舉報

5#
ID:618124 發表于 2019-9-30 08:24 | 只看該作者
羅文杰 發表于 2018-7-29 21:17
那只能說明循跡小車也是抄的

有輪子何必再造
回復

使用道具 舉報

6#
ID:618689 發表于 2019-10-1 23:46 | 只看該作者
nec協議相對簡單一點,實現起來比較容易,可以用IO中斷來處理
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本在线免费 | 亚洲人成在线播放 | 超碰免费在线观看 | 欧美成视频| 九九热这里只有精品在线观看 | 中文字幕 国产精品 | 国产精品一区视频 | 在线视频中文字幕 | 成人免费看黄网站在线观看 | 国产精品国产精品国产专区不卡 | 97精品超碰一区二区三区 | 天天综合永久入口 | 成年人免费在线视频 | 91精品亚洲 | 久久精品国产一区 | 中文字幕免费视频 | 成人欧美一区二区三区色青冈 | 欧美精产国品一二三区 | 精品国产欧美一区二区 | 亚洲九九| 久久综合av| 亚洲精品1| 亚洲欧美日韩精品 | 欧美亚洲第一区 | 日本欧美黄色片 | 久久久精品一区 | 欧州一区二区 | 青青草视频免费观看 | 波多野结衣亚洲 | 欧美激情国产精品 | 日韩亚洲视频在线 | 91精品在线播放 | 国产中文字幕网 | 亚洲国产精品久久久久婷婷老年 | 国产伦一区二区三区视频 | 亚洲高清在线 | 操操日| 免费一级片 | 午夜精品久久久久久久99黑人 | 国产精品三级 | 国内精品久久久久久久影视简单 |