请选择 进入手机版 | 继续访问电脑版

普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 5940|回复: 3

求助红外通讯的控制问题

 关闭 [复制链接]

1

主题

4

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2018-9-19 16:39:50 | 显示全部楼层 |阅读模式
红外通讯怎么能实现控制按键让IO口分别输出低电平。本人新手,麻烦在例子程序中给点提示?
回复

使用道具 举报

20

主题

1344

帖子

8370

积分

论坛元老

Rank: 8Rank: 8

积分
8370
发表于 2018-9-20 08:47:35 | 显示全部楼层
看我的例子:
/*
红外遥控示例程序
*/
#include<reg51.h>
#include<intrins.h>

#define LED P2//LED灯
#define SMG P0//数码管

sbit HWX=P3^2;//红外接收管在I/O口
sbit FMQ=P1^5;//蜂鸣器
sbit LSA=P2^2;//数码管位码CBA位选
sbit LSB=P2^3;
sbit LSC=P2^4;

unsigned char HWXSJ[4];
bit JSCG=1;
unsigned char code XSM[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};

void Config();

void delay(void)
{               
        unsigned char i=10;
        while(i--);
}

void Delay10ms(unsigned char c)
{
    unsigned char a,b;
    for(;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}

void main()
{
        unsigned int i;
        Config();       
        LED=0xff;
        SMG=0x00;
        while(1)
        {
                if (JSCG==1)
                {
                        JSCG=0;
                        if (HWXSJ[2]==0x45)//电源开关
                        {
                                LED=~LED;
                        }
                        if (HWXSJ[2]==0x47)//声音开关
                        {
                                for (i=0;i<5000;i++)
                                {
                                        FMQ=~FMQ;
                                        delay();
                                }
                        }
                        if (HWXSJ[2]==0x40)//左快进
                        {
                                LED=0xfe;SMG=0x00;
                                Delay10ms(50);
                                for (i=0;i<7;i++)
                                {
                                        LED=_crol_(LED,1);
                                        Delay10ms(50);
                                }
                                LED=0xff;
                        }
                        if (HWXSJ[2]==0x43)//右快进
                        {
                                LED=0x7f;SMG=0x00;
                                Delay10ms(50);
                                for (i=0;i<7;i++)
                                {
                                        LED=_cror_(LED,1);
                                        Delay10ms(50);
                                }
                                LED=0xff;
                        }
                        if (HWXSJ[2]==0x16)//0键
                        {
                                LSC=0;LSB=0;LSA=0;
                                SMG=XSM[0];
                        }
                        if (HWXSJ[2]==0x0c)//1键
                        {
                                LSC=0;LSB=0;LSA=1;
                                SMG=XSM[1];
                        }
                        if (HWXSJ[2]==0x18)//2键
                        {
                                LSC=0;LSB=1;LSA=0;
                                SMG=XSM[2];
                        }
                        if (HWXSJ[2]==0x5e)//3键
                        {
                                LSC=0;LSB=1;LSA=1;
                                SMG=XSM[3];
                        }
                        if (HWXSJ[2]==0x08)//4键
                        {
                                LSC=1;LSB=0;LSA=0;
                                SMG=XSM[4];
                        }
                        if (HWXSJ[2]==0x1c)//5键
                        {
                                LSC=1;LSB=0;LSA=1;
                                SMG=XSM[5];
                        }
                        if (HWXSJ[2]==0x5a)//6键
                        {
                                LSC=1;LSB=1;LSA=0;
                                SMG=XSM[6];
                        }
                        if (HWXSJ[2]==0x42)//7键
                        {
                                LSC=1;LSB=1;LSA=1;
                                SMG=XSM[7];
                        }
                }       
        }
}                                                                         

void Config()
{
        IT0=1;
        EX0=1;
        EA=1;
        TMOD=0X10;
        HWX=1;
}

void ReadIr() interrupt 0
{
        unsigned char i,ia;
        TL1=0;
        TH1=0;
        TR1=1;
        while(!HWX)
        {
                if (TH1>40)
                {
                        TR1=0;
                        TL1=0;
                        TH1=0;
                        return;
                }
        }
        TR1=0;
        if(TH1<25)
        {               
                return;
        }
        TH1=0;       
        TL1=0;
        TR1=1;
        while(HWX)
        {
                delay();
                if(TH1>25)
                {
                        TR1=0;
                        TL1=0;
                        TH1=0;
                        return;
                }               
        }
        TR1=0;
        if(TH1<15)
        {
                return;
        }
        for(i=0;i<4;i++)
        {
                for(ia=0;ia<8;ia++)
                {                               
                        TL1=0;
                        TH1=0;
                        TR1=1;
                        while(!HWX)
                        {
                                if(TH1>5)
                                {
                                        TR1=0;
                                        TL1=0;
                                        TH1=0;
                                        return;
                                }
                        }
                        TR1=0;
                        TH1=0;
                        TL1=0;
                        TR1=1;
                        while(HWX)
                        {
                                delay();
                                if(TH1>10)
                                {
                                        TR1=0;
                                        TL1=0;
                                        TH1=0;
                                        return;
                                }               
                        }
                        TR1=0;
                        HWXSJ[i]>>=1;
                        if(TH1>4)
                        {
                                HWXSJ[i]|=0x80;
                        }
                }
        }
        if ((HWXSJ[0]==~HWXSJ[1])&&(HWXSJ[2]==~HWXSJ[3]))
        {
                JSCG=1;
        }
        else
        {
                JSCG=0;
        }
}
回复 支持 1 反对 0

使用道具 举报

1

主题

4

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2018-9-19 16:43:44 | 显示全部楼层
意思就是我怎么才能让按键实现IO口输出
回复 支持 反对

使用道具 举报

1

主题

4

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2018-9-19 16:42:43 | 显示全部楼层
/**************************************************************************************
*                              红外通信实验                                                                                                  *
实现现象:        具体接线操作请参考视频
                        下载程序后,数码管显示红外遥控键值数据
注意事项:        红外遥控模块的短接片J1短接,
                        红外遥控器内的电池绝缘片一定要抽掉                                                                                                                                                          
***************************************************************************************/

#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
       

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

sbit IRIN=P3^2;

u8 IrValue[6];
u8 Time;

u8 DisplayData[8];
u8 code smgduan[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的显示码

/*******************************************************************************
* 函 数 名         : delay
* 函数功能                   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
        while(i--);       
}


/*******************************************************************************
* 函数名         igDisplay()
* 函数功能                 :数码管显示函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void DigDisplay()
{
        u8 i;
        for(i=0;i<3;i++)
        {
                switch(i)         //位选,选择点亮的数码管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//显示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//显示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;//显示第2位       
                }
                P0=DisplayData[i];//发送数据
                delay(100); //间隔一段时间扫描       
                P0=0x00;//消隐
        }               
}


/*******************************************************************************
* 函数名         : IrInit()
* 函数功能                   : 初始化红外线接收
* 输入           : 无
* 输出                  : 无
*******************************************************************************/

void IrInit()
{
        IT0=1;//下降沿触发
        EX0=1;//打开中断0允许
        EA=1;        //打开总中断

        IRIN=1;//初始化端口
}


/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{       
        IrInit();
        while(1)
        {       
                DisplayData[0] = smgduan[IrValue[2]/16];
                DisplayData[1] = smgduan[IrValue[2]%16];
                DisplayData[2] = smgduan[16];
            DigDisplay();               
        }               
}

/*******************************************************************************
* 函数名         : ReadIr()
* 函数功能                   : 读取红外数值的中断函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/

void ReadIr() interrupt 0
{
        u8 j,k;
        u16 err;
        Time=0;                                         
        delay(700);        //7ms
        if(IRIN==0)                //确认是否真的接收到正确的信号
        {         
               
                err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
                /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
                侯,程序死在这里*/       
                while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去                 
                {                       
                        delay(1);
                        err--;
                }
                if(IRIN==1)                        //如果正确等到9ms低电平
                {
                        err=500;
                        while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高电平过去
                        {
                                delay(1);
                                err--;
                        }
                        for(k=0;k<4;k++)                //共有4组数据
                        {                               
                                for(j=0;j<8;j++)        //接收一组数据
                                {

                                        err=60;               
                                        while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
                                        {
                                                delay(1);
                                                err--;
                                        }
                                        err=500;
                                        while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
                                        {
                                                delay(10);         //0.1ms
                                                Time++;
                                                err--;
                                                if(Time>30)
                                                {
                                                        return;
                                                }
                                        }
                                        IrValue[k]>>=1;         //k表示第几组数据
                                        if(Time>=8)                        //如果高电平出现大于565us,那么是1
                                        {
                                                IrValue[k]|=0x80;
                                        }
                                        Time=0;                //用完时间要重新赋值                                                       
                                }
                        }
                }
                if(IrValue[2]!=~IrValue[3])
                {
                        return;
                }
        }                       
}
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2024-4-18 23:58 , Processed in 0.087442 second(s), 32 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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