基于51单片机红外接收解码程序设计软件源代码

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code bit_ser[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; 
uchar code seven_seg[] = {0xf9,0x8e,0xc0};    //1,f,0依次表示高电平,悬空,低电平
uchar code address[]={1,1,1,1,1,1};    //存放预设的地址码高电平为2,低电平为0,悬空为1
uchar disbuffer[6];       //数据显示缓冲区
uchar DATEA[25];       //接收的信息
uchar DATE[12];           //解码得到的数据
bit dateflag;            //接收数据时的标记
char num,i,j;           //用于接收和显示时计数
sbit DATE_IN = P1^0;   //数据的接收端
//定时器初始化函数
void Timer_init()
{
    TMOD = 0x11;
    TH0 = 0xFA;
    TL0 = 0x00;
    EA = 1;
    ET0 = 1; 
    TL1 = (65536-5000) % 256;
    TH1 = (65536-5000) / 256;
    ET1 = 1;
    TR1 = 1;
}
//Timer1中断处理函数,用于显示接收到的数据
void time1_interrupt() interrupt 3
{
    TL1 = (65536-5000) % 256;
    TH1 = (65536-5000) / 256;
    P0 = 0xff;
    P2 = bit_ser[i];
    P0 = seven_seg[disbuffer[i]];
    i ++;
    if(i >= 6)
        i = 0;
}
//Timer0中断处理函数
void timer0_interrupt() interrupt 1
{
    if(dateflag)        //如果dateflag为高,说明是需要检测数据了,否则说明是同步码或误码(周期过长)
    {
        dateflag = 0;
        DATEA[num] = DATE_IN;
        num ++;
        TR0 = 0;
        TH0 = 0xFA;
        TL0 = 0x00;
        TR0 = 1;
    }
    else             
    {
        num = 0;
    }
}
//数据接收函数
void jieshou_date()
{
    if(!dateflag)
    {
        TR0 = 0;
        TH0 = 0xFA;
        TL0 = 0x90;                                                                                                      
        TR0 = 1;
        dateflag = 1;                     
    }    
}
//从接收到的信息中提取数据
void huoqu_date()
{
    for(j = 0;j < 12;j ++)    //将接收到的24位电平信号转换成数据
    {
        DATE[j] = DATEA[j + j] + DATEA[j + j + 1];
        if(DATE[j] && ! DATEA[j + j])     //如果接收到的两位数据是0,1说明是误码
        {
            break;
        }
    }
    num = 0;
    if(j == 12)
    {
        if(DATE[0] == address[0] && DATE[1] == address[1]&& DATE[2] == address[2] &&
            DATE[3] == address[3] && DATE[4] == address[4] && DATE[5] == address[5])
        {         //如果解码得到的地址码和预设的地址码相同,就将解码得到的数据放入显示缓冲区
            for(j = 0;j < 6; j++)
            {
                disbuffer[j] = DATE[6 + j];
            }    
        }
    }    
}
//主函数
void main()
{
    Timer_init();
    while(1)
    {
        if(!DATE_IN)         //说明有信号输入
        {
            jieshou_date();     //接收信息
        } 
        if(num >= 25)         //说明已经接收到了一组完整数据
        {
            huoqu_date();     //从接收的信息中提取数据            
        }                    
    }
}

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GJZGRB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值