找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3001|回复: 9
收起左侧

单片机红外通信的问题

[复制链接]
ID:366484 发表于 2018-7-7 17:35 | 显示全部楼层 |阅读模式
一个单片机使用两个普通的io口怎么实现两个IO口之间交换数据啊,现在已经实现的功能有NEC红外信号的编码发送,经过测试,编码发送的数据有效,解码NEC红外信号的函数也已经实现,也是经过测试的,但是就是不知怎么将两个如何结合起来,能让两个IO口交换数据,接收到发送的数据,则进行操作,如果没接收到数据则进行另一种操作
回复

使用道具 举报

ID:277550 发表于 2018-7-7 20:58 | 显示全部楼层
编码、发送和接收、解码都正常,就一发送、一接收两块板对射
回复

使用道具 举报

ID:366484 发表于 2018-7-9 17:56 | 显示全部楼层
devcang 发表于 2018-7-7 20:58
编码、发送和接收、解码都正常,就一发送、一接收两块板对射

我现在是要一个单片机的两个IO之间通过红外进行数据交换,不是两个单片机之间
回复

使用道具 举报

ID:123289 发表于 2018-7-9 22:18 | 显示全部楼层
如果不是红外,直接“io口怎么实现两个IO口之间交换数据” 你能做成功吗?
回复

使用道具 举报

ID:366484 发表于 2018-7-10 09:02 | 显示全部楼层
yzwzfyz 发表于 2018-7-9 22:18
如果不是红外,直接“io口怎么实现两个IO口之间交换数据” 你能做成功吗?

直接把另一个IO的值赋值给另一个IO呗,那是内部的啊,现在我是想外部实现,通过红外,阻挡则数据交换不成功
回复

使用道具 举报

ID:174087 发表于 2018-7-10 14:15 | 显示全部楼层
两个io口 一个红外发送 一个红外接收ok?
回复

使用道具 举报

ID:368746 发表于 2018-7-10 15:37 | 显示全部楼层
不是一个红外发送一个红外接收嘛
回复

使用道具 举报

ID:366484 发表于 2018-7-11 15:06 | 显示全部楼层
woshige 发表于 2018-7-10 14:15
两个io口 一个红外发送 一个红外接收ok?

这个用模块已经实现的,我这里用同一块单片机单独控制红外发生是ok的,还是这个单片机,解码程序也是ok的,就是说不知道怎么实现自己发送红外信号,然后自己接收
回复

使用道具 举报

ID:366484 发表于 2018-7-11 15:07 | 显示全部楼层
void SEND_NEC_DATA(u8 user,u8 key)
{
        u16 date_H=0;
        u16 date_L=0;
        u32 date=0;
        u8 x=0;
        date_H=((~key&0xFF)<<8)|((key&0xFF)<<0);
        date_L=((~user&0xFF)<<8)|((user&0xFF)<<0);
        date=((u32)date_H<<16)|(date_L<<0);//构成32位的一个数据组,为发送红外信号做准备
        //发送数据开始
        //1.先发送9ms的载波数据
        PWM_38KHZ(1);
        DELAY_US(9000);
        //2.然后发送4.5ms的低电平数据
        PWM_38KHZ(0);
        DELAY_US(4500);
        //3.发送完引导码后,就可以开始传输数据
        for(x=0;x<32;x++)
        {
                PWM_38KHZ(1);
                DELAY_US(460);
                if(date&0x01)
                {
                        PWM_38KHZ(0);
                        DELAY_US(1540);       
                }
                else
                {
                        PWM_38KHZ(0);
                        DELAY_US(425);       
                }
                date>>=1;
        }
        PWM_38KHZ(1);
        DELAY_US(560);
        PWM_38KHZ(0);
        DELAY_US(1000);
        flag=0;
}

int main(void)
{
       
        P1M1=0x00;
        P1M2=0x00;//设置P1口为准双向口
        P0M1=0x00;
        P0M2=0x00;
//        IO_Init();
//        EA=1;
        while(1)
        {
       
                if(infr_buff[4]==1)         
                {
                        infr_buff[4]=0;       
                        P10=~P10;
                }
                 
        SEND_NEC_DATA(0x00,0x02);          
         DELAY_US(65000);
         P11=~P11;
                                       
        }
        return 0;
}
//IO口中断
void PinInterrupt_ISR (void) interrupt 7
{
        u16 time=0;
        u16 x,y;
        u8 date=0;
        time=GET_TIMEL();        //接收引导码,先是9ms的低电平       
        if(time<7000||time>10000)return;//判断时间是否在区域内波动,否则不是数据
        time=GET_TIMEH();        //接收引导码,接下来是4.5ms的高电平
        if(time<4000||time>5000)return;//判断时间是否在区域内波动,否则不是数据       
          //如果以上都成立,则表示引导码正确,接下来就可开始接收数据了
        for(x=0;x<4;x++)
        {
                for(y=0;y<8;y++)
                {
                  time=GET_TIMEL();//判断低电平的时间,是不是560us
                  if(time<460||time>660)return;//如果时间不在范围内,则直接退出函数
                  time=GET_TIMEH();//判断高电平持续的时间,判断接收到的数据是高电平还是低电平
                  if(time>460&&time<660)//接收低电平的数据
                  {
                          date>>=1;
                  }
                  else if(time>1580&&time<1800)
                  {
                          date>>=1;
                        date |=0x80;
                  }
                }
                infr_buff[x]=date;
        }
        infr_buff[4]=1;//表示解码成功                               
}




解码和编码的代码
回复

使用道具 举报

ID:367894 发表于 2018-7-11 15:58 | 显示全部楼层
你的红外接收头和发送头都是集成在一个元件里面的是吧,然后接受发送那个模块只给你一个引脚是吧。起始呢,这个问题很容易就解决啦,只要将两根导线接到那个管脚里面,然后一个发送,一个管脚配置成接受,不就得了吗?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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