微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STC89C52RC单片机 学习红外线接收程序 问题

STC89C52RC单片机 学习红外线接收程序 问题

时间:10-02 整理:3721RD 点击:
背景:开发板用红外接收三极管,信号口接P3^2(INT0)烧录入单片机之后,led出现全亮。
我的程序里确认P1=0xff,全部关闭。
换一个普通led灯程序,就能控制led灯。
第一行左边第一张图是 ( 烧录入红外线接收程序的单片机)  的(P1.0口 波形  ) ;
右边是P1口和led灯原理图;
第二行是红外线接收三极管原理图;
我想请教 出现这样的情况 的原因。






  1. #include <REGX51.H>
  2. #define uchar unsigned char
  3. #define uint  unsigned int

  4. #define NEC 32

  5. sbit Echo=P3^2;
  6. sbit buzzer=P2^3;
  7. //uchar testtl0[33];

  8. uchar n=0;
  9. uchar t0=0;
  10. uchar sign=0;                                        //串口可发送标志位
  11. uchar startsign=0;                                //开始标志位
  12. uchar receivebit=0;                                //接收到第几位
  13. uchar stop_receive=0;                        //接收停止位
  14. uchar stop_switch=0;                        //停止转换位
  15. uchar success_check=0;                        //校验成功位

  16. uchar t0time[33];                        //引导位+16地址位+16命令位
  17. uchar tl0time[33];
  18. uchar NM[4];
  19.                                
  20.        
  21. void Init(void);
  22. void InitInt0(void);
  23. void Inittime0(void);
  24. void Inittime1(void);
  25. //void Delayms(uchar delayms);
  26. //void CheckData(void);

  27. void main()
  28. {
  29.         uchar n;
  30.         uchar m;
  31.         Init();
  32.         InitInt0();
  33.         Inittime0();
  34.         Inittime1();
  35.         while(1)
  36.         {                                                                             
  37.                                 if(stop_receive==1)
  38.                                 {
  39.                                         stop_receive=0;

  40.                                         if(sign == 1)
  41.                                         {
  42.                                         ES=0;
  43.                                         sign=0;                                  //接受中断干涉发送中断
  44.                                         for(n=0; n<33; n++)
  45.                                         {
  46.                                                 SBUF=t0time[n];
  47.                                                 while(TI == 0);
  48.                                                 TI=0;
  49.                                         }
  50.                                         ES=1;
  51.                                         }

  52.                                         for(m=0; m<33; m++)
  53.                                         {
  54.                                                 t0time[m]=0;
  55.                                         }
  56.        
  57.                            }
  58.         }               
  59. }

  60. void Init(void)
  61. {
  62.         P3=0xff;       
  63.         P1=0xff;
  64. //        PT0=1;       //time0高优先级
  65. }
  66. void InitInt0(void)
  67. {
  68.         IT0=1;
  69.         EX0=1;
  70.        
  71. }

  72. void Inittime0(void)
  73. {
  74.         TMOD=0x22;
  75.         TH0=6;
  76.         TL0=6;         
  77.         TR0=0;
  78.         ET0=1;
  79.         EA=1;       
  80. }
  81. void Inittime1(void)
  82. {
  83.         SM0=0;
  84.         SM1=1;
  85.         REN=1;
  86.         TH1=0xfd;
  87.         TL1=0xfd;
  88.         ES=1;
  89.         TR1=1;
  90. }

  91. /*void    Delayms(uchar delayms)
  92. {
  93.         uchar i,j;
  94.         while(delayms--)
  95.         {
  96.                 for(i=4; i>0; i--)
  97.                 for(j=0; j<50; j++);
  98.         }
  99. }                                 */
  100. /*void CheckData(void)                 //地址和命令,发送时从低位开始 //数据处理
  101. {
  102.          uchar i=0;
  103.          uchar n=0,m=0;
  104.          if(stop_receive==1)          //成功接收完数据,接受完我们将他处理 //处理完之后,我们需要将结束接收标志置0
  105.          {                                                                                //首先我们需要将两个先整合到一个数组
  106.                         
  107.                         for(i=1; i<33; i++)
  108.                         {
  109.                                 t0time[i]=t0time[i]+tl0time[i];
  110.                         }

  111.                          for(m=0; m<4; m++)                                //我们根据t0time[n]和tl0time,也就是t0的值来确认多大
  112.                         {                                                               
  113.                                 for(n=1; n<33; n++)
  114.                                 {
  115.                                          NM[m]>>=1;
  116.                                          if(t0time[n]>4)
  117.                                          {
  118.                                                          NM[m]|=0x80;
  119.                                          }
  120.                                 }
  121.                         }
  122.                        
  123.                         //开始校验
  124.                         if(NM[0] == ~NM[1])
  125.                         {
  126.                                 if(NM[1] == ~NM [2])
  127.                                 {
  128.                                         success_check=1;
  129.                                         stop_receive=0;                   //校验合格,可以置位0,归位,准备下一个
  130.                                 }
  131.                         }
  132.                         else
  133.                         {
  134.                                 buzzer=1;
  135.                         }               
  136.          }
  137. }                                                 */
  138. void iint0() interrupt 0          //接收中断函数   相当于静态的连续接收  IT0=1
  139. {
  140.         uchar i=0;
  141.         //下降沿
  142.         TR0=0; //关定时
  143.         EX0=0; //关本次中断
  144.         if(stop_receive==0)
  145.         {
  146.                 if((t0>16)&&(t0<20))
  147.                 {
  148.                         receivebit=0;             //接收位置0  第一位开始存放
  149.                 }
  150.                 t0time[receivebit]=t0;  //装入t0
  151.                 tl0time[receivebit]=TL0;
  152.                 receivebit++;
  153.                 t0=0;
  154.                 TL0=6;

  155.                 if(receivebit>32)
  156.                 {
  157.                         receivebit=0;
  158.                         stop_receive=1;                 //停止接收标志位
  159.                 }
  160.         }

  161.         EX0=1;
  162.         while((Echo==0)&&(i<=65))                //560us之后会达到高电平 ,需要加条件,防卡死
  163.         {
  164.                  i++;
  165.         }                        
  166.         TR0=1;                         //根据反相码,我们计算高电平持续时间 也就是说,高电平开启定时器,低电平关闭定时器  
  167.         //还是有影响

  168. }

  169. void  time0() interrupt 1           //250us
  170. {
  171.         t0++;

  172.        
  173. // testtl0[n]=TL0;

  174. }

  175. void ser() interrupt 4
  176. {          
  177.         RI=0;
  178.         sign=1;
  179. }

