STC89C52RC单片机 学习红外线接收程序 问题
我的程序里确认P1=0xff,全部关闭。
换一个普通led灯程序,就能控制led灯。
第一行左边第一张图是 ( 烧录入红外线接收程序的单片机) 的(P1.0口 波形 ) ;
右边是P1口和led灯原理图;
第二行是红外线接收三极管原理图;
我想请教 出现这样的情况 的原因。



- #include <REGX51.H>
- #define uchar unsigned char
- #define uint unsigned int
- #define NEC 32
- sbit Echo=P3^2;
- sbit buzzer=P2^3;
- //uchar testtl0[33];
- uchar n=0;
- uchar t0=0;
- uchar sign=0; //串口可发送标志位
- uchar startsign=0; //开始标志位
- uchar receivebit=0; //接收到第几位
- uchar stop_receive=0; //接收停止位
- uchar stop_switch=0; //停止转换位
- uchar success_check=0; //校验成功位
- uchar t0time[33]; //引导位+16地址位+16命令位
- uchar tl0time[33];
- uchar NM[4];
-
-
- void Init(void);
- void InitInt0(void);
- void Inittime0(void);
- void Inittime1(void);
- //void Delayms(uchar delayms);
- //void CheckData(void);
- void main()
- {
- uchar n;
- uchar m;
- Init();
- InitInt0();
- Inittime0();
- Inittime1();
- while(1)
- {
- if(stop_receive==1)
- {
- stop_receive=0;
- if(sign == 1)
- {
- ES=0;
- sign=0; //接受中断干涉发送中断
- for(n=0; n<33; n++)
- {
- SBUF=t0time[n];
- while(TI == 0);
- TI=0;
- }
- ES=1;
- }
- for(m=0; m<33; m++)
- {
- t0time[m]=0;
- }
-
- }
- }
- }
- void Init(void)
- {
- P3=0xff;
- P1=0xff;
- // PT0=1; //time0高优先级
- }
- void InitInt0(void)
- {
- IT0=1;
- EX0=1;
-
- }
- void Inittime0(void)
- {
- TMOD=0x22;
- TH0=6;
- TL0=6;
- TR0=0;
- ET0=1;
- EA=1;
- }
- void Inittime1(void)
- {
- SM0=0;
- SM1=1;
- REN=1;
- TH1=0xfd;
- TL1=0xfd;
- ES=1;
- TR1=1;
- }
- /*void Delayms(uchar delayms)
- {
- uchar i,j;
- while(delayms--)
- {
- for(i=4; i>0; i--)
- for(j=0; j<50; j++);
- }
- } */
- /*void CheckData(void) //地址和命令,发送时从低位开始 //数据处理
- {
- uchar i=0;
- uchar n=0,m=0;
- if(stop_receive==1) //成功接收完数据,接受完我们将他处理 //处理完之后,我们需要将结束接收标志置0
- { //首先我们需要将两个先整合到一个数组
-
- for(i=1; i<33; i++)
- {
- t0time[i]=t0time[i]+tl0time[i];
- }
- for(m=0; m<4; m++) //我们根据t0time[n]和tl0time,也就是t0的值来确认多大
- {
- for(n=1; n<33; n++)
- {
- NM[m]>>=1;
- if(t0time[n]>4)
- {
- NM[m]|=0x80;
- }
- }
- }
-
- //开始校验
- if(NM[0] == ~NM[1])
- {
- if(NM[1] == ~NM [2])
- {
- success_check=1;
- stop_receive=0; //校验合格,可以置位0,归位,准备下一个
- }
- }
- else
- {
- buzzer=1;
- }
- }
- } */
- void iint0() interrupt 0 //接收中断函数 相当于静态的连续接收 IT0=1
- {
- uchar i=0;
- //下降沿
- TR0=0; //关定时
- EX0=0; //关本次中断
- if(stop_receive==0)
- {
- if((t0>16)&&(t0<20))
- {
- receivebit=0; //接收位置0 第一位开始存放
- }
- t0time[receivebit]=t0; //装入t0
- tl0time[receivebit]=TL0;
- receivebit++;
- t0=0;
- TL0=6;
- if(receivebit>32)
- {
- receivebit=0;
- stop_receive=1; //停止接收标志位
- }
- }
- EX0=1;
- while((Echo==0)&&(i<=65)) //560us之后会达到高电平 ,需要加条件,防卡死
- {
- i++;
- }
- TR0=1; //根据反相码,我们计算高电平持续时间 也就是说,高电平开启定时器,低电平关闭定时器
- //还是有影响
- }
- void time0() interrupt 1 //250us
- {
- t0++;
-
- // testtl0[n]=TL0;
- }
- void ser() interrupt 4
- {
- RI=0;
- sign=1;
- }
- #include <REGX51.H>
- #define uchar unsigned char
- #define uint unsigned int
- #define NEC 32
- sbit Echo=P3^2;
- sbit buzzer=P2^3;
- //uchar testtl0[33];
- uchar n=0;
- uint t0=0;
- uchar sign=0; //串口可发送标志位
- uchar allow_sign=0; //校验合格
- uchar start=0;
- uchar stop=0;
- uchar stop_receive=0; //开始标志位
- uchar receivebit=0; //接收到第几位
- //接收停止位
- uchar stop_switch=0; //停止转换位
- uchar success_check=0; //校验成功位
- uchar t0time[32]; //引导位+16地址位+16命令位
- uchar tl0time[32];
- uchar NM[4];
-
-
- void Init(void);
- void InitInt0(void);
- void Inittime0(void);
- void Inittime1(void);
- //void Delayms(uchar delayms);
- uchar CheckData(void);
- uchar StartStop(void);
- void main()
- {
- uchar n;
- // uchar m;
- Init();
- InitInt0();
- Inittime0();
- Inittime1();
- while(1)
- {
- if(CheckData())
- {
- if(sign == 1)
- {
- ES=0;
- sign=0; //接受中断干涉发送中断
- for(n=0; n<4; n++)
- {
- SBUF=NM[n];
- while(TI == 0);
- TI=0;
- }
- ES=1;
- }
- /* for(m=0; m<33; m++)
- {
- t0time[m]=0;
- }
- */
- }
- }
- }
- void Init(void)
- {
- P3=0xff;
- P1=0xff;
- PT0=1; //time0高优先级
- }
- void InitInt0(void)
- {
- IT0=1;
- EX0=1;
-
- }
- void Inittime0(void)
- {
- TMOD=0x22;
- TH0=6;
- TL0=6;
- TR0=0;
- ET0=1;
- EA=1;
- }
- void Inittime1(void)
- {
- SM0=0;
- SM1=1;
- REN=1;
- TH1=0xfd;
- TL1=0xfd;
- ES=1;
- TR1=1;
- }
- /*void Delayms(uchar delayms)
- {
- uchar i,j;
- while(delayms--)
- {
- for(i=4; i>0; i--)
- for(j=0; j<50; j++);
- }
- } */
- uchar CheckData(void)
- {
- uchar i=0;
- uchar n=0,m=0;
- if(stop_receive==1)
- {
- stop_receive=0;
-
- for(n=0; n<4; n++)
- {
- for(m=0; m<32; m++)
- {
- NM[n]>>=1;
- if(t0time[n]*250+tl0time[n] > 1000 )
- {
- NM[n] |= 0x80;
- }
- }
- }
- if( (NM[2] == ~NM[3]) && (NM[0] == ~NM[1]) )
- {
- return 1;
- }
- }
- return 0;
- }
- uchar StartStop(void)
- {
- uchar value=1;
- if(receivebit==0)
- {
- t0=0;
- TH0=6;
- TL0=6;
- TR0=1;
- // i=250;
- while(Echo==0);
- // {
- // i--;
- // }
- TR0=0;
- // i=0;
- // start=t0; // start=21,远远小于,也许是干扰
- if((t0<30)||(t0>45))
- {
- TR0=0;
- P1=0x01;
- value=0;
- }
-
- TH0=6;
- TL0=6;
- t0=0;
- TR0=1;
- // i=250;
- while(Echo==1);
- // {
- // i--;
- // }
- TR0=0;
- // i=0;
- // stop=t0;
- if((t0<10)||(t0>28)) // stop=10
- {
- TR0=0;
- P1=0x02;
- value=0;
-
- }
-
- }
- return value;
- }
- void iint0() interrupt 0 //接收中断函数 相当于静态的连续接收 IT0=1
- {
- // uchar i=0;
- uchar value;
- EX0=0;
- value=StartStop();
- if(value==1)
- {
- TR0=0;
- // P1=0x04;
- if(receivebit>31)
- {
- receivebit=0;
- stop_receive=1;
- }
- t0time[receivebit]=t0;
- tl0time[receivebit]=TL0;
- receivebit++;
- while(Echo==0)
- // {
- // i++;
- // }
- // i=0;
- TR0=1;
- t0=0;
- TH0=6;
- TL0=6;
- }
- EX0=1;
- }
- void time0() interrupt 1 //250us
- {
- t0++;
- }
- void ser() interrupt 4
- {
- RI=0;
- sign=1;
- }
这两个有关联么?
昨天的问题已经改善了。现在出现了新问题, t0的33个值看着有点规律,在循环右移。
如果加入校验代码,也校验不成功。正在努力..分析
while((Echo==1)&&(i<=250))
{
i++;
}
这一段,如果更改i<=250; 改为i<100;或者其他数字。
t0的值会有变化.
发射遥控,在按住连续发送时只发射引导码。
可能是这个原因。我一直是只按键1,有间隔的按。也许红外发射遥控逐渐判断到信号重复,从而减少地址码和命令码。
我看到数据有t0=2E,几乎每个都有
发送回的数据趋于正常了。
每一次按同一个键的,发送回的数据不一样。
我想是t0的32个数值,循环右移。导致NM【n]也变化。
导致按好几次按键才得到一个程序认为是正确的NM【n】.与我在示波器上观察到的波形不一样。
以下是t0的数据.可以看到,变化
07 06 98 27 D1 02 02 02 02 02 06 06 06 07 06 07 02 06 02 02 06 06 02 02 02 02 06 06 03 02 06 06
06 03 02 06 06 07 06 97 27 02 02 02 02 02 02 07 06 06 07 06 06 02 06 02 02 06 06 02 02 02 02 06
02 02 02 06 07 02 02 06 07 06 06 97 27 02 02 02 02 02 02 06 07 06 06 06 06 02 06 02 02 06 06 02
02 06 06 02 02 02 02 06 07 02 02 06 06 07 06 97 28 02 02 02 02 02 02 06 06 07 07 06 07 02 06 02
06 02 06 02 02 06 06 02 02 02 02 06 06 03 02 06 07 06 06 97 27 02 02 02 02 02 02 06 06 07 06 07
06 06 07 06 06 02 06 02 02 06 06 02 02 02 02 06 06 02 02 06 06 06 06 97 27 02 02 02 02 02 02 06
02 02 02 06 07 06 06 06 06 03 06 02 02 06 06 02 02 02 02 06 06 02 02 06 06 07 06 97 28 02 02 02
28 02 02 02 02 02 02 06 07 07 06 06 06 02 06 02 02 06 06 02 02 02 02 06 06 02 02 06 06 07 06 97
06 07 06 97 28 02 02 02 02 02 02 06 06 07 06 06 06 03 06 02 02 06 06 02 02 02 02 06 06 02 02 06
06 02 02 06 06 06 06 97 28 02 02 02 02 02 02 06 06 06 06 07 06 02 06 03 02 06 07 02 02 02 02 06
02 02 02 06 06 02 02 06 06 06 07 97 27 02 02 02 02 02 02 06 07 06 06 07 06 02 06 02 02 06 07 02
02 06 06 02 02 02 02 06 06 03 02 06 06 07 06 97 27 02 02 02 02 02 02 06 06 07 06 07 06 02 06 02
06 02 06 02 02 06 06 02 02 02 02 06 06 02 02 06 06 07 06 97 27 02 02 02 02 02 02 06 06 07 06 07
06 06 06 06 06 06 02 06 02 02 06 06 02 02 02 02 06 07 02 02 06 06 07 06 97 27 02 02 02 02 02 02
02 02 02 02 06 06 06 07 06 06 02 06 02 02 06 06 02 02 02 02 06 06 03 02 06 06 06 06 02 02 02 02
02 02 02 02 02 02 06 06 06 06 06 07 02 06 03 02 06 06 03 02 02 02 06 06 02 02 06 06 06 06 02 02
start和stop,起始码时间和结束码时间也小于9ms和4.5ms 时间短的有些离谱
t0偏移导致NM【n】数值也在变化...
新手还看不懂。
这样很悬浮啊
有没有发送程序? 发我邮箱 1798473667@qq.com 感谢 最近在做led可见光通信 很需要这方面的
有没有 发送的程序 ? 最近在做LED可见光通信的 很需要这方面的资料 发我邮箱 179843667@qq.com 万分感谢
有没发送的程序? 最近在做led可见光通信 很需要这方面的资料 发我邮箱 179843667@qq.com
万分 感谢
不错的文件,值得收藏
