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

標題: 單片機模擬紅外發射源程序IR-send [打印本頁]

作者: uid0416    時間: 2018-1-10 12:35
標題: 單片機模擬紅外發射源程序IR-send
單片機源程序如下:
  1. 單片機模擬紅外遙控器發射的C語言程序
  2. //********************************************單片機紅外發射*******************************************
  3. #include "reg52.h"
  4. sbit ir=P1^0;//紅外發射管控制腳,使用24M晶振
  5. sbit ka=P2^0;
  6. sbit kb=P2^1;
  7. unsigned int count, set_count; //中斷計數,設定中斷次數
  8. bit irflag,keyflag;   //紅外發送標志位,按鍵標志位
  9. unsigned char irsys[]={0x00,0xff};//16位用戶碼
  10. unsigned char irdata,ircode; //發送的紅外數據
  11. //---------------------------------------------------------------------------
  12. void delay(unsigned int a)//延時約1ms,晶振24M ,此處延時不需很精確
  13. {
  14. unsigned char i;
  15. while(--a!=0)
  16. for(i=300;i>0;i--); //若是12M晶振i=125
  17. }
  18. //---------------------------------------------------------------------------
  19. void keyscan() // 按鍵掃描
  20. {
  21.    if(ka==0){keyflag=1;irdata=0x0a;} //a鍵按下,則發射數據0x0a
  22.        if(kb==0){keyflag=1;irdata=0x0b;} //b鍵按下,則發射數據0x0b
  23. }
  24. //---------------------------------------------------------------------------
  25. void ir_sendbyte()    //紅外發送一個字節數據
  26. {
  27. unsigned char i;
  28. for(i=0;i<8;i++)    //發送8位數據
  29. {
  30.    set_count=43;//35; //發送編碼中的0.56ms高電平 (//后為12M晶振下的數值)
  31.    irflag=1;      //啟動紅外發射二極管發射
  32.    count=0;     //中斷計數先清0
  33.    TR0=1;      //開啟定時器0
  34.    while(count<set_count); //等待發送完
  35.    TR0=0; //關閉定時器0
  36.     if(ircode&0x01) set_count=130;//130; //判斷紅外編碼最低位,若為1則1.69ms的低電平 (//后為12M晶振下的數值)
  37.      else set_count=43;//35;    //為0則0.565ms的低電平 (//后為12M晶振下的數值)
  38.    irflag=0; //低電平則不發射
  39.    count=0; //中斷計數清0
  40.    TR0=1; //開啟定時器0
  41.    while(count<set_count); //等待發送完
  42.    TR0=0; //關閉定時器0
  43.    ircode=ircode>>1; //將數據右移,即從低位到高位發送
  44. }
  45. }
  46. //---------------------------------------------------------------------------
  47. void ir_send() //發送紅外數據
  48. {
  49. set_count=692;//672; //發送編碼中的引導碼(9ms高電平+4.5ms低電平) (//后為12M晶振下的數值)
  50. irflag=1;    //啟動紅外發射二極管發射
  51. count=0;    //中斷計數清0
  52. TR0=1;
  53. while(count<set_count);
  54. TR0=0;
  55. set_count=346;//336; //發送編碼中的4.5ms低電平(//后為12M晶振下的數值)
  56. irflag=0; //低電平則不發射
  57. count=0;
  58. TR0=1;
  59. while(count<set_count); //等待發送完
  60. TR0=0;
  61. ircode=irsys[0]; //發送16位用戶碼的前1-8位
  62. ir_sendbyte();
  63. ircode=irsys[1]; //發送16位用戶碼的前9-16位
  64. ir_sendbyte();
  65. ircode=irdata;   //發送8位數據碼
  66. ir_sendbyte();
  67. ircode=~irdata; //發送8位數據反碼
  68. ir_sendbyte();
  69. set_count=43;//35; //發送編碼中的0.56ms高電平 (//后為12M晶振下的數值)
  70. irflag=1;
  71. count=0;
  72. TR0=1;
  73. while(count<set_count);
  74. TR0=0;
  75. ir=1;
  76. delay(23);    //延時23ms(編碼中的23ms低電平)
  77. set_count=692;//670; //發送編碼中的引導碼(9ms高電平+4.5ms低電平) (//后為12M晶振下的數值)
  78. irflag=1;
  79. count=0;
  80. TR0=1;
  81. while(count<set_count);
  82. TR0=0;
  83. set_count=346;//336; //發送編碼中的4.5ms低電平(//后為12M晶振下的數值)
  84. irflag=0;
  85. count=0;
  86. TR0=1;
  87. while(count<set_count);
  88. TR0=0;
  89. set_count=43;//35;   //發送編碼中的0.56ms高電平 (//后為12M晶振下的數值)
  90. irflag=1;
  91. count=0;
  92. TR0=1;
  93. while(count<set_count);
  94. TR0=0;
  95. ir=1;    //發射完了關閉紅外發射二極管
  96. }
  97. //---------------------------------------------------------------------------
  98. void timer0_init()    //定時器初始化
  99. {
  100. EA=1;
  101. TMOD=0x02;     //定時0 8位自動重裝模式
  102. ET0=1;
  103. TH0=0xe6;//0xf3;   //定時13us,38K紅外矩形波,晶振24M (//后為12M晶振下的數值)
  104. TL0=0xe6;   
  105. }
  106. //---------------------------------------------------------------------------
  107. void main()
  108. {
  109. timer0_init(); //定時0初始化
  110. count=0;     //中斷計數先清0
  111. irflag=0;     //紅外發射標志先置0
  112. while(1)
  113. {
  114. keyscan();   //鍵值掃描
  115.    if(keyflag)   //若有按鍵按下
  116.    {
  117.     delay(10);
  118.     ir_send();   //發送紅外編碼
  119.     delay(500);
  120.     keyflag=0;   //按鍵標志清零
  121. delay(100);
  122.    }
  123. }
  124. }
  125. //---------------------------------------------------------------------------
  126. void timer0() interrupt 1 //定時器0中斷
  127. {
  128. count++;
  129. if(irflag==1) ir=~ir; //有發射標志,則發射38khz的矩形波
  130.    else ir=1;     //否則不發射,即相當于發射編碼中的低電平
  131. }
  132. /*說明:本人經多次調試發現若在24M晶振下使用,發射很正常,而在12M晶振下發射的數據則穩定性要差很多,正在完善中*/
  133. /*程序編寫:落葉*/
