51单片机(普中板)红外遥控
1,下降沿触发
现象:按下k3键,Lcd值会增加。
#include <REGX52.H> #include "Delay.h" #include "LCD1602.h" unsigned char number; void main() { LCD_Init(); LCD_ShowString(1,1,"A"); IT0 = 1; //1:下降沿触发(按下触发),0:低电平触发(按着持续触发) IE0 = 0; EX0 = 1; EA = 1; PX0 = 1; //中断优先级 while(1) { LCD_ShowNum(2,1,number,3); } } void Inte0_Rountine(void) interrupt 0 { number++; }
2,IR.c
#include <REGX52.H> #include "Into.h" #include "Timer0.h" unsigned int IR_Time; // 时间 unsigned char IR_State; // unsigned char IR_Data[4]; // 数据存储 unsigned char IR_pData; // 数据位数 unsigned char IR_DataFlag; //状态标志位 unsigned char IR_RepeatFlag; //重发标志位 unsigned char IR_Address; //地址码 unsigned char IR_Command; // void IR_Init() { Timer0_Init(); Int0_Init(); } unsigned char IR_GetDataFlag(void) { if (IR_DataFlag) { IR_DataFlag=0; return 1; } return 0; } unsigned char IR_GetRepeatFlag(void) { if (IR_RepeatFlag) { IR_RepeatFlag=0; return 1; } return 0; } unsigned char IR_GetAddress(void) { return IR_Address; } unsigned char IR_GetCommand(void) { return IR_Command; } void Int0_Routine(void) interrupt 0 { if (IR_State == 0) // 空闲状态 { Timer0_SetCounter(0); Timer0_Run(1); IR_State = 1; } else if(IR_State == 1) { IR_Time = Timer0_GetCounter(); Timer0_SetCounter(0); if (IR_Time > 12442-500 && IR_Time < 12442+500) // start 开始 { IR_State = 2; } else if (IR_Time > 10368-500 && IR_Time < 10368+500) // repeart 连续 { IR_RepeatFlag = 1; Timer0_Run(0); IR_State = 0; // } else { IR_State = 1; //以上都不是重新开始 } } else if(IR_State == 2) // 接受状态 { IR_Time = Timer0_GetCounter(); Timer0_SetCounter(0); // 第一段 if (IR_Time > 1032-500 && IR_Time < 1032+500) { IR_Data[IR_pData/8]&=~(0x01<<(IR_pData%8)); IR_pData ++ ; } // 第二段 else if (IR_Time > 2047-500 && IR_Time < 2047+500) { IR_Data[IR_pData/8]|=(0x01<<(IR_pData%8)); IR_pData ++ ; } // else { IR_State = 1; IR_pData = 0; } if (IR_pData >= 32) { IR_pData = 0; if ((IR_Data[0] == ~IR_Data[1]) && (IR_Data[2] == ~IR_Data[3])) { P2 = 0; IR_Address = IR_Data[0]; IR_Command = IR_Data[2]; IR_DataFlag = 1; } Timer0_Run(0); IR_State = 0; } } }
主函数
#include <REGX52.H> #include "Delay.h" #include "LCD1602.h" #include "IR.h" unsigned char number; unsigned char address; unsigned char command; void main() { LCD_Init(); LCD_ShowString(1,1,"A"); IR_Init(); while(1) { address = IR_GetAddress(); command = IR_GetCommand(); LCD_ShowHexNum(2, 1, address, 2); LCD_ShowHexNum(2, 5, command, 2); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?