標題: 再次被單片機紅外線發(fā)射程序整哭了! [打印本頁]

作者: xjtong    時間: 2019-3-25 14:14
標題: 再次被單片機紅外線發(fā)射程序整哭了!
這是我寫的紅外發(fā)射程序,不成功,不知道錯在哪里了?
我測的晶振是11.030,所以有些定時器數(shù)據(jù)是按11.030計算的.
反復(fù)測試按11.5092和11.030設(shè)置定時器數(shù)據(jù)都不成功,二個差值也不大.

不知道錯在哪里,希望大神指導(dǎo)一下!!!!!

單片機源程序如下:
  1. #include<reg52.h>

  2. #define uint unsigned int
  3. #define uchar unsigned char
  4.         
  5. sbit fs=P1^5;
  6. uchar i;
  7. uchar sj[]={        1,0,0,0,0,0,0,0,   0,1,1,1,1,1,1,1,         0,0,0,0,0,0,0,0,        1,1,1,1,1,1,1,1,        
  8.                
  9. };  //需要發(fā)送的數(shù)據(jù)

  10. void delayns(uchar i)
  11. {
  12. while(i--);
  13. }
  14. void Delay()                //@11.0592MHz
  15. {
  16.         unsigned char i, j, k;

  17.         i = 16;
  18.         j = 19;
  19.         k = 10;
  20.         do
  21.         {
  22.                 do
  23.                 {
  24.                         while (--k);
  25.                 } while (--j);
  26.         } while (--i);
  27. }


  28. void init()
  29. {
  30.         TMOD=0X11;
  31.         EA=1;
  32.         ET0=1;
  33. }

  34. void t0() interrupt 1
  35. {

  36. fs=~fs;
  37.         TR0=0;
  38.         TF0=0;
  39. }

  40. void n1()
  41. {


  42. <strong> </strong>       TH0=0xdf;
  43.         TL0=0x99;        //定時9MS
  44.         fs=0;         //開始發(fā)
  45.         TR0=1;          //開始定時
  46.         while(!TF0);      //中斷變低
  47.         
  48.         TH0=0xEF;   
  49.         TL0=0xcc;            //定時4.5MS
  50.         TR0=1;
  51.         while(!TF0);     //中斷高
  52. }

  53. void s1()
  54. {
  55.         TH0=0xfd;   //定時562US
  56.         TL0=0xfa;
  57.         TR0=1;
  58.         while(!TF0);    //中斷變低
  59.         
  60.         TH0=0xf9;   //定時1654US
  61.         TL0=0xef;
  62.         TR0=1;
  63.         while(!TF0);   //中斷變高
  64. }

  65. void s0()
  66. {
  67.         TL0=0xfa;    //定時562US
  68.         TH0=0xfd;
  69.         TR0=1;        //中斷變低
  70.         while(!TF0);
  71.         
  72.         TL0=0xfa;   //定時562US
  73.         TH0=0xfd;
  74.         TR0=1;
  75.         while(!TF0);     //中斷變高
  76.         
  77. }

  78. void main()
  79. {

  80.         init();

  81.         while(1)
  82.         {
  83.         n1();
  84.         for(i=0;i<32;i++){if(sj[i]==0)s0();else {s1();}}
  85.         delayns(58);fs=1;   //結(jié)束號562US后變低
  86.         Delay();        
  87.                 }
  88.         
  89. }
復(fù)制代碼



作者: xjtong    時間: 2019-3-25 14:20
我覺得還有2個問題
1.波型差不多是對了的, 有可以延時問題.
2.可能是協(xié)議理解不對,發(fā)送數(shù)據(jù)格式不對.什么低位開始發(fā),或者是數(shù)據(jù)發(fā)送時間間隔錯了.
作者: diy1997    時間: 2019-3-25 21:17
一般紅外遙控是調(diào)制38KHZ的載波。

你的載波是外掛的?
作者: xjtong    時間: 2019-3-25 23:17
diy1997 發(fā)表于 2019-3-25 21:17
一般紅外遙控是調(diào)制38KHZ的載波。

你的載波是外掛的?

越波是個什么東西呀???????不是太明白你的意思呀.
作者: cns371    時間: 2019-3-26 09:27
是載波,不是越波,你直接把單片機輸出的波形通過紅外發(fā)射頭發(fā)出是不行的。
需要把單片機輸出的波形和38kHz的載波進行調(diào)制,再通過紅外發(fā)射頭發(fā)出。一般集成的紅外接收頭有解調(diào)的功能,能夠把調(diào)制在38kHz上的波形解調(diào)出來,成為正常能夠讀取的信息。
為了實現(xiàn)波形和38kHz載波進行調(diào)制,最簡單的辦法就是:外部加一個38kHz的方波發(fā)生器(也可以用單片機的一個引腳輸出),將該載波和波形通過與門相與,在通過紅外發(fā)射頭發(fā)射。
這個調(diào)制的原理和電話傳輸語音類似,需要把語音信號調(diào)制在高頻的載波上,然后才能進行語音信號的傳輸。
作者: diy1997    時間: 2019-3-26 19:05
xjtong 發(fā)表于 2019-3-25 23:17
越波是個什么東西呀???????不是太明白你的意思呀.

載波,為了發(fā)射方便和抗干擾等目的,

把要發(fā)射的信息搭載在一些波形上發(fā)射,

比如收單機的調(diào)幅,調(diào)頻。

紅處遙控一般用的是頻率為38KHZ的方波。

常用的三個腳的接收頭對38KHz的方波信號很敏感(接收頭有其它頻率的),

當收到38KHZ的方波信號時,輸出腳就輸出低電平,

所以,以常用的NEC編碼協(xié)議的引導(dǎo)碼來說,

你要先發(fā)射9MS的38KHZ的方波,然后停止4.5MS,

接著就是數(shù)據(jù)了......







作者: xjtong    時間: 2019-3-26 19:49


完美的波型!!!!!!!!!!!!!!!!!!!!!

現(xiàn)再還一個問題.
紅外發(fā)射頭的功率非常小,半米內(nèi)有效.

用萬用測了,電流不到200ua,這還是接的8050的三極管,后來用PNP三極管還是一樣的結(jié)果.
什么原因呀?








作者: 7358655    時間: 2019-3-26 21:34
你要先確定你接收有沒有載波,即接收部件有沒有專門的晶振,或震蕩電路,如果有代表有載波,單片機晶振頻率達不到,發(fā)送自然接收不了。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1