找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2650|回复: 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 单片机教程网

快速回复 返回顶部 返回列表