欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1833|回復: 1
收起左側

求助:幫助調試一個單片機紅外發射程序

 關閉 [復制鏈接]
ID:134430 發表于 2020-7-24 22:16 | 顯示全部樓層 |閱讀模式
以前沒有弄過紅外發射,這兩天惡補了一下,寫了一個程序調試中出現了問題,先把程序貼出來:

/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

//==== 紅外遙控器發射程序 ====//

  At89s52,   晶振12,

  38KHz,    1/38=26.3μS   
  方波高低各50%,也就是:中斷2次: 26.3/2=13.15μS =13μS

  幾個時序需要的中斷次數的計算:
                     9ms/13μS = 692(次實現)
                   4.5ms/13   = 346
                                  0.56ms/13   = 43
                                  1.69ms/13   = 130

  定時器初值計算:
                          初值 = 65536 - (f(晶振) * (y)需定時數)/ 12(分頻)
            本例:f=12    y=13μS
                        計算:初值 = 65536-13 = 65523 = fff3

  紅外傳輸發射協議:
                          引導碼+16位用戶數據碼+8位設備碼+8位識別反碼

            引導碼: 9ms高電平 + 4.5ms低電平
                        
                        用戶碼和設備碼中:
                              “1”: 0.56ms高電平 + 1.69ms低電平
                                  “0”: 0.56ms低電平 + 0.56ms低電平


&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& */

  1. #include "reg52.h"

  2. #define uint16 unsigned int
  3. #define uchar unsigned char

  4. sbit ir_Tr                        =P1^0;                                 //Transmit 發射                //控制發射管的 i/o,           
  5. #define ir_Tr_on                ir_Tr  = 0                //ir=0;低電平啟動發射
  6. #define ir_Tr_off                ir_Tr  = 1

  7. sbit ir_Re                        =P1^1;                                //Receive  接收    //接收管輸出的i/o
  8. #define ir_Re_True                ir_Re == 1                //接收到信號
  9. #define ir_Re_Fales                ir_Re == 0

  10. sbit led                        = P1^3;                                //接收到信號的指示燈
  11. #define led_on                        led = 0
  12. #define led_off                        led = 1


  13. bit ir_Tr_on_flag=0;                                        //發射標志

  14. uchar irsys[4]={0,1,0x12,~0x12};                //16位用戶碼+設備碼+設備反碼(這里的數值是隨意的)
  15. uint16 count, set_count;                                //13μs中斷計數, 和為得到特定時序的中斷次數


  16. //---- 定時器初始化 ------
  17. void Timer_init()           
  18. {                          
  19.     TMOD=0x11;              //定時器 0、1:均工作在方式 1;

  20.     TH0=0xfc;               //定時器 0 :系統1ms 時標,晶振=12。 =11.0592時:0xfc66
  21.     TL0=0x18;
  22.     ET0=1;                  //允許 0 中斷
  23.     TR0=1;                  //開中斷 0, 本定時器常開!!
  24.         
  25.         TH1=0xff;                                //定時器1為紅外專用:定時13μs
  26.         TL1=0xf3;
  27.         ET1=1;
  28.         TR1=0;                                        //紅外需要時打開!!              

  29.         PT1=1;                                        //定時器1中斷優先

  30.     EA=1;                            //開總中斷
  31. }

  32. //---- (定時器0)中斷:計時器 ----
  33. uint16 ms_time=0;                     //ms級計時
  34. uchar         s_time=0;                    //秒級計時
  35. uint16 msForIr=0;                        //紅外定時啟動、ms級

  36. void Timer0() interrupt 1              
  37. {
  38.     TH0=0xfc;               //1ms 定時,初值
  39.     TL0=0x18;

  40.         msForIr++;                                
  41.         if(msForIr>=200)                //定時發射一次
  42.         {
  43.                 msForIr=0;                        
  44.                 ir_Tr_on;                        //啟動
  45.                 ir_Tr_on_flag=1;        //啟用標志
  46.         }

  47.     ms_time++;                        
  48.     if(ms_time==1000)               
  49.         {
  50.                 ms_time=0;
  51.                 s_time++;                         //秒級計時
  52. //                SecondFor1820++;

  53.                 if(s_time==60)               
  54.                 {
  55.                         s_time=0;               
  56. //                        MinuteForPump++;        //泵啟動計時
  57.                 }
  58.         }
  59. }

  60. //---- (定時器1)中斷:38KHz紅外專用 -----
  61. void Timer1() interrupt 3              
  62. {
  63.     TH1=0xff;               //13μs 定時 初值
  64.     TL1=0xf3;

  65.         count++;                                //中斷次數                                

  66.         ir_Tr=~ir_Tr;                        //方波高、低波換向
  67. }


  68. //----- 發射計時 -----
  69. void ir_On()
  70. {
  71.         count=0;                           
  72.         TR1=1;
  73.         while(count<set_count);         //         1
  74.         TR1=0;
  75. }

  76. //----- 發送一個字節(8位)--------
  77. void ir_sendbyte(uchar n)                        
  78. {
  79.         uchar i;
  80.         for(i=0;i<8;i++)
  81.         {
  82.                 if(n & 0x01)                                //發射高電平         
  83.                 {
  84.                         set_count = 130;               
  85.                 }
  86.                 else                                                //發射低電平
  87.                 {
  88.                         set_count=43;
  89.                 }

  90.                 ir_On();

  91.                 n>>=1;                                                //從低位開始發送
  92.         }
  93. }

  94. //---- 發送數據 --------
  95. void ir_Send()                                                
  96. {
  97.         uchar i;
  98.         
  99.         set_count=692;                                        //9ms高電平引導   
  100.         ir_On();

  101.         set_count=346;                                        //4.5ms低電平引導   
  102.         ir_On();

  103.         for(i=0;i<4;i++)                                //連續發射16位用戶碼和設備碼及它的反碼
  104.         {
  105.                 ir_sendbyte(irsys[i]);
  106.         }
  107. }

  108. //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

  109. void main()
  110. {
  111.         Timer_init();

  112.         while(1)
  113.         {
  114.                 if(ir_Tr_on_flag)                        //發射
  115.                 {
  116.                         ir_Send();
  117.                         ir_Tr_on_flag=0;
  118.                         ir_Tr_off;               
  119.                 }

  120.         if(ir_Re_True)                                //接收
  121.         {
  122.                         led_on;
  123.         }
  124.         else
  125.         {
  126.                         led_off;
  127.         }
  128.         }
  129. }


  130. //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
復制代碼



問題是:
紅外發射專用計時器(定時器1)出現如下情況,看圖:

=================================


截圖05.JPG

==================================

截圖06.JPG
===============================
上圖的定時器值是FF,FA;再一個單步就是下圖的00 04 了,再一單步就重裝初值。
這個定時器初值是TH1=0XFF,  TL1=0XF3,  定時13μs,重裝初值時TH1是不應該變的,
由于這一變,定時值變為了22μs,多出了9μs,
實際定時值是通過上圖所示的sec算出的,定時器1工作方式1,換成工作方式0也不行,
弄一天 了,找不出原因了,望高手們出手相幫,先謝謝了!!

截圖06.JPG
回復

使用道具 舉報

ID:134430 發表于 2020-7-24 23:41 | 顯示全部樓層
補充一下,問題是在程序運行到 void ir_on() 時出現
截圖07.jpg
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表