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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1574|回復: 4
打印 上一主題 下一主題
收起左側

51單片機紅外解碼不成功,附程序

[復制鏈接]
跳轉到指定樓層
樓主
有沒有大佬能幫忙看看這個紅外遙控解碼程序問題在哪,不知道為什么解碼總是不成功

單片機源程序如下:
  1. #include <REGX52.H>
  2. #include "Timer0.h"
  3. #include "Int0.h"

  4. unsigned int IR_Time;
  5. unsigned char IR_State;

  6. unsigned char IR_Data[4];
  7. unsigned char IR_pData;

  8. unsigned char IR_DataFlag;
  9. unsigned char IR_RepeatFlag;
  10. unsigned char IR_Address;
  11. unsigned char IR_Command;

  12. /**
  13.   * @brief  紅外遙控初始化
  14.   * @param  無
  15.   * @retval 無
  16.   */
  17. void IR_Init(void)
  18. {
  19.         Timer0_Init();
  20.         Int0_Init();
  21. }

  22. /**
  23.   * @brief  紅外遙控獲取收到數據幀標志位
  24.   * @param  無
  25.   * @retval 是否收到數據幀,1為收到,0為未收到
  26.   */
  27. unsigned char IR_GetDataFlag(void)
  28. {
  29.         if(IR_DataFlag)
  30.         {
  31.                 IR_DataFlag=0;
  32.                 return 1;
  33.         }
  34.         return 0;
  35. }

  36. /**
  37.   * @brief  紅外遙控獲取收到連發幀標志位
  38.   * @param  無
  39.   * @retval 是否收到連發幀,1為收到,0為未收到
  40.   */
  41. unsigned char IR_GetRepeatFlag(void)
  42. {
  43.         if(IR_RepeatFlag)
  44.         {
  45.                 IR_RepeatFlag=0;
  46.                 return 1;
  47.         }
  48.         return 0;
  49. }

  50. /**
  51.   * @brief  紅外遙控獲取收到的地址數據
  52.   * @param  無
  53.   * @retval 收到的地址數據
  54.   */
  55. unsigned char IR_GetAddress(void)
  56. {
  57.         return IR_Address;
  58. }

  59. /**
  60.   * @brief  紅外遙控獲取收到的命令數據
  61.   * @param  無
  62.   * @retval 收到的命令數據
  63.   */
  64. unsigned char IR_GetCommand(void)
  65. {
  66.         return IR_Command;
  67. }

  68. //外部中斷0中斷函數,下降沿觸發執行
  69. void Int0_Routine(void) interrupt 0
  70. {
  71.         if(IR_State==0)                                //狀態0,空閑狀態
  72.         {
  73.                 Timer0_SetCounter(0);        //定時計數器清0
  74.                 Timer0_Run(1);                        //定時器啟動
  75.                 IR_State=1;                                //置狀態為1
  76.         }
  77.         else if(IR_State==1)                //狀態1,等待Start信號或Repeat信號
  78.         {
  79.                 IR_Time=Timer0_GetCounter();        //獲取上一次中斷到此次中斷的時間
  80.                 Timer0_SetCounter(0);        //定時計數器清0
  81.                 //如果計時為13.5ms,則接收到了Start信號(判定值在12MHz晶振下為13500,在11.0592MHz晶振下為12442)
  82.                 if(IR_Time>13500-500 && IR_Time<13500+500)
  83.                 {
  84.                         IR_State=2;                        //置狀態為2
  85.                 }
  86.                 //如果計時為11.25ms,則接收到了Repeat信號(判定值在12MHz晶振下為11250,在11.0592MHz晶振下為10368)
  87.                 else if(IR_Time>11250-500 && IR_Time<11250+500)
  88.                 {
  89.                         IR_RepeatFlag=1;        //置收到連發幀標志位為1
  90.                         Timer0_Run(0);                //定時器停止
  91.                         IR_State=0;                        //置狀態為0
  92.                 }
  93.                 else                                        //接收出錯
  94.                 {
  95.                         IR_State=1;                        //置狀態為1
  96.                 }
  97.         }
  98.         else if(IR_State==2)                //狀態2,接收數據
  99.         {
  100.                 IR_Time=Timer0_GetCounter();        //獲取上一次中斷到此次中斷的時間
  101.                 Timer0_SetCounter(0);        //定時計數器清0
  102.                 //如果計時為1120us,則接收到了數據0(判定值在12MHz晶振下為1120,在11.0592MHz晶振下為1032)
  103.                 if(IR_Time>1120-500 && IR_Time<1120+500)
  104.                 {
  105.                         IR_Data[IR_pData/8]&=~(0x01<<(IR_pData%8));        //數據對應位清0
  106.                         IR_pData++;                        //數據位置指針自增
  107.                 }
  108.                 //如果計時為2250us,則接收到了數據1(判定值在12MHz晶振下為2250,在11.0592MHz晶振下為2074)
  109.                 else if(IR_Time>2250-500 && IR_Time<2250+500)
  110.                 {
  111.                         IR_Data[IR_pData/8]|=(0x01<<(IR_pData%8));        //數據對應位置1
  112.                         IR_pData++;                        //數據位置指針自增
  113.                 }
  114.                 else                                        //接收出錯
  115.                 {
  116.                         IR_pData=0;                        //數據位置指針清0
  117.                         IR_State=1;                        //置狀態為1
  118.                 }
  119.                 if(IR_pData>=32)                //如果接收到了32位數據
  120.                 {
  121.                         IR_pData=0;                        //數據位置指針清0
  122.                         if((IR_Data[0]==~IR_Data[1]) && (IR_Data[2]==~IR_Data[3]))        //數據驗證
  123.                         {
  124.                                 IR_Address=IR_Data[0];        //轉存數據
  125.                                 IR_Command=IR_Data[2];
  126.                                 IR_DataFlag=1;        //置收到連發幀標志位為1
  127.                         }
  128.                         Timer0_Run(0);                //定時器停止
  129.                         IR_State=0;                        //置狀態為0
  130.                 }
  131.         }
  132. }
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1001489 發表于 2023-12-7 18:42 | 只看該作者
  1. #include "regx52.h"
  2. #include "lcd1602.h"
  3. #include "delay.h"
  4. #include "ir.h"

  5. unsigned char Num,Address,Command;
  6. void main()
  7. {
  8.         LCD_Init();
  9.         LCD_ShowString(1,1,"a");
  10.         IR_Init();
  11.        
  12.   while(1)
  13.   {
  14.                 if(IR_GetDataFlag())
  15.                 {
  16.                         Address=IR_GetAddress();
  17.                         Command=IR_GetCommand();
  18.                 }
  19.                 LCD_ShowHexNum(2,1,Address,2);
  20.                 LCD_ShowHexNum(2,5,Command,2);
  21.   }
  22. }
