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);
    }

}
复制代码

 

posted @   记录——去繁就简  阅读(241)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示