復制代碼

所有資料51hei提供下載:
IR--send(單片機模擬紅外發射) c.rar (1.53 KB, 下載次數: 205)



作者: chanofeng    時間: 2018-7-19 22:15
好帖子,感謝樓主
作者: vnbo    時間: 2018-9-26 09:21
趕上寫論文,繼續啊,找了好多資料,都看的云里霧里的
作者: wade_tan    時間: 2018-9-26 10:16
好資料,謝謝。
作者: littlejia    時間: 2018-10-31 21:30
下載下來,試一試
作者: 鈴戀仙    時間: 2018-11-13 16:28
感謝樓主的分享
作者: 橘子先生    時間: 2018-11-18 21:28
最近在看有關紅外發射,試了一下樓主12M晶振下的程序,抓到的一個波形,不知道是不是正確的,樓主大神能不能提供發送的波形,和接受到的波形呢,根據程序沒能推出抓到的波形對不對
作者: jemery1030    時間: 2019-7-27 17:40
感謝無私分享
作者: 1530974286    時間: 2019-9-28 22:52
請問一下這個接線是怎么接的呀,我在做一個把ad轉換獲得的數字信號通過紅外發射,只用一個紅外發射管的話可以發送嗎,怎么接線呀
作者: 職教電子    時間: 2020-3-14 09:15
這個程序我用STC試了一下,24M只是比12M好些。關鍵是9+4.5的引導有時竟成6.6+3.3,難道是按鍵產生的干擾影響了中斷?
作者: 職教電子    時間: 2020-3-19 15:05
發現這個周期26us很準,但占空比不確定,不知道是怎么回事?
作者: 職教電子    時間: 2020-3-21 11:20
職教電子 發表于 2020-3-19 15:05
發現這個周期26us很準,但占空比不確定,不知道是怎么回事?

終于解決了,準確率100%.
作者: a461624201    時間: 2020-4-5 14:47
本帖最后由 a461624201 于 2020-4-5 17:13 編輯

發個我對這個程序理解,stc15f104e,未測試,邏輯分析儀查看沒錯。

紅外發射.zip

43.42 KB, 下載次數: 34, 下載積分: 黑幣 -5


作者: 行者無邊    時間: 2020-6-5 10:05
謝謝樓主分享,好評
作者: 行者無邊    時間: 2020-7-1 10:47
職教電子 發表于 2020-3-14 09:15
這個程序我用STC試了一下,24M只是比12M好些。關鍵是9+4.5的引導有時竟成6.6+3.3,難道是按鍵產生的干擾影 ...

您好問下,這個問題怎么解決的,測試中也是遇到引導碼變成6.6+3.3,非常感謝
作者: kavin21513    時間: 2021-8-2 16:10

在12M晶振下發射的數據則穩定性要差很多的原因:
實驗發現, 采用12M的晶振,中斷最少要20us,也就是周期最少要40us了
如果采用24M晶振,就可以13us中斷,產生周期為26us的38K載波.
所以要采用24M晶振.不然速度不夠.




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1