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

標題: 51單片機遙控接收器 紅外NEC協議 代碼有詳細注釋 [打印本頁]

作者: 有束光    時間: 2018-3-8 21:00
標題: 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)



作者: haogege1014    時間: 2018-3-9 19:49
請問你知道如何使用遙控功能嗎?自動的比如循跡小車我會做,但是遙控功能的卻不會
作者: 有束光    時間: 2018-3-31 10:23
haogege1014 發表于 2018-3-9 19:49
請問你知道如何使用遙控功能嗎?自動的比如循跡小車我會做,但是遙控功能的卻不會

遙控的需要用一個紅外接收器、和紅外遙控(NEC協議),就可以實現的
作者: 羅文杰    時間: 2018-7-29 21:17
haogege1014 發表于 2018-3-9 19:49
請問你知道如何使用遙控功能嗎?自動的比如循跡小車我會做,但是遙控功能的卻不會

那只能說明循跡小車也是抄的
作者: Jhao    時間: 2019-9-30 08:24
羅文杰 發表于 2018-7-29 21:17
那只能說明循跡小車也是抄的

有輪子何必再造
作者: 714452040    時間: 2019-10-1 23:46
nec協議相對簡單一點,實現起來比較容易,可以用IO中斷來處理




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 精品日韩| 欧美日本在线观看 | 在线视频99 | 狠狠操狠狠操 | 伊色综合久久之综合久久 | 午夜电影一区二区 | 亚洲 自拍 另类 欧美 丝袜 | 久久国产成人 | 91麻豆精品国产91久久久更新资源速度超快 | 亚洲免费视频一区 | 成人国产午夜在线观看 | 中文字幕一区二区三区四区 | 在线看免费的a | 日本久久精 | 毛片一级片 | 久久久久久久久久一区二区 | 久久久久久国产精品免费免费狐狸 | aaa在线| 99热碰 | 久久黄色网 | 91在线视频国产 | 天天视频一区二区三区 | 孰女乱色一区二区三区 | 久久精品国产免费一区二区三区 | 在线观看中文字幕dvd播放 | 91精品一区二区三区久久久久 | 中文字幕亚洲欧美日韩在线不卡 | 精品日韩一区 | 国产va| 国产在线拍偷自揄拍视频 | 国产免费看 | 日韩久久中文字幕 | 在线色网| 成人精品国产免费网站 | 亚洲午夜精品一区二区三区他趣 | 久久久免费观看视频 | 久久国产精品-久久精品 | 国产精品视频免费看 | 日韩成人av在线 | 日韩精品av一区二区三区 | 日日人人 |