完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
不用外部中断下降沿触发方式和不占用整个定时器,就普通的IO实现红外接收;我自己写了个,但是到了最后,不行不知道为什么,求大神给个好的红外接收模块,在下谢谢了~~~
if(IRIN == 0) //引导码低电平 { r_LC_L++; if(r_LC_L >= 34&&r_LC_L <= 38) { b_IR_flag = 1; } else { b_IR_flag = 0; } } if(b_IR_flag) { if(IRIN == 1) //引导码高电平 { r_LC_H++; if(r_LC_H >= 16&&r_LC_H <= 20) { b_IR_flag1 = 1; } else { b_IR_flag1 = 0; } } } if(b_IR_flag1) { for(i = 0;i < 4;i++) { for(j = 0;j < 8;j++) { value = value >> 1; while(!IRIN) //数据码低电平,位0和位1相同的部分 { r_CD_L++; } if(r_CD_L >= 420&&r_CD_L <= 620) { while(IRIN) //数据码高电平,位0和位1区别的部分 { r_CD_H++; } if(r_CD_H >= 420&&r_CD_H <= 620) //在这范围是位0 { value &= 0x7f; } else if(r_CD_H >= 1600&&r_CD_H <= 1800) //在这范围是位1 { value |= 0x80; } } } IR_Value = value; } if(IR_Value[2] = ~IR_Value[3]) //数据码的前面和后面相等时,表示解码完成 { b_IR_ok = 1; } } |
|
相关推荐
28个回答
|
|
已经最近写出来了,谢谢大家
|
|
|
|
if(TIM_GetITStatus(TIM2, TIM_IT_Update)) // ÅD¶Ï·¢éúupdateê¼tÖD¶Ï { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // Çå3yupdateê¼tÖD¶Ï±êÖ¾ /******************************EVENT START*******************************/ /*--------------------------Ñó걿ØÖÆ---------------------------*/ ant_r1 =GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_7); if(ant_r1 ==0) // { if(ant_start < 0xff) ant_start++; if(ant_start >83 && ant_start<100 ) { ant_l = 0; ant_h = 0; skip_nu= 0; } } else { ant_start =0; } switch(skip_nu) { case 0: if(ant_start > 83 && ant_start<100) //9ms òyμ¼Âë { ant_l = 0; ant_h = 0; skip_nu= 1; ant_start =0 ; if(ant_r1 ==1) { ant_h=1; skip_nu = 1; ant_start = 0; } } break; case 1: if(ant_r1 ==1) // 4.5ms ant_h ++; if( ant_h >36 && ant_h<53) //4.5MS ¸ßμçƽμè′y1yè¥ { if (ant_r1 ==0) //4.5ms¸ßμçƽ1yè¥ { skip_nu = 2; //1y0.56MS ant_h=0 ; } } break; case 2: if(ant_r1 ==0) // èç1ûêÇ0.56Ms£¬±£3Ö2»±ä { ant_l = 1; } if(ant_r1 ==1) //¼ÆËã¸ßμçƽ { ant_h=1; skip_nu = 3; } break; case 3: if(ant_r1 ==1) ant_h++ ; if(ant_r1 ==0) //ò»Î»êy¾Y¶áíê { if( (ant_h >4 )&& (ant_h<8)) /*0.56ms, êy¾Y0 */ { skip_nu =2 ; frame_data=frame_data <<1 ; } else if((ant_h>15)&&(ant_h<20)) /* 1.68ms£o1ms~2ms êy¾Y 1*/ { skip_nu =2 ; frame_data=frame_data <<1 ; frame_data ++ ; } } if((ant_h>21)&&(ant_h<25)) ///* 2.1ms£o2ms~4ms ò»Ö¡êy¾Y½óêÕíê3é*/ { frame_data=0 ; skip_nu =0 ; } break; default: ant_l = 0; ant_h = 0; skip_nu= 0; break; } 定时器采集,并且已经成功 |
|
|
|
|
|
|
|
你用外部中断,浪费CPU资源,在学校玩玩还可以,你在实际开发项目中,就好浪费
|
|
|
|
先谢谢,你的是STM32的吧,原理都差不多,我先看看;你的定时器定时多少?怎么后面0.56ms的时候,寄存器的值还那么大?
|
|
|
|
我的红外是用的普通IO口,不在外部中断那串口那,现在IC成本都低,IO口少,实现的功能多,所以能省的得省,这就是技术,我也是刚出来不就,所以欠缺~~~
|
|
|
|
你是定时112us?
|
|
|
|
商业代码应该这样处理:
利用一个定时器,对每个信号的最小时间间隔,进行至少3次采样,然后取两次相同的做为信号电平, 收集完整的一帧信号,利用引导和数据之间的时间比例关系可以确认,利用引导和数据的比例关系确定高低电平脉冲的宽度,校验接收的每个脉冲宽度,正确后解码,. 同时,定时器还可以提供其他的定时信号或动态的数码刷新,输入可以是任意的I/O引脚. |
|
|
|
我是利用数据码的前4位和后四位取反值是否相等来判断解码完成
|
|
|
|
我是利用数据码的前4位和后四位取反值是否相等来判断解码完成
|
|
|
|
用普通IO口实时性不会太好吧?
|
|
|
|
定时中断 96us
|
|
|
|
很好啊,我公司同事都是用这样普通的,不占用任何CPU资源
|
|
|
|
好的,谢谢
|
|
|
|
使用while等待,还好意思说不占CPU资源?
|
|
|
|
while不是不一定不用,你先看清楚主题好吗?没看到我在求好的方法,不会就别瞎评论
|
|
|
|
while不是不一定不用,你先看清楚主题好吗?没看到我在求好的方法,不会就别瞎评论
|
|
|
|
uint8_t time_l = 0;
uint8_t time_h = 0; bool flag_io_state = 0; bool flag_up_state = 0; uint8_t bitcount = 0; uint8_t bytecount = 0; uint8_t task = 0; __interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void) //50us { flag_io_state = pRF_In_Status(); if(flag_io_state) { if(time_h < 250) time_h++; } else { if(time_l < 250) time_l++; } if(!flag_read_ok) { if((!flag_io_state) && (flag_up_state)) { if(0 == task) { if((time_l <= (180 + 36)) && (time_l >= (180 - 36)) && (time_h <= (90 + 18)) && (time_h >= (90 - 18)))//收同步头 { bitcount = 0; bytecount = 0; task++; } } else if(1 == task) //收数据 { if((time_l <= (12 + 6)) && (time_l >= (12 - 6))) { if((time_h <= (12 + 6)) && (time_h >= (12 - 6))) { rx_data[bytecount] &= ~(1 << bitcount); } else if((time_h <= (36 + 18)) && (time_h >= (36 - 14))) { rx_data[bytecount] |= (1 << bitcount); } else { task = 0; } bitcount++; if(bitcount > 7) { bitcount = 0; bytecount++; if(bytecount >= 4) { bytecount = 0; task = 0; flag_read_ok = TRUE; } } } else { task = 0; } } else { task = 0; } time_h = 0; time_l = 0; } } flag_up_state = flag_io_state; } |
|
|
|
谢谢,程序没展示完全把
|
|
|
|
只有小组成员才能发言,加入小组>>
3277 浏览 9 评论
2950 浏览 16 评论
3454 浏览 1 评论
8983 浏览 16 评论
4044 浏览 18 评论
1094浏览 3评论
567浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
564浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2299浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1855浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 02:44 , Processed in 1.389430 second(s), Total 117, Slave 97 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号