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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1634|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲乱码一区二区 | 精品自拍视频在线观看 | 在线观看精品视频网站 | 久久88| 中文字幕亚洲无线 | 亚洲精品高清视频 | 91视频正在播放 | 久久久久久久久久久国产 | 午夜av在线 | 午夜电影在线播放 | 最新中文字幕在线 | 看羞羞视频 | 久久亚洲欧美日韩精品专区 | 日韩国产高清在线观看 | 亚洲一区二区在线视频 | 久久精品欧美一区二区三区麻豆 | 久久久久国产精品一区二区 | 亚洲狠狠爱一区二区三区 | 亚洲精品电影网在线观看 | 久久久www成人免费无遮挡大片 | 中文av字幕| 91久久久久久久久久久久久 | 国产精品成人在线 | 亚洲成人一二三 | 99精品久久99久久久久 | 国产精品九九 | 日韩视频在线免费观看 | 久久综合av | 精品国产精品三级精品av网址 | 不卡在线视频 | 国产黄色在线观看 | 日韩精品区 | 日本手机在线 | 国产精品久久免费观看 | 久久久精品一区二区三区 | 国产一伦一伦一伦 | 欧美综合久久 | 在线视频亚洲 | 国产欧美一区二区精品久导航 | 男女爱爱福利视频 | 6080亚洲精品一区二区 |