切换到宽版
  • 2251阅读
  • 4回复

[C51]写了一个BA5104红外遥控解码程序 [复制链接]

上一主题 下一主题
离线arzeng
 

发帖
31
M币
237
专家
1
粉丝
10
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2018-03-22

    遥控器的样子如上图
    解出的键值分别是:关-0x01  摇头-0x10  定时-0x08  风类-0x04  开/风速-0x02  彩灯-0x43
    源程序如下:


/************************************************
BA5104红外格式解码
Arzeng 2018.3
*************************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void display();
void delay(uchar i);
void zir();
uint tes,ird0,ird1;
uchar num,kx,irok;
uchar ircode[8];
sbit ir=P3^3; //HS0038接收头OUT端直接连P3.2(INT0)
void Int1() interrupt 2
{
    if(!kx)
    {
        tes=TH0*256+TL0;   //提取中断时间间隔时长
        TH0=0;
        TL0=0;
        ET0=0;
        TR0=1;        //定时中断重新置零
        if((tes>7000)&&(tes<8200))    
        {
            kx=1;
        }
    }
    if(!irok&&kx)
    {
        TH0=0xfc;
        TL0=0xf1;
        TR0=1;
        ET0=1;
    }
}
void t0()interrupt 1//定时器0中断
{
    TR0=0;
    ird0=(ird0<<1)|!ir;
    num++;
    if(num>11)
    {
        irok=1;
        zir();
    }
}
void zir()
{
//uchar k;
    if(ird0<<4==ird1<<4)
    {
//for(k=0;k<8;k++){ircode[k]=ird0>>(7+4-k)&0x01;}//ird0>>(7-k)&0x01;} //二进制显示12-5位
//for(k=0;k<8;k++){ircode[k]=ird0>>(7-k)&0x01;}//ird0>>(7-k)&0x01;}  //二进制显示低8位
        ircode[0]=(ird0>>9&0x07)>>4;
        ircode[1]=(ird0>>9&0x07)&0x0f;
        ircode[2]=(ird0>>7&0x03)>>4;
        ircode[3]=(ird0>>7&0x03)&0x0f;
        ircode[6]=(ird0&0x7f)>>4;
        ircode[7]=(ird0&0x7f)&0x0f;
    }
    else
    {
        ird1=ird0;
    }
    num=kx=irok=0;
    TR0=0;
    ET0=0;
}
void main()
{
    EA=1;
    IT1=1;
    EX1=1;
    TMOD=0x11;
    TH0=0x00;
    TL0=0x00;
    TR0=0;
    ET0=0;
    while(1)
    {
        display();
    }
}


void delay(uchar i)
{
    uchar j,k;
    for(j=i; j>0; j--)
        for(k=125; k>0; k--)
        {
            ;
        }
}
sbit dula=P2^6;
sbit wela=P2^7;
sbit laba=P2^2;

void display()
{
    uchar a;
    uchar dis[8];
    uchar code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
    for(a=0; a<8; a++)
    {
        dis[a]=ircode[a];
    }
    for(a=0; a<8; a++)
    {
        dula=0;
        P0=table[dis[a]]; //送出要点亮的段
        dula=1;
        dula=0;
        wela=0;
        P0=~(0x01<<a); //依次点亮八个位
        wela=1;
        wela=0;
        delay(5);
    }
}

本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共2条打赏 ,M币+45
xiaozhuxia20 M币 +15 謝謝分享 2019-02-16
baihua915 M币 +30 謝謝分享 2018-03-31
离线sadate

发帖
247
M币
1177
专家
2
粉丝
34
只看该作者 1楼 发表于: 2018-03-22
离线arzeng

发帖
31
M币
237
专家
1
粉丝
10
只看该作者 2楼 发表于: 2018-03-22
回 sadate 的帖子
请登录后查看
离线wyj8017

发帖
1055
M币
3027
专家
1
粉丝
32
只看该作者 3楼 发表于: 2018-03-24
请登录后查看
离线baihua915

发帖
1436
M币
2359
专家
16
粉丝
96
只看该作者 4楼 发表于: 2018-03-31
请登录后查看
快速回复
限80 字节
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
 
上一个 下一个