找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4055|回复: 1
收起左侧

单片机无线供电红外遥控旋转LED原理图及程序 实测效果还可以

[复制链接]
ID:260379 发表于 2019-4-15 13:58 | 显示全部楼层 |阅读模式
那个宝的旋转LED 原理图及程序 实测效果还可以

无线供电小板原理图:
0.png
底盒上的红外发光二极管,需对准旋转主板的红外接收管
红外发光二极管点亮后需用摄像头才可看到发光
人眼无法直接看到发光,请勿以为是普通发光二极管,没看到亮起来就丢了
中功率三级管 (要加散热片)
自激震荡电路,把5V直流电压转换成交流电压



0.png
作用:35颗LED独立控制显示,D0电源指示灯不可控
常见问题分析:LED焊接反,虚焊,单片机虚焊都有可能导致该LED不亮,对应处理即可

原理:由次级线圈感应的交流电压经过4个4148全波整流
经过5V1稳压二极管进行5V稳压
220uf电容滤波
作用: 给旋转主板供电
常见问题:4148,5V1,电容焊接反都会导致供电不正常
次级线圈焊接到板上L1处时注意:应该是焊接线圈的不包漆部分

作用:提供时钟信息
常见问题分析:时钟显示不正常:一般是时钟芯片虚焊导致
秒不走动:一般是晶振有问题导致,或者把20pf电容焊成104电容,后背电池接反也会导秒不走
0.png
作用:利用红外对管作起点检测
常见问题分析:焊接反或者没对准红外发射管均会导致不显示的现象
注意:红外接收二极管长脚是负极,短脚是正极

作用:红外一体化接收头接收遥控器按键
常见问题分析:遥控不灵敏可能是焊接时候没平行电路板焊接
无法遥控需先判断是遥控器问题还是接收头问题

作用:CPU控制LED,读取时钟信息,接收遥控,起点检测
常见问题分析:程序无法下载问题:请用TTL串口进行下载,初学者请务必仔细阅读使用说明关于程序下载部分
电源接反有可能导致单片机损坏,请务必注意

单片机源程序如下:
  1. #include "NEW_8051.H"
  2. #include "task.h"
  3. bit new_code;
  4. /*结构体*/      /* 保存一次解码后接收到的四字节数据*/
  5. static struct IR_data    //红外接收的数据结构
  6. {
  7.     unsigned char addr1;     // 地址1(客户码1)
  8.     unsigned char addr2;     // 地址2(客户码2)
  9.     unsigned char data1;     // 数据1(数据码)
  10.     unsigned char data2;     // 数据2(数据码反码)
  11. } IR_DATA;
  12. #define GTime 53               
  13. #define CTime 114               
  14. #define D0MinTime 4  
  15. #define D0MaxTime 9  
  16. #define D1MinTime 11  
  17. #define D1MaxTime 16            
  18. #define TimeOut_cnt 250
  19. /*全局公共变量*/
  20. unsigned char T0_CNT;                // 定时器计数值
  21. unsigned char T0_CNT_bk;           // 计数备份
  22. bit TimeOut;                     // 超时标志
  23. bit Guide;                           // 引导码有效
  24. bit Continuous;                      // 连_发码
  25. unsigned char xdata IR_Time[33]; // 保存每两个下降沿之间的时间间隔
  26. uchar key_code;
  27. /*********************************************************************************************
  28. /*Timer1中断子程序*/
  29. void TR1_Service(void) interrupt 3 using 2
  30. {
  31.     //static unsigned char  T;
  32.   //  T++;
  33.   //  if(T>1)
  34.   //  {
  35.       //  T=0;
  36.         T0_CNT ++;
  37.   //  }
  38.     if(T0_CNT > TimeOut_cnt)
  39.     {
  40.         TimeOut = 1;       // 超时标志
  41.     }
  42. }
  43. /***********************************************************************/
  44. /*解码核心程序*/
  45. void Decode(void)
  46. {
  47.     unsigned char i=0x00,j,k;
  48.     static unsigned char *p;  // 指向结构体IR_DATA.XX的指针
  49.     EX1 = 0;   // 关外部中断1
  50.     /*/////////////////////////进行解码处理////////////////////////*/
  51.     p = &IR_DATA.addr1;
  52.     for(k=0; k<4; k++)
  53.     {
  54.         for(j=0; j<8; j++)
  55.         {
  56.             if((IR_Time[i]>D0MinTime) & (IR_Time[i]<D0MaxTime))
  57.             {
  58.                 *p >>= 1;           // 右移1位,
  59.                 *p &= 0x7f;         // 与0111 1111置0. 数据“0” 0.56ms低电平+0.56ms高电平
  60.             }
  61.             else if((IR_Time[i]>D1MinTime) & (IR_Time[i]<D1MaxTime))
  62.             {
  63.                 *p >>= 1;                // 右移1位,
  64.                 *p |= 0x80;              // 或1000 0000置1. 数据“1” 0.56ms低电平+1.69ms高电平
  65.             }
  66.             i ++;
  67.         }
  68.         p ++;
  69.     }
  70.     if(IR_DATA.data2+IR_DATA.data1==0XFF)
  71.     {
  72.         key_code=IR_DATA.data1;
  73.                 new_code=1;
  74.     }
  75.     else
  76.     {
  77.         key_code=0XFF;   /**非本机遥控器或数据错误**/
  78.     };
  79.     /*/////////////////////////解码处理完毕////////////////////////*/
  80.     EX1 = 1;   // 重新开放外部中断1
  81. }
  82. void serviceINT0(void) interrupt 2 using 1  //{////外部中断1的中断函数。用于红外线读数。
  83. {
  84.     static unsigned char m=0;
  85.         TR1=1;
  86.         
  87.     T0_CNT_bk = T0_CNT;     // 备份时间计数值,即前一个下降沿到本下降沿的时间间隔
  88.     T0_CNT = 0x00;          // 清空时间计数值
  89.     if(TimeOut)             // 如果超时
  90.     {
  91.         //  TL0 = TIMER0_COUNT;     // 初始化定时器0       -0x1f(31)
  92.         TimeOut = 0;        // 清除超时标志
  93.         m = 0;              // 复位数据位
  94.         T0_CNT = 0x00;      // 清空时间计数值
  95.         Guide = 0;          // 清除引导标志
  96.         Continuous = 0;     // 清除连_发标志
  97.     }
  98.     else       // 正常按键时长58.5ms~76.5ms
  99.     {
  100.         if(Guide | Continuous)          // 如果引导码有效
  101.         {
  102.             IR_Time[m++] = T0_CNT_bk;       // 保存时间间隔
  103.             if(m == 32)   // 接收够32数据后
  104.             {
  105.                 m = 0;
  106.                 Guide = 0;    // 清除引导标志
  107.                                  //new_code=1;
  108.                                 TR1=0;
  109.                 /*进行解码操作*/
  110.                 Decode();     // 解码
  111.                                        
  112.             }
  113.         }
  114.         if(T0_CNT_bk > GTime)   // 如果时间间隔>引导码时长
  115.         {
  116.             Guide = 1;          // 使能引导标志
  117.             m = 0;
  118.         };
  119.         if(T0_CNT_bk > CTime)    // 如果时间间隔>连_发码时长
  120.         {
  121.             Continuous = 1;      // 使能连_发标志
  122.             m = 0;
  123.         }
  124.     }//end of 超时
  125. }
