久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 單片機紅外解碼仿真工作,為什么實際電路不工作? [打印本頁]

作者: 芙蓉焊料    時間: 2023-12-24 10:51
標題: 單片機紅外解碼仿真工作,為什么實際電路不工作?
請教:借用論壇大神的紅外解碼程序仿真時工作正常,為什么實際電路就不能解碼呢?電路功能是接收遙控器0號鍵 ox19 操作碼,++后數碼管顯示1-24。請幫我分析一下,多謝!





單片機源程序如下:
  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. }
復制代碼


作者: 芙蓉焊料    時間: 2023-12-24 13:54
別沉啊,求解!
作者: 人工置頂員    時間: 2023-12-25 01:31
頂一下
作者: wufa1986    時間: 2023-12-25 08:07
這很正常,你不能保證你的硬件一定焊接沒有問題,同時注意STC很多型號默認不用晶振,這就是電子比IT難學的原因,沒個3-5年經驗很難解決實際問題
作者: 芙蓉焊料    時間: 2023-12-25 17:54
問題是不是出在如下程序段?我用的單片機是STC89C52RC

作者: lkc8210    時間: 2023-12-25 21:54
你確定你的按鍵鍵值是0xFD?
作者: rayin    時間: 2023-12-26 07:56
紅外線對時序要求比較嚴格, 除程序跑對還要保證晶振時脈是不是符合通用紅外協議的時序. 可以用示波器,和邏輯分析儀看下接收時序是不是正確的.
作者: 芙蓉焊料    時間: 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可以解碼
百思不得其解了!!!
作者: cba_cba    時間: 2024-5-6 16:40
這個要放在定時器中斷中去解碼,才可以的。




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 99久久婷婷国产综合精品电影 | 国产精品99久久久久久宅男 | 精品视频一区二区 | 久久精品色视频 | www.9191| 国产精品综合网 | 日韩欧美在线精品 | 日日av| 91热在线 | 国产一区久久久 | 亚洲精品在线视频 | 国产成人精品午夜视频免费 | 超碰在线人人干 | 黄色高清视频 | 国内精品久久久久久久 | 国产一区二区电影 | 免费看淫片 | 国产成人精品一区二区三 | 综合在线视频 | 一区在线播放 | 午夜欧美一区二区三区在线播放 | 久久久久久91 | a在线免费观看视频 | 国产一区在线免费 | 国产欧美一区二区三区在线看 | 日本一区二区三区免费观看 | 欧美综合国产精品久久丁香 | 久久99精品国产麻豆婷婷 | 狠狠插天天干 | 国产精品乱码一区二三区小蝌蚪 | a欧美| 三级免费av | 国产精品亚洲片在线播放 | 成人在线观看免费 | 久在线精品视频 | 国产精品久久久久一区二区三区 | 精品一区二区三区四区视频 | 在线中文字幕视频 | 欧美日韩综合精品 | 欧美v日韩v | 免费在线观看成人av |