红外发送调制38K

首先需要知道,单片机通过串口输出红外信号的同时需要输出一个调制信号,一般为38K占空比为1:3的方波。
至于为什么是38k以及占空比为1:3可以百度更多资料。

对于单片机使用SCTimer计数器输出38KPWM的时,需要注意几点

  1. 限值:也就是清楚counter的时的值。
  2. 触发电平变化的值,一般指在上升沿或者下降沿触发。

下面以单片机主频30MHz,说一下这几个值的计算:

限值

30MHz对应为1秒,可以理解为单片机1s计数30M次。
30KHz的方波一个周期对应的时间为1/38K。
因此转换为1/38K时间内单片机计数多少次?

可计算为30M/38K = 789;

也就是说38K PWM波一个周期的COUNTER值为789. 数到了这个值计数器就该清零了。

触发事件的值

因为占空比为1:3, 所以上升沿为7891/3 = 263, 下降沿为7892/3 = 526

如下图所示:(画的匆忙)

这里写图片描述

更多资料请参看红外调制38K

v v v v v v

本文为作者原创,请勿转载,转载请联系作者。
点击下方卡片,关注我的公众号,有最新的文章和项目动态。

v v v v v v

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是一个简单的基于Arduino的红外收发器设计,可以每秒采集一次温度并通过红外发送,同时用红外接收模块接收并显示在LCD上: ```C++ #include <IRremote.h> #include <LiquidCrystal.h> #include <OneWire.h> #include <DallasTemperature.h> // 定义红外发送和接收引脚 #define IR_SEND_PIN 3 #define IR_RECV_PIN 2 // 定义温度传感器引脚 #define TEMP_SENSOR_PIN 4 // 定义红外调制频率 #define IR_FREQ 38000 // 初始化红外发送和接收模块 IRsend irSend(IR_SEND_PIN); IRrecv irRecv(IR_RECV_PIN); // 初始化温度传感器和LCD OneWire oneWire(TEMP_SENSOR_PIN); DallasTemperature tempSensor(&oneWire); LiquidCrystal lcd(7, 8, 9, 10, 11, 12); void setup() { // 初始化温度传感器和LCD显示器 tempSensor.begin(); lcd.begin(16, 2); lcd.print("Temp: "); // 初始化红外接收模块并打开调试输出 irRecv.enableIRIn(); Serial.begin(9600); } void loop() { // 读取温度传感器的值 tempSensor.requestTemperatures(); float temp = tempSensor.getTempCByIndex(0); // 将温度值转换为字符串并发送红外信号 String tempStr = String(temp, 2); irSend.sendRaw(generateSignal(tempStr)); // 等待红外信号接收 if (irRecv.decode()) { // 将接收到的红外信号转换为字符串并显示在LCD上 String signalStr = decodeSignal(irRecv.results.value); lcd.setCursor(6, 0); lcd.print(signalStr); irRecv.resume(); } // 等待1秒再进行下一次采集 delay(1000); } // 生成红外信号 unsigned int* generateSignal(String signal) { int signalLen = signal.length() * 4 + 2; unsigned int* signalData = new unsigned int[signalLen]; signalData[0] = IR_FREQ; signalData[1] = 0; for (int i = 0; i < signal.length(); i++) { int idx = i * 4 + 2; char c = signal.charAt(i); signalData[idx] = IR_FREQ; signalData[idx + 1] = 1; signalData[idx + 2] = IR_FREQ; signalData[idx + 3] = (c == '.') ? 1 : 3; } return signalData; } // 解码红外信号 String decodeSignal(unsigned long signalValue) { String signalStr = ""; int signalLen = 0; unsigned int signalData[100]; // 将接收到的红外信号转换为可用的数据格式 for (int i = 31; i >= 0; i--) { int bit = (signalValue >> i) & 1; if (signalLen % 2 == 0) { signalData[signalLen / 2] = bit ? 2250 : 1125; } else { signalData[signalLen / 2] += bit ? 560 : 280; } signalLen++; } // 解码红外信号中的温度值 for (int i = 1; i < signalLen; i += 2) { int bitCount = signalData[i] / IR_FREQ; if (bitCount == 3) { signalStr += "1"; } else { signalStr += "."; } } return signalStr; } ``` 以上代码只是一个简单的示例,您可以根据具体需求进行修改和扩展。同时,建议在实际应用中添加错误处理和异常情况的处理,例如红外信号发送失败、红外信号接收超时等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董董灿是个攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值