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

標題: 單片機紅外發射程序與原理詳解 [打印本頁]

作者: huoguo    時間: 2018-12-3 21:25
標題: 單片機紅外發射程序與原理詳解
用AT89S51單片機制作紅外電視遙控器

制作的實物如下圖所示:


  一般紅外電視遙控器的輸出都是用編碼后串行數據對38~40kHz的方波進行脈沖幅度調制而產生的。
  當發射器按鍵按下后,即有遙控碼發出,所按的鍵不同遙控編碼也不同。這種遙控碼具有以下特征:
  采用脈寬調制的串行碼,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進制的“0”;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進制的“1”。
  上述“0”和“1”組成的32位二進制碼經38kHz的載頻進行二次調制,然后再通過紅外發射二極管產生紅外線向空間發射。一般電視遙控器的遙控編碼是連續的32位二進制碼組,其中前16位為用戶識別碼,能區別不同的紅外遙控設備,防止不同機種遙控碼互相干擾。后16位為8位的操作碼和8位的操作反碼,用于核對數據是否接收準確。
  根據紅外編碼的格式,發送數據前需要先發送9ms的起始碼和4.5ms的結果碼。
  遙控串行數據編碼波形如下圖所示:
  接收方一般使用TL0038一體化紅外線接收器進行接收解碼,當TL0038接收到38kHz紅外信號時,輸出端輸出低電平,否則為高電平。所以紅外遙控器發送紅外信號時,參考上面遙控串行數據編碼波形圖,在低電平處發送38kHz紅外信號,高電平處則不發送紅外信號。
  單片機紅外電視遙控器電路圖如下:

單片機程序源碼:
  1. #include <AT89X51.h>
  2. static bit OP;        //紅外發射管的亮滅
  3. static unsigned int count;       //延時計數器
  4. static unsigned int endcount; //終止延時計數
  5. static unsigned char flag;      //紅外發送標志
  6. char iraddr1;  //十六位地址的第一個字節
  7. char iraddr2;  //十六位地址的第二個字節
  8. void SendIRdata(char p_irdata);
  9. void delay();
  10. void main(void)
  11. {
  12.   count = 0;
  13.   flag = 0;
  14.   OP = 0;
  15.   P3_4 = 0;
  16.   EA = 1; //允許CPU中斷
  17.   TMOD = 0x11; //設定時器0和1為16位模式1
  18.   ET0 = 1; //定時器0中斷允許

  19.   TH0 = 0xFF;
  20.   TL0 = 0xE6; //設定時值0為38K 也就是每隔26us中斷一次  
  21.   TR0 = 1;//開始計數
  22.   iraddr1=3;
  23.   iraddr2=252;

  24.   do{
  25.       delay();
  26.       SendIRdata(12);
  27.   }while(1);
  28. }
  29. //定時器0中斷處理
  30. void timeint(void) interrupt 1
  31. {
  32.   TH0=0xFF;
  33.   TL0=0xE6; //設定時值為38K 也就是每隔26us中斷一次
  34.   count++;
  35.   if (flag==1)
  36.   {
  37.     OP=~OP;
  38.   }
  39.   else
  40.   {
  41.     OP = 0;
  42.   }
  43.   P3_4 = OP;
  44. }

  45. void SendIRdata(char p_irdata)
  46. {
  47.   int i;
  48.   char irdata=p_irdata;
  49.   //發送9ms的起始碼
  50.   endcount=223;
  51.   flag=1;
  52.   count=0;
  53.   do{}while(count<endcount);
  54.   //發送4.5ms的結果碼
  55.   endcount=117
  56.   flag=0;
  57.   count=0;
  58.   do{}while(count<endcount);
  59.   //發送十六位地址的前八位
  60.   irdata=iraddr1;
  61.   for(i=0;i<8;i++)
  62.   {
  63.      //先發送0.56ms的38KHZ紅外波(即編碼中0.56ms的低電平)
  64.      endcount=10;
  65.      flag=1;
  66.      count=0;
  67.      do{}while(count<endcount);
  68. //停止發送紅外信號(即編碼中的高電平)
  69.      if(irdata-(irdata/2)*2)  //判斷二進制數個位為1還是0
  70.      {
  71.        endcount=41;  //1為寬的高電平
  72.      }
  73.     else
  74.      {
  75.      endcount=15;   //0為窄的高電平
  76.      }
  77.     flag=0;
  78.     count=0;
  79.     do{}while(count<endcount);
  80.     irdata=irdata>>1;
  81.   }
  82.   //發送十六位地址的后八位
  83.   irdata=iraddr2;
  84.   for(i=0;i<8;i++)
  85.   {
  86.      endcount=10;
  87.      flag=1;
  88.      count=0;
  89.      do{}while(count<endcount);
  90.      if(irdata-(irdata/2)*2)
  91.      {
  92.         endcount=41;
  93.      }
  94.      else
  95.      {
  96.        endcount=15;
  97.      }
  98.      flag=0;
  99.      count=0;
  100.      do{}while(count<endcount);
  101.      irdata=irdata>>1;
  102.   }
  103.   //發送八位數據
  104.   irdata=p_irdata;
  105.   for(i=0;i<8;i++)
  106.   {
  107.      endcount=10;
  108.      flag=1;
  109.      count=0;
  110.      do{}while(count<endcount);
  111.      if(irdata-(irdata/2)*2)
  112.      {
  113.          endcount=41;
  114.      }
  115.      else
  116.      {
  117.        endcount=15;
  118.      }
  119.      flag=0;
  120.      count=0;
  121.      do{}while(count<endcount);
  122.      irdata=irdata>>1;
  123.   }
  124.   //發送八位數據的反碼
  125.   irdata=~p_irdata;
  126.   for(i=0;i<8;i++)
  127.   {
  128.      endcount=10;
  129.      flag=1;
  130.      count=0;
  131.      do{}while(count<endcount);
  132.      if(irdata-(irdata/2)*2)
  133.      {
  134.          endcount=41;
  135.      }
  136.      else
  137.      {
  138.        endcount=15;
  139.      }
  140.      flag=0;
  141.      count=0;
  142.      do{}while(count<endcount);
  143.      irdata=irdata>>1;
  144.   }
  145.   endcount=10;
  146.   flag=1;
  147.   count=0;
  148.   do{}while(count<endcount);
  149.   flag=0;
  150. }
  151. void delay()
  152. {
  153.   int i,j;
  154.   for(i=0;i<400;i++)
  155.   {
  156.     for(j=0;j<100;j++)
  157.     {
  158.     }
  159.   }
  160. }
