找回密码
 立即注册
查看: 45|回复: 2

17-1 红外遥控,江协科技讲普中51单片机开发板STC89C52学习板 配套程序, A2标准版

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:80
  • 最近打卡:2026-07-23 09:36:34
已绑定手机

231

主题

172

回帖

1081

积分

版主

积分
1081
发表于 2026-7-13 13:42:12 | 显示全部楼层 |阅读模式

17-1 红外遥控,江协科技讲普中51单片机开发板STC89C52学习板 配套程序, A2标准版
主程序main.C代码如下:

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "IR.h"

unsigned char Num;
unsigned char Address;
unsigned char Command;

void main()
{
        LCD_Init();
        LCD_ShowString(1,1,"ADDR  CMD  NUM");
        LCD_ShowString(2,1,"00    00   000");
       
        IR_Init();
       
        while(1)
        {
                if(IR_GetDataFlag() || IR_GetRepeatFlag())        //如果收到数据帧或者收到连发帧
                {
                        Address=IR_GetAddress();                //获取遥控器地址码
                        Command=IR_GetCommand();                //获取遥控器命令码
                       
                        LCD_ShowHexNum(2,1,Address,2);        //显示遥控器地址码
                        LCD_ShowHexNum(2,7,Command,2);        //显示遥控器命令码
                       
                        if(Command==IR_VOL_MINUS)                //如果遥控器VOL-按键按下
                        {
                                Num--;                                                //Num自减
                        }
                        if(Command==IR_VOL_ADD)                        //如果遥控器VOL+按键按下
                        {
                                Num++;                                                //Num自增
                        }
                       
                        LCD_ShowNum(2,12,Num,3);                //显示Num
                }
        }
}




17-1 红外遥控(11.0592MHz晶振).zip

58.39 KB, 下载次数: 1

回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:80
  • 最近打卡:2026-07-23 09:36:34
已绑定手机

231

主题

172

回帖

1081

积分

版主

积分
1081
发表于 2026-7-13 13:42:49 | 显示全部楼层
17-1 红外遥控,江协科技讲普中51单片机开发板STC89C52学习板 配套程序, A2标准版
IR.C代码如下:

#include <REGX52.H>
#include "Timer0.h"
#include "Int0.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;

/**
  * @brief  红外遥控初始化
  * @param  无
  * @retval 无
  */
void IR_Init(void)
{
        Timer0_Init();
        Int0_Init();
}

/**
  * @brief  红外遥控获取收到数据帧标志位
  * @param  无
  * @retval 是否收到数据帧,1为收到,0为未收到
  */
unsigned char IR_GetDataFlag(void)
{
        if(IR_DataFlag)
        {
                IR_DataFlag=0;
                return 1;
        }
        return 0;
}

/**
  * @brief  红外遥控获取收到连发帧标志位
  * @param  无
  * @retval 是否收到连发帧,1为收到,0为未收到
  */
unsigned char IR_GetRepeatFlag(void)
{
        if(IR_RepeatFlag)
        {
                IR_RepeatFlag=0;
                return 1;
        }
        return 0;
}

/**
  * @brief  红外遥控获取收到的地址数据
  * @param  无
  * @retval 收到的地址数据
  */
unsigned char IR_GetAddress(void)
{
        return IR_Address;
}

/**
  * @brief  红外遥控获取收到的命令数据
  * @param  无
  * @retval 收到的命令数据
  */
unsigned char IR_GetCommand(void)
{
        return IR_Command;
}

//外部中断0中断函数,下降沿触发执行
void Int0_Routine(void) interrupt 0
{
        if(IR_State==0)                                //状态0,空闲状态
        {
                Timer0_SetCounter(0);        //定时计数器清0
                Timer0_Run(1);                        //定时器启动
                IR_State=1;                                //置状态为1
        }
        else if(IR_State==1)                //状态1,等待Start信号或Repeat信号
        {
                IR_Time=Timer0_GetCounter();        //获取上一次中断到此次中断的时间
                Timer0_SetCounter(0);        //定时计数器清0
                //如果计时为13.5ms,则接收到了Start信号(判定值在12MHz晶振下为13500,在11.0592MHz晶振下为12442)
                if(IR_Time>13500-500 && IR_Time<13500+500)
                {
                        IR_State=2;                        //置状态为2
                }
                //如果计时为11.25ms,则接收到了Repeat信号(判定值在12MHz晶振下为11250,在11.0592MHz晶振下为10368)
                else if(IR_Time>11250-500 && IR_Time<11250+500)
                {
                        IR_RepeatFlag=1;        //置收到连发帧标志位为1
                        Timer0_Run(0);                //定时器停止
                        IR_State=0;                        //置状态为0
                }
                else                                        //接收出错
                {
                        IR_State=1;                        //置状态为1
                }
        }
        else if(IR_State==2)                //状态2,接收数据
        {
                IR_Time=Timer0_GetCounter();        //获取上一次中断到此次中断的时间
                Timer0_SetCounter(0);        //定时计数器清0
                //如果计时为1120us,则接收到了数据0(判定值在12MHz晶振下为1120,在11.0592MHz晶振下为1032)
                if(IR_Time>1120-500 && IR_Time<1120+500)
                {
                        IR_Data[IR_pData/8]&=~(0x01<<(IR_pData%8));        //数据对应位清0
                        IR_pData++;                        //数据位置指针自增
                }
                //如果计时为2250us,则接收到了数据1(判定值在12MHz晶振下为2250,在11.0592MHz晶振下为2074)
                else if(IR_Time>2250-500 && IR_Time<2250+500)
                {
                        IR_Data[IR_pData/8]|=(0x01<<(IR_pData%8));        //数据对应位置1
                        IR_pData++;                        //数据位置指针自增
                }
                else                                        //接收出错
                {
                        IR_pData=0;                        //数据位置指针清0
                        IR_State=1;                        //置状态为1
                }
                if(IR_pData>=32)                //如果接收到了32位数据
                {
                        IR_pData=0;                        //数据位置指针清0
                        if((IR_Data[0]==~IR_Data[1]) && (IR_Data[2]==~IR_Data[3]))        //数据验证
                        {
                                IR_Address=IR_Data[0];        //转存数据
                                IR_Command=IR_Data[2];
                                IR_DataFlag=1;        //置收到连发帧标志位为1
                        }
                        Timer0_Run(0);                //定时器停止
                        IR_State=0;                        //置状态为0
                }
        }
}


回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:80
  • 最近打卡:2026-07-23 09:36:34
已绑定手机

231

主题

172

回帖

1081

积分

版主

积分
1081
发表于 2026-7-13 13:43:36 | 显示全部楼层
17-1 红外遥控,江协科技讲普中51单片机开发板STC89C52学习板 配套程序, A2标准版
Int0.C代码如下:

#include <REGX52.H>

/**
  * @brief  外部中断0初始化
  * @param  无
  * @retval 无
  */
void Int0_Init(void)
{
        IT0=1;
        IE0=0;
        EX0=1;
        EA=1;
        PX0=1;
}

/*外部中断0中断函数模板
void Int0_Routine(void) interrupt 0
{
       
}
*/


回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-24 05:53 , Processed in 0.069681 second(s), 50 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表