找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 11377|回復(fù): 15
收起左側(cè)

單片機(jī)模擬紅外發(fā)射源程序IR-send

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

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


評(píng)分

參與人數(shù) 2黑幣 +2 收起 理由
1835886 + 1 淡定
vnbo + 1 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:375198 發(fā)表于 2018-7-19 22:15 | 顯示全部樓層
好帖子,感謝樓主
回復(fù)

使用道具 舉報(bào)

ID:251357 發(fā)表于 2018-9-26 09:21 | 顯示全部樓層
趕上寫(xiě)論文,繼續(xù)啊,找了好多資料,都看的云里霧里的
回復(fù)

使用道具 舉報(bào)

ID:402560 發(fā)表于 2018-9-26 10:16 | 顯示全部樓層
好資料,謝謝。
回復(fù)

使用道具 舉報(bào)

ID:92827 發(fā)表于 2018-10-31 21:30 | 顯示全部樓層
下載下來(lái),試一試
回復(fù)

使用道具 舉報(bào)

ID:326450 發(fā)表于 2018-11-13 16:28 | 顯示全部樓層
感謝樓主的分享
回復(fù)

使用道具 舉報(bào)

ID:404210 發(fā)表于 2018-11-18 21:28 | 顯示全部樓層
最近在看有關(guān)紅外發(fā)射,試了一下樓主12M晶振下的程序,抓到的一個(gè)波形,不知道是不是正確的,樓主大神能不能提供發(fā)送的波形,和接受到的波形呢,根據(jù)程序沒(méi)能推出抓到的波形對(duì)不對(duì)
回復(fù)

使用道具 舉報(bào)

ID:585455 發(fā)表于 2019-7-27 17:40 | 顯示全部樓層
感謝無(wú)私分享
回復(fù)

使用道具 舉報(bào)

ID:617652 發(fā)表于 2019-9-28 22:52 | 顯示全部樓層
請(qǐng)問(wèn)一下這個(gè)接線是怎么接的呀,我在做一個(gè)把a(bǔ)d轉(zhuǎn)換獲得的數(shù)字信號(hào)通過(guò)紅外發(fā)射,只用一個(gè)紅外發(fā)射管的話可以發(fā)送嗎,怎么接線呀
回復(fù)

使用道具 舉報(bào)

ID:51443 發(fā)表于 2020-3-14 09:15 | 顯示全部樓層
這個(gè)程序我用STC試了一下,24M只是比12M好些。關(guān)鍵是9+4.5的引導(dǎo)有時(shí)竟成6.6+3.3,難道是按鍵產(chǎn)生的干擾影響了中斷?
回復(fù)

使用道具 舉報(bào)

ID:51443 發(fā)表于 2020-3-19 15:05 | 顯示全部樓層
發(fā)現(xiàn)這個(gè)周期26us很準(zhǔn),但占空比不確定,不知道是怎么回事?
回復(fù)

使用道具 舉報(bào)

ID:51443 發(fā)表于 2020-3-21 11:20 | 顯示全部樓層
職教電子 發(fā)表于 2020-3-19 15:05
發(fā)現(xiàn)這個(gè)周期26us很準(zhǔn),但占空比不確定,不知道是怎么回事?

終于解決了,準(zhǔn)確率100%.
回復(fù)

使用道具 舉報(bào)

ID:67274 發(fā)表于 2020-4-5 14:47 | 顯示全部樓層
本帖最后由 a461624201 于 2020-4-5 17:13 編輯

發(fā)個(gè)我對(duì)這個(gè)程序理解,stc15f104e,未測(cè)試,邏輯分析儀查看沒(méi)錯(cuò)。

紅外發(fā)射.zip

43.42 KB, 下載次數(shù): 34, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

ID:770066 發(fā)表于 2020-6-5 10:05 | 顯示全部樓層
謝謝樓主分享,好評(píng)
回復(fù)

使用道具 舉報(bào)

ID:770066 發(fā)表于 2020-7-1 10:47 | 顯示全部樓層
職教電子 發(fā)表于 2020-3-14 09:15
這個(gè)程序我用STC試了一下,24M只是比12M好些。關(guān)鍵是9+4.5的引導(dǎo)有時(shí)竟成6.6+3.3,難道是按鍵產(chǎn)生的干擾影 ...

您好問(wèn)下,這個(gè)問(wèn)題怎么解決的,測(cè)試中也是遇到引導(dǎo)碼變成6.6+3.3,非常感謝
回復(fù)

使用道具 舉報(bào)

ID:194006 發(fā)表于 2021-8-2 16:10 | 顯示全部樓層

在12M晶振下發(fā)射的數(shù)據(jù)則穩(wěn)定性要差很多的原因:
實(shí)驗(yàn)發(fā)現(xiàn), 采用12M的晶振,中斷最少要20us,也就是周期最少要40us了
如果采用24M晶振,就可以13us中斷,產(chǎn)生周期為26us的38K載波.
所以要采用24M晶振.不然速度不夠.
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表