串口返回红外键值

本文介绍了一个基于51单片机的红外遥控接收程序实现细节。该程序利用定时器0进行中断计数,并通过外部中断0捕捉信号。通过对红外信号的解析,将接收到的数据转换为字符并发送到串口。文章详细展示了初始化过程、中断服务程序及主循环处理逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <reg52.h>
#include <intrins.h>
#include "./delay/delay.h"

unsigned int irtime;
bit start_flag = 0;
bit irok = 0;
unsigned char irdata[33];
unsigned char bitnum = 0;

void time0_init()
{
    EA = 1;
    TMOD |= 0x02;
    TH0 = 0;
    ET0 = 1;  //可以进入中断
    TR0 = 1;  //开始计数    
}

void int0_init()
{
    IT0 = 1;  //设置外部中断的触发方式,下降沿触发
    EA = 1;  //打开总中断
    EX0 = 1;  //打开外部中断0
}

void timer0_isr() interrupt 1
{
    irtime++;
}

void int0_isr() interrupt 0  //打开中断服务程序
{
    if(start_flag)
    {
        if((irtime >= 40) && (irtime <= 60))
        {
            bitnum = 0;
        }
        irdata[bitnum] = irtime + '0';
        bitnum++;
        irtime = 0;
        if(bitnum == 33)
        {
            irok = 1;
            irdata[33] = '\0';
            bitnum = 0;
            start_flag = 0;
        }
    }
    else
    {
        irtime = 0;
        start_flag = 1;
    }
    //irtime++;  //0.256ms  引导码 : (9 + 4.5) / 0.256 = 53  0码 : 4  1码 : 9
}

void uart_init()
{
    SCON = 0x50;  //设置出口工作方式,打开接收允许
    //SM0 = 0; SM1 = 1; SM2 = 0;REN = 1;
    TMOD |= 0x20;  //设置定时器1为工作方式2

    TH1 = 0xfd;  //波特率为9600bits/s
    //ET1 = 1;  //打开定时器1中断允许
    TR1 = 1;  //开始计数
}

void uart_send_byte(unsigned char byte)
{
    SBUF = byte;
    //TI位自动置1,手动清0;
    while(!TI);  //while(TI != 1);
    TI = 0;     
}

void uart_send_string(char *buf)
{
    while(*buf != '\0')
    {
        uart_send_byte(*buf);
        buf++;
    }   
}
unsigned char buf[33];
void main()
{
    time0_init();
    int0_init();
    uart_init();

    while(1)
    {
        if(irok == 1)
        {
        for(bitnum = 0;bitnum < 33;bitnum++)
        {
            if(irdata[bitnum+1] <= 6+ '0')
            {
                buf[bitnum] = 0 + '0';
            }
            else
            {
                buf[bitnum] = 1 + '0';
            }
        }
        buf[32] = '\n';
        //if(irok == 1)
        //{
            for(bitnum = 0;bitnum < 33;bitnum++)
            {
                uart_send_byte(buf[bitnum]);
            }
        //  uart_send_string(irdata);   
        //  uart_send_byte('\n');
            irok = 0;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值