復制代碼

以上的Word格式文檔51黑下載地址:
單片機紅外發射(原理與設計程序).doc (126.5 KB, 下載次數: 200)


作者: 1149719013    時間: 2019-12-26 15:33
有沒有用單片機發送矩陣開關紅外信號的程序
作者: shmilyr1213    時間: 2020-1-18 15:42
大神,請問為什么 endcount=223是9ms  endcount=10時是0.56ms。定時器不是26us一次嗎?算迷糊了呀。自學的很多都不懂,務鄙視呀。
作者: cccc888    時間: 2020-1-18 20:35

實測接收頭處的波形,

作者: lyl44    時間: 2020-1-27 18:45
直接驅動?沒用三極管
作者: tieq1952    時間: 2020-1-28 07:58
謝謝分享!!!
作者: 1239225803    時間: 2020-5-14 09:18
你好 在keil上編譯出錯 錯誤信息

作者: 1239225803    時間: 2020-5-14 09:19
你好 在keil上編譯出錯 錯誤信息:Build target 'Target 1'
assembling STARTUP.A51...
compiling aag.c...
AAG.C(59): error C141: syntax error near 'flag'
Target not created
作者: 20563112    時間: 2021-5-11 22:03
1239225803 發表于 2020-5-14 09:19
你好 在keil上編譯出錯 錯誤信息:Build target 'Target 1'
assembling STARTUP.A51...
compiling aag.c. ...

你不會一點C的語法糾錯都不會吧
作者: xxd0708    時間: 2021-5-12 12:55
cccc888 發表于 2020-1-18 20:35
實測接收頭處的波形,

這是用什么工具測試的啊
作者: 20563112    時間: 2021-5-14 17:03
我驗證過了,這個代碼不行
作者: danq    時間: 2021-5-19 11:44
樓主用的是40us溢出,上面是223,117等等...都有重新核算一次,就可以正常運行了
作者: 越南超級人類    時間: 2021-6-27 10:32
1239225803 發表于 2020-5-14 09:19
你好 在keil上編譯出錯 錯誤信息:Build target 'Target 1'
assembling STARTUP.A51...
compiling aag.c. ...

flag附近少了一個分號而已,自己好好看看,不動點腦子不行的
作者: sadv    時間: 2021-6-29 18:48
紅外信號編碼的方式有很多種,樓主說明的只是其中最常見的一種,一般稱為NEC,還有其他很多種不同的編碼,編碼方式不同,解碼的方式自然也就不同,所以應用的時候還是要看具體時哪一種編碼方式
作者: kavin21513    時間: 2021-8-2 16:07
實驗發現, 采用12M的晶振,中斷最少要20us,也就是周期最少要40us了,所以樓主的程序算法上是40us溢出.
如果采用24M晶振,就可以13us中斷,產生周期為26us的38K載波.
所以要采用24M晶振.不然速度不夠.
作者: 飛騰網絡    時間: 2022-2-22 22:03
大師為什么用的兩個晶振 那個左邊那個小IC是干啥的呢




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产精品成av人在线视午夜片 | 91天堂网| 网站黄色在线免费观看 | 国产精品成人一区二区 | av免费网站在线观看 | 男人的天堂在线视频 | 视频一区二区中文字幕 | 成人欧美一区二区三区视频xxx | 中文字幕第九页 | 国产乱码久久久久久 | 99久久精品国产一区二区三区 | 精品欧美一区二区精品久久久 | 亚洲第一在线 | av在线天堂网 | 亚洲国产成人av好男人在线观看 | 亚洲国产成人精 | 天天操综合网 | 免费二区| 免费看a | 欧美性成人 | 成人福利片 | 99精品欧美一区二区蜜桃免费 | 日韩欧美三级 | 盗摄精品av一区二区三区 | 精品乱码一区二区三四区 | 99资源站 | 日本涩涩视频 | 免费人成在线观看网站 | 蜜桃av一区二区三区 | 中文字幕一区二区在线观看 | 亚洲电影一区 | 精品一区精品二区 | www精品| 日韩中文字幕在线视频 | 视频一区二区三区中文字幕 | 超碰成人免费 | 欧美视频第二页 | 午夜tv免费观看 | 99精品久久久久久 | 狠狠av | 久久亚洲视频 |