久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1652|回復: 1
打印 上一主題 下一主題
收起左側

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

 關閉 [復制鏈接]
跳轉到指定樓層
樓主
以前沒有弄過紅外發射,這兩天惡補了一下,寫了一個程序調試中出現了問題,先把程序貼出來:

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

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

  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)出現如下情況,看圖:

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




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


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

截圖06.JPG (27.72 KB, 下載次數: 63)

截圖06.JPG
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:134430 發表于 2020-7-24 23:41 | 只看該作者
補充一下,問題是在程序運行到 void ir_on() 時出現

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产 日韩 欧美 中文 在线播放 | 性色在线| 成人福利视频网站 | 日韩毛片在线视频 | 国产精品久久久久av | 久久99国产精一区二区三区 | 亚洲第一色av | 日韩在线观看 | 毛片1 | 伊人久久综合 | 免费日本视频 | 婷婷色在线| 蜜桃视频一区二区三区 | 久久久精彩视频 | 四虎影视免费观看 | 麻豆hd| av电影手机在线看 | 成人毛片在线观看 | 青青艹在线视频 | 一区二区三区精品视频 | 国产麻豆乱码精品一区二区三区 | 中文字幕三区 | 日韩三级在线 | 日本精品久久久久久久 | 拍真实国产伦偷精品 | 亚洲视频在线看 | 亚洲国产精品久久久久 | av手机免费在线观看 | 午夜成人在线视频 | 伊人久久国产 | 337p日本欧洲亚洲大胆精蜜臀 | 久久欧美精品 | 午夜欧美 | 日韩久久综合网 | 日韩亚洲一区二区 | 91精品久久久久久久 | 欧美一级片在线观看 | 欧美亚洲国产精品 | 日韩欧美一区二区三区免费观看 | 欧美激情va永久在线播放 | av午夜电影 |