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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 21933|回復(fù): 15
打印 上一主題 下一主題
收起左側(cè)

單片機紅外發(fā)射程序與原理詳解

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:438751 發(fā)表于 2018-12-3 21:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用AT89S51單片機制作紅外電視遙控器

制作的實物如下圖所示:


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

單片機程序源碼:
  1. #include <AT89X51.h>
  2. static bit OP;        //紅外發(fā)射管的亮滅
  3. static unsigned int count;       //延時計數(shù)器
  4. static unsigned int endcount; //終止延時計數(shù)
  5. static unsigned char flag;      //紅外發(fā)送標(biāo)志
  6. char iraddr1;  //十六位地址的第一個字節(jié)
  7. char iraddr2;  //十六位地址的第二個字節(jié)
  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; //設(shè)定時器0和1為16位模式1
  18.   ET0 = 1; //定時器0中斷允許

  19.   TH0 = 0xFF;
  20.   TL0 = 0xE6; //設(shè)定時值0為38K 也就是每隔26us中斷一次  
  21.   TR0 = 1;//開始計數(shù)
  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; //設(shè)定時值為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.   //發(fā)送9ms的起始碼
  50.   endcount=223;
  51.   flag=1;
  52.   count=0;
  53.   do{}while(count<endcount);
  54.   //發(fā)送4.5ms的結(jié)果碼
  55.   endcount=117
  56.   flag=0;
  57.   count=0;
  58.   do{}while(count<endcount);
  59.   //發(fā)送十六位地址的前八位
  60.   irdata=iraddr1;
  61.   for(i=0;i<8;i++)
  62.   {
  63.      //先發(fā)送0.56ms的38KHZ紅外波(即編碼中0.56ms的低電平)
  64.      endcount=10;
  65.      flag=1;
  66.      count=0;
  67.      do{}while(count<endcount);
  68. //停止發(fā)送紅外信號(即編碼中的高電平)
  69.      if(irdata-(irdata/2)*2)  //判斷二進制數(shù)個位為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.   //發(fā)送十六位地址的后八位
  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.   //發(fā)送八位數(shù)據(jù)
  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.   //發(fā)送八位數(shù)據(jù)的反碼
  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. }
復(fù)制代碼

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

評分

參與人數(shù) 1黑幣 +10 收起 理由
z72287 + 10 贊一個!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏15 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:661763 發(fā)表于 2019-12-26 15:33 | 只看該作者
有沒有用單片機發(fā)送矩陣開關(guān)紅外信號的程序
回復(fù)

使用道具 舉報

板凳
ID:227603 發(fā)表于 2020-1-18 15:42 | 只看該作者
大神,請問為什么 endcount=223是9ms  endcount=10時是0.56ms。定時器不是26us一次嗎?算迷糊了呀。自學(xué)的很多都不懂,務(wù)鄙視呀。
回復(fù)

使用道具 舉報

地板
ID:258566 發(fā)表于 2020-1-18 20:35 | 只看該作者

實測接收頭處的波形,
回復(fù)

使用道具 舉報

5#
ID:159575 發(fā)表于 2020-1-27 18:45 來自觸屏版 | 只看該作者
直接驅(qū)動?沒用三極管
回復(fù)

使用道具 舉報

6#
ID:253767 發(fā)表于 2020-1-28 07:58 | 只看該作者
謝謝分享。!
回復(fù)

使用道具 舉報

7#
ID:735528 發(fā)表于 2020-5-14 09:18 | 只看該作者
你好 在keil上編譯出錯 錯誤信息
回復(fù)

使用道具 舉報

8#
ID:735528 發(fā)表于 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
回復(fù)

使用道具 舉報

9#
ID:919701 發(fā)表于 2021-5-11 22:03 | 只看該作者
1239225803 發(fā)表于 2020-5-14 09:19
你好 在keil上編譯出錯 錯誤信息:Build target 'Target 1'
assembling STARTUP.A51...
compiling aag.c. ...

你不會一點C的語法糾錯都不會吧
回復(fù)

使用道具 舉報

10#
ID:885138 發(fā)表于 2021-5-12 12:55 來自觸屏版 | 只看該作者
cccc888 發(fā)表于 2020-1-18 20:35
實測接收頭處的波形,

這是用什么工具測試的啊
回復(fù)

使用道具 舉報

11#
ID:919701 發(fā)表于 2021-5-14 17:03 | 只看該作者
我驗證過了,這個代碼不行
回復(fù)

使用道具 舉報

12#
ID:740383 發(fā)表于 2021-5-19 11:44 | 只看該作者
樓主用的是40us溢出,上面是223,117等等...都有重新核算一次,就可以正常運行了
回復(fù)

使用道具 舉報

13#
ID:577423 發(fā)表于 2021-6-27 10:32 | 只看該作者
1239225803 發(fā)表于 2020-5-14 09:19
你好 在keil上編譯出錯 錯誤信息:Build target 'Target 1'
assembling STARTUP.A51...
compiling aag.c. ...

flag附近少了一個分號而已,自己好好看看,不動點腦子不行的
回復(fù)

使用道具 舉報

14#
ID:887202 發(fā)表于 2021-6-29 18:48 | 只看該作者
紅外信號編碼的方式有很多種,樓主說明的只是其中最常見的一種,一般稱為NEC,還有其他很多種不同的編碼,編碼方式不同,解碼的方式自然也就不同,所以應(yīng)用的時候還是要看具體時哪一種編碼方式
回復(fù)

使用道具 舉報

15#
ID:194006 發(fā)表于 2021-8-2 16:07 | 只看該作者
實驗發(fā)現(xiàn), 采用12M的晶振,中斷最少要20us,也就是周期最少要40us了,所以樓主的程序算法上是40us溢出.
如果采用24M晶振,就可以13us中斷,產(chǎn)生周期為26us的38K載波.
所以要采用24M晶振.不然速度不夠.
回復(fù)

使用道具 舉報

16#
ID:488937 發(fā)表于 2022-2-22 22:03 | 只看該作者
大師為什么用的兩個晶振 那個左邊那個小IC是干啥的呢
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: av在线天堂 | 亚洲国产黄色av | 91精品国产一区二区三区动漫 | 亚洲精品字幕 | 91最新视频 | 成在线人视频免费视频 | 一区二区免费 | 国产精品欧美精品日韩精品 | 久久国产精品免费视频 | 国产精品有限公司 | 欧美日韩精品免费 | 国产精品一二三区在线观看 | 中文字幕在线一区 | 成人免费一区二区三区视频网站 | 久久国产精品91 | 久久久蜜桃 | 午夜在线影院 | 影视先锋av资源噜噜 | 日本成人综合 | 中文字幕在线视频精品 | 午夜精品久久久久久久99黑人 | 精品一二 | 日韩欧美综合 | 国产超碰人人爽人人做人人爱 | 亚洲成人综合在线 | 亚洲一区二区三区免费在线观看 | 午夜男人免费视频 | 亚洲www | 国产精品久久久久久久久久尿 | 91香蕉视频在线观看 | 亚洲在线免费 | 毛片黄片免费看 | 日韩欧美在线视频 | 精品国产精品 | 亚洲综合视频一区 | 日韩精品久久 | 日韩一二三区视频 | 蜜臀网| 午夜欧美一区二区三区在线播放 | 久久精品伊人 | 欧美精三区欧美精三区 |