完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
NEC协议
发送端发送1 :560us脉冲 + 1680us低电平 发送端发送0 :560us脉冲 + 560us低电平 连发码 : 9ms 低电平+2.5m 高电平+0.56ms 低电平 +97.94ms 高电平 引导码 :9ms 的低电平 + 4.5ms 的高电平 接收端接收1 :560us低电平 + 1680us高电平 接收端接收0 :560us低电平 + 560us高电平 接收端连发码 : 9ms 高电平+2.5m 低电平+0.56ms 高电平 +97.94ms 低电平 接收端引导码 :9ms 的高电平 + 4.5ms 的低电平 接收端的数据引脚接上拉电平,也可以让此脚连接的芯片引脚配置为上拉输出模拟上拉电阻的作用。 因为此上拉电阻的作用使接收端空闲时是高电平,从而电平状态与发送的相反。 对于接收端而言,数据1和数据0都是低电平变高电平,是个上升沿,于是可以使用上升沿触发中断。用高电平时间的不同来区分二者。 发送数据 发送一次共32位,每一位都可以触发升沿触发中断 hongwai.c #include “hongwai.h” #include “systick.h” u32 Hong_Data; //红外线接受的数据 u8 Hong_Flag; //接受是否完成 /***************************************************************** 函数名:Hongwai_Init() 函数功能:红外初始化 输入:无 输出:无 ****************************************************************/ void Hongwai_Init() { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG|RCC_APB2Periph_AFIO,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输出,端口模拟它没信号时高电平 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOG,&GPIO_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOG, GPIO_PinSource15); //选择GPIO管脚用作外部中断线路,重映射 EXTI_ClearITPendingBit(EXTI_Line15); EXTI_InitStructure.EXTI_Line = EXTI_Line15; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发,因为没信号是高电平信号来低电平造成下降沿,正好以此为条件表示信号来了 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //触发模式是中断 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } /***************************************************************** 函数名:Hig_Cou() 函数功能:高电平时间判别函数 输入:无 输出:8位的时间判别参数 ****************************************************************/ u8 Hig_Cou() { u8 t=0; if(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_15)) //获取GPIOG_Pin_15的输入状态 { t++; delay_us(20); if(t》=250) return t; //t每自加一次就延时20us } return t; } /***************************************************************** 函数名:EXTI15_10_IRQHandler() 函数功能:中断服务函数,进行解码并存储 输入:无 输出:无 ****************************************************************/ void EXTI15_10_IRQHandler() { u8 tim; //高电平时间参数变量 u8 ok; //引导码有效变量 u8 data; //接受高低电平 u8 num; //接受次数 while(1) { if(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_15)==1) //PG15输入是高电平 { tim = Hig_Cou(); //获取高电平时间 if(tim》=250) break;//超时错误 if(tim《250&&tim》200) ok = 1; //引导码有效 if(tim《90&&tim》70) data = 1; //接受是高电平 else if(tim《40&&tim》15) data = 0; //接收是低电平 if(ok) //引导码有效 { Hong_Data 《《=1; //移位 Hong_Data+=data; //把数据存入Hong_Data } if(num》=32) //32位4字节都接受完 { Hong_Flag = 1; //传输完 break; } num++; } EXTI_ClearITPendingBit(EXTI_Line15); //消除EXTI_Line15的中断标志位 } } hongwai.h #include “system.h” #include “SysTick.h” #include “led.h” #include “usart.h” #include “hongwai.h” int main() { u8 i=0; SysTick_Init(72); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组 LED_Init(); USART1_Init(9600); Hongwai_Init(); while(1) { if(Hong_Flag==1)//接受完成 { Hong_Flag=0; //清空标志位,供下次使用 printf(“发红外接收码是:%.8Xrn”,Hong_Data); Hong_Data=0;//清空数据供下次使用 } i++; if(i%20==0) { led1=!led1; } delay_ms(10); } } |
|
|
|
只有小组成员才能发言,加入小组>>
4508个成员聚集在这个小组
加入小组3334 浏览 0 评论
航顺(HK)联合电子发烧友推出“近距离体验高性能Cortex-M3,免费申请价值288元评估板
4262 浏览 1 评论
4289 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 01:03 , Processed in 0.658107 second(s), Total 74, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号