欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3606|回復: 3
收起左側

一個簡單單片機IR收發程序

[復制鏈接]
ID:404263 發表于 2020-3-28 11:36 | 顯示全部樓層 |閱讀模式
本帖最后由 cokesu 于 2020-3-30 14:05 編輯

ir讀取的程序經過修改也可以用做紅外解碼
51hei.png

這個程序的主要用途是單線通信,用于兩個單片機傳送數據,只能單向通信。IRSEND() 和IRREAD()函數都需要放在定時器的125us中斷中,SDATA[5]這個數組為發送的數據其中SDATA[4]這個是用于校驗的如果不需要可以把IR_DELAY狀態下的SDATA[4]進行修改,并且把IRREAD()函數里的IR_FINISH狀態下的校驗程序刪掉,IRData[5];這個數組為讀回來的數據。這個是任意兩個單片機都可以是用只需把對應管腳修改為自己單片機的寄存器即可。補充一下發送IRSEND.c里面發送完5個數據以后可以直接跳轉到IR_DELAY無需執行IR_LAST,之前項目需要41位數據所以臨時添加而已,IRREAD.c只會讀40位而已,所以IRSEND.c的IR_LAST狀態的函數可以屏蔽掉,發送完5個數據直接跳轉到IR_DELAY即可

單片機源程序如下:
  1. #include "IRSEND.h"
  2. unsigned char SDATA[5] = {0,0,0,0,0};
  3. unsigned char SNDATA[5] = {0,0,0,0,0};
  4. unsigned char gSendBitCount = 0;    //發送的位計數
  5. unsigned char gSendCount = 0;       //發送個數計數
  6. unsigned char gSendTimeCount = 0;   //發送計時
  7. unsigned char gIRSendMode = 0;      //發送模式
  8. unsigned char gFinishCount = 0;
  9. void IRSENDInit()
  10. {
  11.         _IRSENDOUT_;
  12.         _IRSENDUP_;
  13.         _DATAH_;
  14. }

  15. void IRSEND()   //125us
  16. {
  17.         switch(gIRSendMode)
  18.         {
  19.                 case IR_DELAY:
  20.                         _DATAH_;
  21.                         gSendTimeCount++;
  22.                         if(gSendTimeCount >= _DELAY_)
  23.                         {
  24.                                 gSendTimeCount = 0;
  25.                                 gSendBitCount = 0;
  26.                                 gSendCount = 0;
  27.                                 SNDATA[0] = SDATA[0];
  28.                                 SNDATA[1] = SDATA[1];
  29.                                 SNDATA[2] = SDATA[2];
  30.                                 SNDATA[3] = SDATA[3];
  31.                                 SNDATA[4] = (unsigned char)(~(SDATA[0]+SDATA[1]+SDATA[2]+SDATA[3]+0xbb));
  32.                                 gIRSendMode = IR_SEND;
  33.                         }
  34.                 break;
  35.                 case IR_SEND:
  36.                         gSendTimeCount++;
  37.                         if(gSendTimeCount >= _ROUND_)
  38.                         {
  39.                                 gSendTimeCount = 0;
  40.                                 gSendBitCount++;           //已發送1位
  41.                                 SNDATA[gSendCount] <<= 1;  //數據移位
  42.                                 if(gSendBitCount >= 8)     //已發送8位
  43.                                 {
  44.                                         gSendBitCount = 0;
  45.                                         gSendCount++;
  46.                                         if(gSendCount >= 5)
  47.                                         {
  48.                                                 gSendTimeCount = 0;
  49.                                                 gSendBitCount = 0;
  50.                                                 gSendCount = 0;
  51.                                 //                _DATAH_;
  52.                                                 gIRSendMode = IR_LAST;
  53.                                                 goto _2;
  54.                                         }
  55.                                 }
  56.                         }
  57.                         if((SNDATA[gSendCount] & B10000000) != 0)        //如果等于1
  58.                         {
  59.                                 if(gSendTimeCount < _DATAHTIME_)
  60.                                 {
  61.                                         _DATAL_;
  62.                                 }
  63.                                 else
  64.                                 {
  65.                                         _DATAH_;
  66.                                 }
  67.                         }
  68.                         else
  69.                         {
  70.                                 if(gSendTimeCount < _DATALTIME_)
  71.                                 {
  72.                                         _DATAL_;
  73.                                 }
  74.                                 else
  75.                                 {
  76.                                         _DATAH_;
  77.                                 }
  78.                         }
  79.                         _2:
  80.                 break;
  81.                         
  82.                 case IR_LAST:
  83.                         if(gFinishCount <= _DATAHTIME_)
  84.                         {
  85.                                 _DATAL_;
  86.                         }
  87.                         else
  88.                         {
  89.                                 _DATAH_;
  90.                         }
  91.                         gFinishCount++;
  92.                         if(gFinishCount >= _ROUND_)
  93.                         {
  94.                                 gFinishCount = 0;
  95.                                 gIRSendMode = IR_DELAY;
  96.                         }
  97.                 break;
  98.         }
  99. }
復制代碼

所有資料51hei提供下載:
IR通信.zip (3.17 KB, 下載次數: 16)



評分

參與人數 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

無效樓層,該帖已經被刪除
ID:128463 發表于 2020-4-23 08:55 | 顯示全部樓層
謝謝分享!!
回復

使用道具 舉報

ID:735888 發表于 2020-4-23 10:33 | 顯示全部樓層
試試看看能否好用
回復

使用道具 舉報

ID:610198 發表于 2020-6-24 15:39 | 顯示全部樓層
還不錯 ,下載了~
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表