接收时,脉充宽度,做一个容差 |
程序设计思想问题,发送和接收用中断, |
这是NEC协议,你程序代码的时间设置不对,就是判断时间,你多测试几次就可以了,重要的是你的载波发生一定要正确 |
没这样做过,但是理论上是可行的。38khz频率,周期26us可以执行很多指令。使用32位单片机(8位高速也行),用两个定时器来做应该可行。如果模拟nec协议,脉宽是100us级的就更没问题了。用接收数据的定时器控制发送数据的定时器,考虑优先级,接收数据脉宽范围,时间精度等。 |
你得首先确定555发射的38K信号能让P3.2产生中断,反射式红外线距离是很短的,用万用表量一下P3.2脚就能看出,或者在中断入口处点亮一颗LED指示灯也能测出。 |
楼上说得对:理论上说是不能同时的,但芯片接收和发射用的时间特别短毫秒级的,给人的感觉像同时处理的,接收一般用定时器捕获或中断做接收。其实实际上没有做到同时,但对人来说也差不多了 |
wh8010jky 发表于 2020-11-6 09:08 完全可以做到,最主要的是你发射和接受不能用堵塞式延时。 |
此时有个示波器你就比较好解决问题了,收发端口是否正常就可以检测出来,考虑中断是否会影响发数据,有没有办法避免,然后就是最好先用两个单片机先验证收发数据都可以了,再看怎么整合在一个单片机验证 |
STC12单片机有定时器输出口,定时器可以自己重装,有需要可以开中断,但产生38k无需中断。 再开一个定时器T1定时10ms, 这个要中断,每次中断反转TR0。 跑的时候,若TR0为1,接收管输入端产生中断,进入测量脉载波长度程序,过程中T1发生中断将TR0置0,载波消失,即获得载波长度,若与10ms相符则非干扰,大概是这样。 AUXR EQU 8EH WAKE_CLKO EQU 08FH ORG 0000H MOV WAKE_CLKO,#00000001B ;ENABLE BRT(=4),T1(=2) T0(=1) HAVE CLOCK OUTPUT BRT@P1.0 T1@P3.5 T0@P3.4 MOV AUXR, #11111100B ;T0x12,T1x12,UART_M0x6,BRTRUN,S2SMOD,BRTx12,EXTRAM,S1BRS MOV TMOD, #00100010B ;TIMER1 AS MOD2(8 BYTE AUTO RELOAD TIMER) ;GATE, C/T,M1,M0(T1) GATE, C/T,M1,MO(T0) MOV TL0, #111 ;Tx12 111=38.2K OUTPUT AT P3.4 MOV TH0, #111 SETB TR0 ;RUN T0 |
理论上说是不能同时的,但芯片接收和发射用的时间特别短毫秒级的,给人的感觉像同时处理的,接收一般用定时器捕获或中断做接收。 |
P1口好像漏了上拉电阻,那样的话555第4脚一直都是低电平,不能工作了! |
dalaoshi 发表于 2020-11-5 23:45 我最主要的疑问是:一个单片机能否实现红外的发和收?按君所言,定时器产生38k信号,在接收管接收时这个38k信号已经发送完毕,如何才能收到?这是我最不懂的地方。 |
dalaoshi 发表于 2020-11-5 23:45 谢谢了!但是,用定时器产生38k信号不是需要频繁中断吗?能否提供一个程序参考一下?再次谢谢! |
既然是自己发自己收就不一定要照着别人的格式,你可以让发射管发射固定的38k间歇信号,比如10MS开,10MS关,接收管分析接收信号的周期,若符合就不是干扰信号,而产生间歇信号可以用单片机的一个定时器来完成,而且是用中断来控制,该定时器的中断权位比P3.2高,因此在P3.2中断期间输出信号不会中断。若还有其他定时器可用,应该用来产生38K信号直接输出到发射管,不必用555IC。 |
补充说明:发送数据里的4个数据是固定码,代替32位设备码和键码 |