找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 831|回复: 8
收起左侧

单片机红外解码仿真工作,为什么实际电路不工作?

[复制链接]
ID:891876 发表于 2023-12-24 10:51 | 显示全部楼层 |阅读模式
请教:借用论坛大神的红外解码程序仿真时工作正常,为什么实际电路就不能解码呢?电路功能是接收遥控器0号键 ox19 操作码,++后数码管显示1-24。请帮我分析一下,多谢!

456.JPG

457.jpg

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include"Delay.h"
  4. #define uchar unsigned char   
  5. #define uint  unsigned int  

  6. uchar code duan[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳段码0-9
  7. uchar xshc[2];   //数码管缓存
  8. uchar time_a = 1;
  9. uchar tem_ms=0;  //ms
  10. uchar tem_s=0;   //秒
  11. uint tem_min=0;  //分
  12. uint        X_min=1;   //时间比较
  13. uchar aa=0;
  14. uchar        N[4];                                 //识别码,操作码存放

  15. sbit   IR = P3^2;  //红外接收端、外部中断0
  16. sbit wei0 = P2^0;  //时间个位
  17. sbit wei1 = P2^1;  //时间十位
  18. sbit wei2 = P2^2;  //温度小数点后第一位
  19. sbit wei3 = P2^3;  //温度个位
  20. sbit wei4 = P2^4;  //温度十位
  21. sbit  LED = P1^0;  //定时工作指示

  22. bit DispEN = 0;

  23. #define FSOC 12000000UL
  24. #define Hz 200
  25. void Timer1Init(void)
  26. {
  27.     TMOD &= 0x0F;
  28.     TMOD |= 0x10;
  29.         TL1 = -(FSOC/12/Hz);
  30.         TH1 = -(FSOC/12/Hz)>>8;
  31.     TF1 = 0;
  32.     TR1 = 1;
  33. }
  34. void timer1_int (void) interrupt 3
  35. {
  36.         static uint DispDelay = 0;
  37.         TL1 = -(FSOC/12/Hz);
  38.         TH1 = -(FSOC/12/Hz)>>8;
  39.         if(DispEN)
  40.         {
  41.                 if(++DispDelay>=200)
  42.                 {
  43.                         DispDelay = 0;
  44.                         DispEN = 0;
  45.                 }
  46.         }
  47. }
  48. bit IR_Done = 0;
  49. union {
  50.         uchar THTL[2];
  51.         uint TIME;
  52. }U_THTL[33];
  53. void Timer2Init(void)
  54. {
  55.         EXF2 = 0;
  56.         EXEN2 = 1;
  57.         CP_RL2 = 1;
  58. }
  59. void timer2_int() interrupt 5
  60. {
  61.         static uchar i = 0;
  62.         if(TF2)
  63.     {
  64.                 TF2 = 0;
  65.                 TR2 = 0;
  66.         }
  67.         if(EXF2)
  68.     {
  69.                 EXF2 = 0;
  70.                 if(!TR2)
  71.                 {
  72.                         TL2 = 0;
  73.                         TH2 = 0;
  74.                         TR2 = 1;
  75.                         i = 0;
  76.                 }else{
  77.                         U_THTL[i].THTL[0] = RCAP2H;
  78.                         U_THTL[i].THTL[1] = RCAP2L;
  79.                         TL2 = 0;
  80.                         TH2 = 0;
  81.                         if(++i>=33)
  82.                         {
  83.                                 i=0;
  84.                                 IR_Done = 1;
  85.                         }
  86.                 }
  87.         }        
  88. }

  89. /*---------------时间+-----------------*/
  90. void sj()
  91. {
  92.           uint tem;      
  93.           tem = time_a;
  94.                 X_min=(tem*1); //显示值*60分钟
  95.         if(time_a>24)     //0-24键值
  96.                  {
  97.                          time_a=1;
  98.                  }
  99.         if(X_min==tem_min) //时间到
  100.         {
  101.                         P1++;
  102.                 tem_min=0;
  103.         }
  104. }

  105. /*---------------时基-----------------*/
  106. void Timer0Init()                //50毫秒@12.000MHz
  107. {
  108.         TMOD |= 0x01;                //设置定时器模式
  109.         TL0 = 0xB0;                //设置定时初始值
  110.         TH0 = 0x3C;                //设置定时初始值
  111.         TF0 = 0;                //清除TF0标志
  112.         ET0 = 1;
  113.         TR0 = 1;                //定时器0开始计时
  114.         EA  = 1;
  115. }
  116. void Timer0_Rountiue() interrupt 1 //T0中断程序
  117. {
  118.          TL0 = 0xB0;                //重装初始值
  119.          TH0 = 0x3C;                //重装初始值
  120.          tem_ms++;      //毫秒
  121.         if(tem_ms==20)
  122.           {
  123.                   
  124.                         tem_s++;    //秒
  125.                   tem_ms=0;
  126.                   LED=~LED;
  127.           }
  128.         if(tem_s==60)
  129.           {
  130.                         tem_min++;  //分
  131.                   tem_s=0;
  132.           }
  133.                 if(tem_min>1400) //24H
  134.                 {
  135.                         tem_min=0;
  136.                 }  
  137. }

  138. /*------------数码管显示--------------*/
  139. void smg_xs()
  140. {
  141.           xshc[0]=time_a/10;
  142.           xshc[1]=time_a%10;
  143.           P0=duan[xshc[1]];    //显示送P0
  144.           wei0=0;
  145.           Delay(1);
  146.           wei0=1;      //消影
  147.           P0=duan[xshc[0]];
  148.                 wei1=0;
  149.           Delay(1);
  150.           wei1=1;
  151. }

  152. void main()
  153. {
  154.         Timer0Init();
  155.         Timer1Init();
  156.         Timer2Init();
  157.         ET1 = 1;
  158.         ET2 = 1;
  159.         EA = 1;
  160.     while (1)
  161.     {
  162.        smg_xs();
  163.                          sj();
  164.                         if(IR_Done)
  165.                 {
  166.                          uchar i;
  167.                          uint Temp[2];
  168.                          IR_Done = 0;
  169.                         for(i=1;i<33;i++)
  170.                         {
  171.                                 Temp[(i-1)/16]<<=1;
  172.                         if(U_THTL[i].TIME>0x0648)
  173.                                 {
  174.                             Temp[(i-1)/16] |= 0x0001;
  175.                                 }
  176.                                  
  177.                         }
  178.         //Temp[1]>>12 & 0x0F;
  179.                           //Temp[1]>>8 & 0x0F;
  180.                           //Temp[1]>>4 & 0x0F;
  181.                           //Temp[1] & 0x0F;
  182.                         DispEN = 1;
  183.                           
  184.                         aa = Temp[1];
  185.                  if(aa==0xfd)
  186.                          {
  187.                                 time_a++;
  188.                          }
  189.                           
  190.                  }
  191.                         
  192.     }
  193. }
复制代码

回复

使用道具 举报

ID:891876 发表于 2023-12-24 13:54 | 显示全部楼层
别沉啊,求解!
回复

使用道具 举报

ID:301191 发表于 2023-12-25 01:31 | 显示全部楼层
顶一下
回复

使用道具 举报

ID:879348 发表于 2023-12-25 08:07 | 显示全部楼层
这很正常,你不能保证你的硬件一定焊接没有问题,同时注意STC很多型号默认不用晶振,这就是电子比IT难学的原因,没个3-5年经验很难解决实际问题
回复

使用道具 举报

ID:891876 发表于 2023-12-25 17:54 | 显示全部楼层
问题是不是出在如下程序段?我用的单片机是STC89C52RC
99.JPG
回复

使用道具 举报

ID:161164 发表于 2023-12-25 21:54 | 显示全部楼层
你确定你的按键键值是0xFD?
回复

使用道具 举报

ID:517951 发表于 2023-12-26 07:56 | 显示全部楼层
红外线对时序要求比较严格, 除程序跑对还要保证晶振时脉是不是符合通用红外协议的时序. 可以用示波器,和逻辑分析仪看下接收时序是不是正确的.
回复

使用道具 举报

ID:891876 发表于 2023-12-26 08:53 | 显示全部楼层
lkc8210 发表于 2023-12-25 21:54
你确定你的按键键值是0xFD?

您好
程序if(aa==0xfd)时,实际电路(5)号键=0x40可以解码
程序if(aa==0x57)时,实际电路(8)号键=0x15可以解码 :以此类推
程序if(aa==0x67)时,实际电路(0)号键=0x19可以解码
百思不得其解了!!!
回复

使用道具 举报

ID:336378 发表于 2024-5-6 16:40 | 显示全部楼层
这个要放在定时器中断中去解码,才可以的。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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