普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 1902|回复: 0

红外解码试验

[复制链接]

22

主题

24

帖子

136

积分

注册会员

Rank: 2

积分
136
发表于 2021-1-18 21:08:33 | 显示全部楼层 |阅读模式

/****************************************************************

程序功能:

红外解码试验,遥控控制LED小灯的亮灭


*******************************************************************/



#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit RIdata=P3^2;
sbit s1=P1^0;
sbit s2=P1^1;
sbit s3=P1^2;
sbit bee=P1^7;
#define SMG P0

sbit led1=P2^0;
sbit led2=P2^1;
sbit led3=P2^2;
sbit led4=P2^3;


uchar smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};
uchar Displaydata[3];
uchar IrValue[4];


void Red_Decode_Init();
void Smg_Display();

void delay(uint t)
{
        while(t--);
}


void main()
{
        uint t;
        Red_Decode_Init();
        while(1)
        {
                Displaydata[0]=smgduan[IrValue[2]/16];
                Displaydata[1]=smgduan[IrValue[2]%16];
                Displaydata[2]=smgduan[16];
                Smg_Display();

                if(IrValue[2]==0x0c)     //按数字1,第一个LED灯亮
                {  
                       
                        led1=0;
                               
                }
               

                if(IrValue[2]==24)    //按数字2,第二个LED灯亮
                {
                       
                        led2=0;
                       
                }


                if(IrValue[2]==94)     //按数字3,第三个LED灯亮
                {
                       
                        led3=0;
               
                }


                if(IrValue[2]==8)        //按数字4,第四个LED灯亮
                {
                       
                        led4=0;
               
                }


                if(IrValue[2]==28)     //按数字5,蜂鸣器
                {
                  bee=1;
                  delay(10000);
                  bee=0;
                  delay(1000)
                  bee=1;
                  delay(10000);
                  bee=0;
                  delay(5000);

            }


                if(IrValue[2]==0x5a)     //按数字6,第一个LED灯灭
                {
                        led1=1;
                               
                }
               

                if(IrValue[2]==0x42)     //按数字7,第二个LED灯灭
                {
                       
                        led2=1;
                       
                }


                if(IrValue[2]==0x52)     //按数字8,第三个LED灯灭
                {
                       
                        led3=1;
               
                }


                if(IrValue[2]==0x4a)     //按数字9,第四个LED灯灭
                {
                       
                        led4=1;
               
                }


               
                if(IrValue[2]==0x45)     //按电源键,所有LED灯灭
                {
                        led1=1;
                        led2=1;
                        led3=1;
                        led4=1;
                        bee=0;
               

                }

        }
}


void Red_Decode_Init()     //初始化 中断打开
{
        IT0=1;
        EX0=1;
        EA=1;

}

void Decode() interrupt 0
{
        uchar j,k;
        uint err,time;


        delay(700);
        if(RIdata==0)
        {
                err=1000;
                while(RIdata==0&&err>0)
                {
                        delay(1);
                        err--;

                }
                if(RIdata==1)                //转为高电平没有持续4.5ms是否算正确?
                {
                        err=500;
                        while(RIdata==1&&err>0)
                        {
                                delay(1);
                                err--;
                        }
                }

                //已经确认收到了起始信号
                for(k=0;k<4;k++)
                {
                        for(j=0;j<8;j++)
                        {
                                err=60;
                                while(RIdata==0&&err>0)
                                {
                                        delay(1);
                                        err--;
                                }
                                err=500;
                                time=0;
                                while(RIdata==1&&err>0)
                                {
                                        delay(10);
                                        time++;
                                        err--;
                                        if(time>30)
                                        {
                                                return;
                                        }
                                }
                               
                                IrValue[k]>>=1;
                                if(time>8)
                                IrValue[k]|=0x80;


                        }
                }

                if(IrValue[2]!=~IrValue[3])
                {
                        return;
                }




        }

       
}


void Smg_Display()             //数码管显示
{
        uchar i;
        for(i=0;i<3;i++)
        {
                switch(i)
                {
                        case 0: s3=0; s2=0; s1=0; break;
                        case 1: s3=0; s2=0; s1=1; break;
                        case 2: s3=0; s2=1; s1=0; break;
                       
                }

                SMG=Displaydata[i];
                delay(100);
                SMG=0X00;
        }
}
回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-26 00:16 , Processed in 0.079291 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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