复制代码

  1. #include "NEW_8051.H"
  2. #include "task.h"

  3. bit BIT_10MS;

  4. extern void OS_ALLRun(void);
  5. extern void start(void);

  6. /*********************************************************************************************************
  7. ** 函数名称: init
  8. ** 功能描述: 初始化程序,此处包含定时器0、串行口初始化
  9. ** 输  入: 无
  10. ** 输  出: 无
  11. ** 全局变量: 无
  12. ** 调用模块:
  13.   **
  14. ** 作  者:
  15. ** 日  期:
  16. **-------------------------------------------------------------------------------------------------------
  17. ** 修 改 人:
  18. ** 日  期:
  19. **------------------------------------------------------------------------------------------------------
  20. ********************************************************************************************************/
  21. void init()
  22. {
  23.    
  24.         //"系统初始化"
  25.         //IE = 0x00;      //"清除中断"
  26.         EA = 1;                        //总中断
  27.         //ES = 1;         //4"串行中断允许"
  28.         //EX0 = 1;        //0"外部中断0允许"
  29.         //ET0 = 1;        //1"定时器0中断允许"
  30.         //EX1 = 1;        //2"外部中断1允许"
  31.         //ET1 = 1;        //3"定时器1中断允许"
  32.         //ET2 = 1;
  33.         //IP = 0;         //"清除中断优先级"
  34.         //PS = 1;         //"串行中断优先"
  35.         //PX0 = 1;        //"外部中断0"
  36.         //PT0 = 1;        //"定时器中断0"
  37.         //PX1 = 1;        //"外部中断1"
  38.         //PT1 = 0;        //"定时器中断1"
  39.         //TCON--------     "定时器控制寄存器",   TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0
  40.         //TCON = 0;
  41.         //TF1             "T1溢出标志"
  42.         //TR1 = 1;        //"T1运行控制"
  43.         //TF0             "T0溢出标志"
  44.         //TR0 = 1;        //"T0运行控制"
  45.         //IE1             "外部中断1申请标志"
  46.         //IT1 = 1;        //"外部中断1触发方式 0=电平 1=边沿"
  47.         //IE0             "外部中断0申请标志"
  48.         //IT0 = 1;        //"外部中断0触发方式 0=电平 1=边沿"
  49.         //TMOD--------    "定时器模式控制寄存器"
  50.         //  | GATE   | C//T   | M0     | M1    | GATE   | C//T   | M0       | M1        |
  51.         //"高4位用于T1  低4位用于T0"
  52.         //TMOD = 0x21;
  53.         //SCON  "串行控制"
  54.         //| SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI  | RI  |
  55.         //"| SM0  SM1 | 工作方式  |   说    明   |   波 特 率    |"
  56.         //"|   0    0 | 方 式 0   |? 同步移位   |   fosc/12     |"
  57.         //"|   0    1 | 方 式 1   | 10位异步收发 |  定时器控制   |"
  58.         //"|   1    0 | 方 式 2   | 11位异步收发 |fosc/32|fosc/64|"
  59.         //"|   1    1 | 方 式 3   | 11位异步收发 |  定时器控制   |"
  60.         //"SM2 多机通讯允许"
  61.         //"REN 接收允许控制"
  62.         //"TB8 发送数据第9位"
  63.         //"RB8 接收数据第9位"
  64.         //"TI  发送中断标志"
  65.         //"RI  接受中断标志"
  66.         //SCON = 0x50;
  67.         //PCON "电源控制寄存器"
  68.         //SMOD"波特率选择位 =1 方式1,2,3 波特率加倍"
  69.         //"波特率=2^(sod)*fosc/(32*12*(256-初值))"
  70.     //T2CON = 0x0;
  71.     //TR2 = 1;
  72.     //ET2 = 1;
  73. //-----------中斷初始化-------------------------------------------------  BELL
  74. //INT0 init                  
  75. #ifdef EN_OS_INT0
  76.     IT0 = 1;    //外部中断为边沿触发
  77.     EX0 = 1;    //允许外部中断
  78. #endif



  79.   #ifdef EN_OS_INT1
  80. //        PX1 = 1;    //"外部中断1"
  81.     IT1 = 1;    //外部中断为边沿触发
  82.     EX1 = 1;    //允许外部中断
  83.         IP=0X40;
  84.   #endif         
  85.   
  86.    
  87. #ifdef EN_OS_SERIAL
  88.     SCON = 0x50;
  89.     //TMOD|= 0x20;
  90.         BRT           = 0xfb;  //0xfb: 18.432MHz,12T,SMOD=0,9600bps
  91.         AUXR   |= 0x11;        // 使用独立波特率发生器
  92.    /* TH1  = 0xFB;
  93.     TL1  = 0xFB;
  94.     TR1  = 1; */
  95.     ES   = 1;       //允許串口中斷
  96.     PS = 1;         //"串行中断优先"
  97.     PSH;
  98. #endif

  99. #ifdef EN_OS_TIMER0
  100. /****************定时器0初始化****************/
  101.   TMOD|=0X01;
  102.           ET0=1;
  103.         TH0 =0x0FE; //200us
  104.     TL0 =0x0CD;
  105. //        TR0=1;         
  106. #endif
  107. /****************定时器1初始化****************/
  108. #ifdef EN_OS_TIMER1
  109.      TMOD|=0X20;//8位自动重载模式
  110.            ET1=1;  //定时器0开中断
  111.      TH1=0x00;//定时160us 晶振18.432M
  112.      TL1=0x00;
  113.          IPH=0x0C;
  114.          //TR1=1;
  115. #endif
  116. /***************************/
  117. #ifdef EN_OS_UART2         

  118.         S2CON  = 0x50;  //0101,0000 8位可变波特率,无奇偶校验位,允许接收
  119.         BRT           = 0xfb;  //0xfb: 18.432MHz,12T,SMOD=0,9600bps
  120.         AUXR   |= 0x11;  //T0x12,T1x12,UART_M0x6,BRTR,S2SMOD,BRTx12,EXTRAM,S1BRS        
  121.         IE2            = 0x01;        //允许串口2中断,ES2=1
  122. #endif

  123. /***/
  124. #ifdef EN_OS_PCA0  //用于16位定时

  125.     CMOD = 0x80;            //0分频
  126.     CCON = 0x00;   //清中断标志
  127.     CL = 0;
  128.     CH = 0;
  129.         CCAP0H = 0xEF; //40ms定时
  130.     CCAP0L = 0xD8;                                  //        30 200
  131.         CCAPM0 = 0x49; //设置PCA0为16位定时器,允许PCA模块0中断
  132.         //CR=1; //启动PCA计数
  133. #endif
  134. /*******************************************/
  135. #ifdef EN_OS_PCA1          //用于16位定时

  136.     CMOD = 0x8E;            //12分频
  137.         CCON = 0x00;   //清中断标志   
  138.     CL = 0;
  139.     CH = 0;
  140.         CCAP1L =0x26;        //1MS定时
  141.     CCAP1H =0x02;   
  142.         //CCAPM1 = 0x49;  允许PCA模块1中断

  143. #endif
  144. /***********************************************************************/
  145. }
  146. /*********************************************************************************************************
  147. ** 函数名称: main
  148. ** 功能描述: 主函数,用户程序从这里执行
  149. ** 输  入: 无
  150. ……………………

  151. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
综合效果程序.zip (172.71 KB, 下载次数: 40)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:516266 发表于 2019-9-18 15:41 | 显示全部楼层
楼主有没有焊好的实物图?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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