设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 737|回复: 2
收起左侧

STC15系列单片机 实现NEC协议的940nm红外遥控发射任意按键编码+硬件PWM输出38Khz载波

[复制链接]
发表于 2022-7-27 19:28:52 | 显示全部楼层 |阅读模式
1.jpg
晶振频率:9.728Mhz 单片机型号:STC15W408AS
硬件连接:红外发射管:P1.1与VCC,LED:P5.4与VCC
向任意红外遥控家电发送遥控指令,然后执行相应的操作。

  1. #include "STC15.h"                //晶振频率:9.728Mhz
  2. #include "intrins.h"
  3. #define u8 unsigned char
  4. #define u16 unsigned int
  5. #define u32 unsigned long
  6. sbit led_940nm = P1 ^ 1;                //波长 940nm 红外发射管 低电平点亮 (CCP0)
  7. sbit led = P5 ^ 4;                                //发射时点亮,发射后熄灭
  8. void Delay100ms()                //@9.728MHz
  9. {
  10.         unsigned char i, j, k;

  11.         _nop_();
  12.         _nop_();
  13.         i = 4;
  14.         j = 179;
  15.         k = 69;
  16.         do
  17.         {
  18.                 do
  19.                 {
  20.                         while (--k);
  21.                 } while (--j);
  22.         } while (--i);
  23. }

  24. void Delay4500us()                //@9.728MHz
  25. {
  26.         unsigned char i, j;

  27.         i = 43;
  28.         j = 146;
  29.         do
  30.         {
  31.                 while (--j);
  32.         } while (--i);
  33. }
  34. void Delay560us()                //@9.728MHz
  35. {
  36.         unsigned char i, j;

  37.         i = 6;
  38.         j = 73;
  39.         do
  40.         {
  41.                 while (--j);
  42.         } while (--i);
  43. }

  44. void NEC_Send(u16 user, u8 key) {                //发射NEC红外遥控码 参数1:用户码 参数2:按键码
  45.         u8 i,j,k[4];
  46.         led = 0;
  47.         k[0] = user >> 8;
  48.         k[1] = user;
  49.         k[2] = key;
  50.         k[3] = ~key;
  51.         CCAPM0 |= 0x02;
  52.         CR = 1;
  53.         Delay4500us();
  54.         Delay4500us();
  55.         CR = 0;
  56.         Delay4500us();
  57.         for (j = 0; j < 4; j++) {
  58.                 for (i = 0; i < 8; i++) {
  59.                         CR = 1;
  60.                         Delay560us();
  61.                         CR = 0;
  62.                         Delay560us();
  63.                         if (k[j] & (1 << i)) {
  64.                                 Delay560us();
  65.                                 Delay560us();
  66.                         }
  67.                 }
  68.         }
  69.                 //发送停止位
  70.                 CR = 1;
  71.                 Delay560us();
  72.                 CR = 0;
  73.                 Delay560us();

  74.                 CCAPM0 &= ~0x02;
  75.                 led_940nm = 1;
  76.                 led = 1;
  77. }


  78. void main() {
  79.         WDT_CONTR = 0x27;                //开看门狗
  80.         CCON = 0;
  81.         CL = 0;
  82.         CH = 0;
  83.         CMOD = 0x08;                    //设置PCA时钟源,禁止PCA定时器溢出中断,PCA模块0工作于8位PWM
  84.         CCAP0H = CCAP0L = 0x55;         //PWM0的负占空比为33%

  85.         while (1) {
  86.                 NEC_Send(0x866B,0x08);
  87.                 Delay100ms();
  88.                 WDT_CONTR |= 0x10;                //看门狗喂狗
  89.         }
  90. }
复制代码
您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-3-29 19:19 , Processed in 0.635036 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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