• 2024/4/25 红外遥控代码


    51完结撒花!!!

    这块如果IR听不懂可以看看那个状态机的相关视频。

    Int0.c 

    1. #include <REGX52.H>
    2. void Int0_Init(void)
    3. {
    4. IT0=1;
    5. IE0=0;
    6. EX0=1;
    7. EA=1;
    8. PX0=1;
    9. }
    10. //void Int0_Routine(void) interrupt 0
    11. //{
    12. // Num++;
    13. //}

    Timer0.c 

    1. #include <REGX52.H>
    2. /**
    3. * @brief 定时器0初始化,1毫秒@12.000MHz
    4. * @param 无
    5. * @retval 无
    6. */
    7. void Timer0_Init(void) //10us
    8. {
    9. TMOD &= 0xF0; //设置定时器模式
    10. TMOD |= 0x01; //设置定时器模式
    11. TL0 = 0xA4; //设置定时初值
    12. TH0 = 0xFF; //设置定时初值
    13. TF0 = 0; //清除TF0标志
    14. TR0 = 1; //定时器0不计时
    15. }
    16. void Timer0SetCounter(unsigned int Value)//把传过来的十六位数据拆成两个八位存进寄存器,设置初始值(要拆掉才能存)
    17. {
    18. TH0=Value/256;
    19. TL0=Value%256;
    20. }
    21. unsigned int Timer0_GetCounter(void)//把定时器里变化后的数据拿出来,得到时间差
    22. {
    23. return (TH0<<8)|TL0;
    24. }
    25. void Timer0_Run(unsigned char Flag)//主函数里启动定时器的开关
    26. {
    27. TR0=Flag;
    28. }

    IR.c 

    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. void IR_Init(void)
    13. {
    14. Timer0_Init();
    15. Int0_Init();
    16. }
    17. unsigned char IR_GetDataFlag(void)
    18. {
    19. if(IR_DataFlag)
    20. {
    21. IR_DataFlag=0;
    22. return 1;
    23. }
    24. return 0;
    25. }
    26. unsigned char IR_GetRepeatFlag(void)
    27. {
    28. if(IR_RepeatFlag)
    29. {
    30. IR_RepeatFlag=0;
    31. return 1;
    32. }
    33. return 0;
    34. }
    35. unsigned char IR_GetAddress(void)
    36. {
    37. return IR_Address;
    38. }
    39. unsigned char IR_GetCommand(void)
    40. {
    41. return IR_Command;
    42. }
    43. void Int0_Routine(void) interrupt 0
    44. {
    45. if(IR_State==0)
    46. {
    47. Timer0SetCounter(0);
    48. Timer0_Run(1);
    49. IR_State=1;
    50. }
    51. else if(IR_State==1)
    52. {
    53. IR_Time=Timer0_GetCounter();
    54. Timer0SetCounter(0);
    55. if(IR_Time>12442-500&&IR_Time<12442+500)
    56. {
    57. IR_State=2;
    58. }
    59. else if(IR_Time>10368-500&&IR_Time<10368+500)
    60. {
    61. IR_RepeatFlag=1;
    62. Timer0_Run(0);
    63. IR_State=0;
    64. }
    65. else
    66. {
    67. IR_State=1;
    68. }
    69. }
    70. else if(IR_State==2)
    71. {
    72. IR_Time=Timer0_GetCounter();
    73. Timer0SetCounter(0);
    74. if(IR_Time>1032-500&&IR_Time<1032+500)
    75. {
    76. IR_Data[IR_pData/8]&=~(0x01<<(IR_pData%8));
    77. IR_pData++;
    78. }
    79. else if(IR_Time>2074-500&&IR_Time<2074+500)
    80. {
    81. IR_Data[IR_pData/8]|=(0x01<<(IR_pData%8));
    82. IR_pData++;
    83. }
    84. else
    85. {
    86. IR_pData=0;
    87. IR_State=1;
    88. }
    89. if(IR_pData>=32)
    90. {
    91. IR_pData=0;
    92. if((IR_Data[0]==~IR_Data[1])&&(IR_Data[2]==~IR_Data[3]))
    93. {
    94. IR_Address=IR_Data[0];
    95. IR_Command=IR_Data[2];
    96. IR_DataFlag=1;
    97. }
    98. Timer0_Run(0);
    99. IR_State=0;
    100. }
    101. }
    102. }

    main.c 

    1. #include <REGX52.H>
    2. #include "LCD1602.h"
    3. #include "Delay.h"
    4. #include "IR.h"
    5. unsigned int Num;
    6. unsigned char Address;
    7. unsigned char Command;
    8. void main()
    9. {
    10. LCD_Init();
    11. LCD_ShowString(1,1,"ADDR CMD NUM");
    12. LCD_ShowString(2,1,"00 00 000");
    13. IR_Init();
    14. while(1)
    15. {
    16. if(IR_GetDataFlag()|| IR_GetRepeatFlag())
    17. {
    18. Address=IR_GetAddress();
    19. Command=IR_GetCommand();
    20. LCD_ShowHexNum(2,1,Address,2);
    21. LCD_ShowHexNum(2,7,Command,2);
    22. if(Command==IR_VOL_MINUS)
    23. {
    24. Num--;
    25. }
    26. if(Command==IR_VOL_ADD)
    27. {
    28. Num++;
    29. }
    30. LCD_ShowNum(2,12,Num,3);
    31. }
    32. }
    33. }

     

     

     

  • 相关阅读:
    RoboRAVE世界机器人大会亚洲分会toio™专项挑战顺利收官,toio™实现“双首次”突破
    BI设计上篇 - 像设计师一样思考
    多环境与多数据源切换
    2022年中科大细胞生物学实验原理往年题复习参考
    Linux查看磁盘命令df-h详解
    BCG 对话框窗口控件自适应CBCGPStaticLayout
    设计一个支持多版本的APP的后端服务
    基于SpringBoot实现Api接口幂等性的几种方式
    Linux的权限管理操作(权限设置chmod、属主chown与所组设置chgrp)
    【CVPR2022】VizWiz-VQA Grounding Challenge冠军算法介绍--Aurora
  • 原文地址:https://blog.csdn.net/2301_80023141/article/details/138201920