復制代碼
回復

使用道具 舉報

板凳
ID:507029 發表于 2023-12-7 22:15 | 只看該作者

可以用一個IO口輸出接收到的編碼脈沖,再用示波器或邏輯分析儀看一下接收到的脈寬是否與發送的脈寬一致。
回復

使用道具 舉報

地板
ID:327265 發表于 2023-12-9 23:15 | 只看該作者
借助邏輯分析儀查看,定位問題再解決
回復

使用道具 舉報

5#
ID:1095802 發表于 2023-12-10 16:39 | 只看該作者
  if(IR_pData>32)                //如果接收到了32位數據
你看下是不是這里有問題,你沒有存起始碼怎么會有33位數據
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人免费视频网站在线看 | 精品国产一区久久 | 成人精品一区二区 | 久久成人免费 | 日日摸日日碰夜夜爽2015电影 | 成人免费小视频 | 国产精品精品久久久 | 99在线免费视频 | 91精品久久久久久久久中文字幕 | 亚洲国产精品一区二区三区 | 久久天天躁狠狠躁夜夜躁2014 | 精品亚洲一区二区 | 精品久久久久久久久久久久久久久久久 | 91精品国产91久久久久久吃药 | av日日操 | 精品欧美一区二区在线观看 | 成人在线视频网 | 欧美视频一区 | 免费成人高清在线视频 | 国产精品成人国产乱一区 | 久久在线视频 | 国产精品自拍av | 在线观看视频一区 | 国产一区中文字幕 | 在线观看 亚洲 | 又爽又黄axxx片免费观看 | 国产高清视频在线 | 在线观看av网站 | 成人在线免费观看 | 国产一区2区 | 超碰伊人久久 | 午夜丰满少妇一级毛片 | 亚洲成网站 | 亚洲一区二区三区四区在线观看 | 国产专区在线 | 久久国产精品一区二区三区 | 国产97在线 | 日韩 | 成人三级视频 | 亚洲一区二区三区在线播放 | 国产激情偷乱视频一区二区三区 | 午夜爽爽男女免费观看hd |