复制代码

  1. #include <REGX51.H>
  2. #define uchar unsigned char
  3. #define uint  unsigned int

  4. #define NEC 32

  5. sbit Echo=P3^2;
  6. sbit buzzer=P2^3;
  7. //uchar testtl0[33];

  8. uchar n=0;                                       
  9. uint  t0=0;
  10. uchar sign=0;                                        //串口可发送标志位
  11. uchar allow_sign=0;                                                                         //校验合格
  12. uchar start=0;
  13. uchar stop=0;   
  14. uchar stop_receive=0;                            //开始标志位
  15. uchar receivebit=0;                                //接收到第几位

  16.                        //接收停止位
  17. uchar stop_switch=0;                        //停止转换位
  18. uchar success_check=0;                        //校验成功位

  19. uchar t0time[32];                        //引导位+16地址位+16命令位
  20. uchar tl0time[32];
  21. uchar NM[4];
  22.                                 
  23.         
  24. void Init(void);
  25. void InitInt0(void);
  26. void Inittime0(void);
  27. void Inittime1(void);
  28. //void Delayms(uchar delayms);
  29. uchar CheckData(void);
  30. uchar StartStop(void);

  31. void main()
  32. {
  33.         uchar n;
  34.   //      uchar m;
  35.         Init();
  36.         InitInt0();
  37.         Inittime0();
  38.         Inittime1();
  39.         while(1)
  40.         {                                                                     
  41.                                 if(CheckData())
  42.                                 {
  43.                                         if(sign == 1)
  44.                                         {
  45.                                         ES=0;
  46.                                         sign=0;                                  //接受中断干涉发送中断
  47.                                         for(n=0; n<4; n++)
  48.                                         {
  49.                                                 SBUF=NM[n];
  50.                                                 while(TI == 0);
  51.                                                 TI=0;
  52.                                         }
  53.                                         ES=1;
  54.                                         }

  55.                                  /*       for(m=0; m<33; m++)
  56.                                         {
  57.                                                 t0time[m]=0;
  58.                                         }
  59.                                                                                                                                                  */
  60.                                 }
  61.         }               
  62. }

  63. void Init(void)
  64. {
  65.         P3=0xff;        
  66.         P1=0xff;
  67.         PT0=1;       //time0高优先级
  68. }
  69. void InitInt0(void)
  70. {
  71.         IT0=1;
  72.         EX0=1;
  73.         
  74. }

  75. void Inittime0(void)
  76. {
  77.         TMOD=0x22;
  78.         TH0=6;
  79.         TL0=6;         
  80.         TR0=0;
  81.         ET0=1;
  82.         EA=1;        
  83. }
  84. void Inittime1(void)
  85. {
  86.         SM0=0;
  87.         SM1=1;
  88.         REN=1;
  89.         TH1=0xfd;
  90.         TL1=0xfd;
  91.         ES=1;
  92.         TR1=1;
  93. }

  94. /*void    Delayms(uchar delayms)
  95. {
  96.         uchar i,j;
  97.         while(delayms--)
  98.         {
  99.                 for(i=4; i>0; i--)
  100.                 for(j=0; j<50; j++);
  101.         }
  102. }                                 */
  103. uchar CheckData(void)               
  104. {
  105.          uchar i=0;
  106.          uchar n=0,m=0;
  107.          if(stop_receive==1)         
  108.          {   
  109.                            stop_receive=0;
  110.                                       
  111.               for(n=0; n<4; n++)
  112.                           {
  113.                                           for(m=0; m<32; m++)
  114.                                         {
  115.                                                 NM[n]>>=1;
  116.                                                 if(t0time[n]*250+tl0time[n] > 1000 )
  117.                                                 {
  118.                                                          NM[n] |= 0x80;
  119.                                                 }
  120.                                         }
  121.                           }
  122.                           if( (NM[2] == ~NM[3]) && (NM[0] == ~NM[1]) )
  123.                           {                                                                 
  124.                                           return 1;
  125.                           }
  126.          }
  127.                  return 0;
  128. }                                                                                                                                       
  129. uchar StartStop(void)
  130. {
  131.         uchar value=1;
  132.         if(receivebit==0)
  133.         {
  134.                 t0=0;
  135.                 TH0=6;
  136.                 TL0=6;
  137.                 TR0=1;
  138. //                i=250;
  139.                 while(Echo==0);
  140. //                {
  141. //                         i--;
  142. //                }
  143.                 TR0=0;
  144. //                i=0;
  145. //                start=t0;                                 // start=21,远远小于,也许是干扰
  146.                 if((t0<30)||(t0>45))
  147.                 {
  148.                         TR0=0;
  149.                         P1=0x01;
  150.                         value=0;               
  151.                 }

  152.                
  153.                 TH0=6;
  154.                 TL0=6;
  155.                 t0=0;
  156.                 TR0=1;
  157. //                i=250;
  158.                 while(Echo==1);
  159. //                {
  160. //                        i--;
  161. //                }
  162.                 TR0=0;
  163. //                i=0;
  164. //                stop=t0;
  165.                 if((t0<10)||(t0>28))         //  stop=10
  166.                 {
  167.                                 TR0=0;
  168.                                 P1=0x02;
  169.                                 value=0;
  170.                                
  171.                 }
  172.                
  173.         }       
  174.         return value;
  175. }                                                
  176. void iint0() interrupt 0          //接收中断函数   相当于静态的连续接收  IT0=1
  177. {         
  178. //         uchar i=0;
  179.          uchar value;       
  180.      EX0=0;   
  181.          value=StartStop();
  182.      if(value==1)
  183.          {
  184.                          TR0=0;
  185.         //                P1=0x04;
  186.                         if(receivebit>31)
  187.             {
  188.                   receivebit=0;
  189.                   stop_receive=1;                       
  190.             }

  191.                         t0time[receivebit]=t0;
  192.                         tl0time[receivebit]=TL0;
  193.                         receivebit++;

  194.                         while(Echo==0)
  195. //                        {
  196. //                                i++;
  197. //                        }
  198. //                        i=0;
  199.                         TR0=1;
  200.                         t0=0;
  201.                         TH0=6;
  202.                         TL0=6;               
  203.          }                                                                         
  204.          EX0=1;
  205. }

  206. void  time0() interrupt 1           //250us
  207. {
  208.         t0++;
  209. }

  210. void ser() interrupt 4
  211. {           
  212.         RI=0;
  213.         sign=1;
  214. }

复制代码

这两个有关联么?

昨天的问题已经改善了。现在出现了新问题, 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
  万分 感谢

不错的文件,值得收藏

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top