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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

用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紅外信號,高電平處則不發送紅外信號。
  單片機紅外電視遙控器電路圖如下:

C51程序代碼:
  1. #include<reg52.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. }
復制代碼



  制作的實物如下圖所示:

//STC的為
  1. #include<reg52.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. sbit  HOP=P3^4;

  9. void SendIRdata(char p_irdata);
  10. void delay();

  11. void main(void)
  12. {
  13.   count = 0;
  14.   flag = 0;
  15.   OP = 0;
  16.   HOP = 0;

  17.   EA = 1; //允許CPU中斷
  18.   TMOD = 0x11; //設定時器0和1為16位模式1
  19.   ET0 = 1; //定時器0中斷允許


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

  23.   iraddr1=3;
  24.   iraddr2=252;


  25.   do{
  26.       delay();
  27.       SendIRdata(12);
  28.   }while(1);
  29. }

  30. //定時器0中斷處理
  31. void timeint(void) interrupt 1
  32. {
  33.   TH0=0xFF;
  34.   TL0=0xE6; //設定時值為38K 也就是每隔26us中斷一次
  35.   count++;

  36.   if (flag==1)
  37.   {
  38.     OP=~OP;
  39.   }
  40.   else
  41.   {
  42.     OP = 0;
  43.   }
  44.   HOP = OP;
  45. }


  46. void SendIRdata(char p_irdata)
  47. {
  48.   int i;
  49.   char irdata=p_irdata;

  50.   //發送9ms的起始碼
  51.   endcount=223;
  52.   flag=1;
  53.   count=0;
  54.   do{}while(count<endcount);

  55.   //發送4.5ms的結果碼
  56.   endcount=117;
  57.   flag=0;
  58.   count=0;
  59.   do{}while(count<endcount);

  60.   //發送十六位地址的前八位
  61.   irdata=iraddr1;
  62.   for(i=0;i<8;i++)
  63.   {

  64.      //先發送0.56ms的38KHZ紅外波(即編碼中0.56ms的低電平)
  65.      endcount=10;
  66.      flag=1;
  67.      count=0;
  68.      do{}while(count<endcount);

  69. //停止發送紅外信號(即編碼中的高電平)
  70.      if(irdata-(irdata/2)*2)  //判斷二進制數個位為1還是0
  71.      {
  72.        endcount=41;  //1為寬的高電平
  73.      }
  74.     else
  75.      {
  76.      endcount=15;   //0為窄的高電平
  77.      }
  78.     flag=0;
  79.     count=0;
  80.     do{}while(count<endcount);

  81.     irdata=irdata>>1;
  82.   }

  83.   //發送十六位地址的后八位
  84.   irdata=iraddr2;
  85.   for(i=0;i<8;i++)
  86.   {
  87.      endcount=10;
  88.      flag=1;
  89.      count=0;
  90.      do{}while(count<endcount);

  91.      if(irdata-(irdata/2)*2)
  92.      {
  93.         endcount=41;
  94.      }
  95.      else
  96.      {
  97.        endcount=15;
  98.      }
  99.      flag=0;
  100.      count=0;
  101.      do{}while(count<endcount);

  102.      irdata=irdata>>1;
  103.   }

  104.   //發送八位數據
  105.   irdata=p_irdata;
  106.   for(i=0;i<8;i++)
  107.   {
  108.      endcount=10;
  109.      flag=1;
  110.      count=0;
  111.      do{}while(count<endcount);

  112.      if(irdata-(irdata/2)*2)
  113.      {
  114.          endcount=41;
  115.      }
  116.      else
  117.      {
  118.        endcount=15;
  119.      }
  120.      flag=0;
  121.      count=0;
  122.      do{}while(count<endcount);

  123.      irdata=irdata>>1;
  124.   }

  125.   //發送八位數據的反碼
  126.   irdata=~p_irdata;
  127.   for(i=0;i<8;i++)
  128.   {
  129.      endcount=10;
  130.      flag=1;
  131.      count=0;
  132.      do{}while(count<endcount);

  133.      if(irdata-(irdata/2)*2)
  134.      {
  135.          endcount=41;
  136.      }
  137.      else
  138.      {
  139.        endcount=15;
  140.      }
  141.      flag=0;
  142.      count=0;
  143.      do{}while(count<endcount);

  144.      irdata=irdata>>1;
  145.   }

  146.   endcount=10;
  147.   flag=1;
  148.   count=0;
  149.   do{}while(count<endcount);
  150.   flag=0;
  151. }

  152. void delay()
  153. {
  154.   int i,j;
  155.   for(i=0;i<400;i++)
  156.   {
  157.     for(j=0;j<100;j++)
  158.     {
  159.     }
  160.   }
  161. }
復制代碼



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

使用道具 舉報

沙發
ID:226741 發表于 2018-9-22 14:28 | 只看該作者
寫得很好,受教了
回復

使用道具 舉報

板凳
ID:427563 發表于 2018-11-16 10:22 | 只看該作者
有文件嗎
回復

使用道具 舉報

地板
ID:507659 發表于 2019-4-30 18:09 | 只看該作者
感覺懵了,請問這里為什么能夠判斷出最低位是0還是1? if(irdata-(irdata/2)*2)應該是if((irdata & 0x01)==1)不是好么?
回復

使用道具 舉報

5#
ID:507659 發表于 2019-4-30 18:14 | 只看該作者
if(irdata-(irdata/2)*2)  //判斷二進制數個位為1還是0,,,這里不對吧?應該是if((irdata && 0x01)=1)吧
回復

使用道具 舉報

6#
ID:68969 發表于 2019-5-1 18:09 | 只看該作者
好資料,學習了。
回復

使用道具 舉報

7#
ID:350791 發表于 2019-7-31 13:41 | 只看該作者
haojinling 發表于 2019-4-30 18:14
if(irdata-(irdata/2)*2)  //判斷二進制數個位為1還是0,,,這里不對吧?應該是if((irdata && 0x01)=1 ...

  你 還 需要 回 爐
回復

使用道具 舉報

8#
ID:412391 發表于 2019-9-9 15:25 | 只看該作者
好資料,學習了。
回復

使用道具 舉報

9#
ID:517951 發表于 2020-11-15 16:14 | 只看該作者
收藏待學習
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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