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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機模擬紅外發射源程序IR-send

  [復制鏈接]
跳轉到指定樓層
樓主
ID:274228 發表于 2018-1-10 12:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機源程序如下:
  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)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:375198 發表于 2018-7-19 22:15 | 只看該作者
好帖子,感謝樓主
回復

使用道具 舉報

板凳
ID:251357 發表于 2018-9-26 09:21 | 只看該作者
趕上寫論文,繼續啊,找了好多資料,都看的云里霧里的
回復

使用道具 舉報

地板
ID:402560 發表于 2018-9-26 10:16 | 只看該作者
好資料,謝謝。
回復

使用道具 舉報

5#
ID:92827 發表于 2018-10-31 21:30 | 只看該作者
下載下來,試一試
回復

使用道具 舉報

6#
ID:326450 發表于 2018-11-13 16:28 | 只看該作者
感謝樓主的分享
回復

使用道具 舉報

7#
ID:404210 發表于 2018-11-18 21:28 | 只看該作者
最近在看有關紅外發射,試了一下樓主12M晶振下的程序,抓到的一個波形,不知道是不是正確的,樓主大神能不能提供發送的波形,和接受到的波形呢,根據程序沒能推出抓到的波形對不對
回復

使用道具 舉報

8#
ID:585455 發表于 2019-7-27 17:40 | 只看該作者
感謝無私分享
回復

使用道具 舉報

9#
ID:617652 發表于 2019-9-28 22:52 | 只看該作者
請問一下這個接線是怎么接的呀,我在做一個把ad轉換獲得的數字信號通過紅外發射,只用一個紅外發射管的話可以發送嗎,怎么接線呀
回復

使用道具 舉報

10#
ID:51443 發表于 2020-3-14 09:15 | 只看該作者
這個程序我用STC試了一下,24M只是比12M好些。關鍵是9+4.5的引導有時竟成6.6+3.3,難道是按鍵產生的干擾影響了中斷?
回復

使用道具 舉報

11#
ID:51443 發表于 2020-3-19 15:05 | 只看該作者
發現這個周期26us很準,但占空比不確定,不知道是怎么回事?
回復

使用道具 舉報

12#
ID:51443 發表于 2020-3-21 11:20 | 只看該作者
職教電子 發表于 2020-3-19 15:05
發現這個周期26us很準,但占空比不確定,不知道是怎么回事?

終于解決了,準確率100%.
回復

使用道具 舉報

13#
ID:67274 發表于 2020-4-5 14:47 | 只看該作者
本帖最后由 a461624201 于 2020-4-5 17:13 編輯

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

紅外發射.zip

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

回復

使用道具 舉報

14#
ID:770066 發表于 2020-6-5 10:05 | 只看該作者
謝謝樓主分享,好評
回復

使用道具 舉報

15#
ID:770066 發表于 2020-7-1 10:47 | 只看該作者
職教電子 發表于 2020-3-14 09:15
這個程序我用STC試了一下,24M只是比12M好些。關鍵是9+4.5的引導有時竟成6.6+3.3,難道是按鍵產生的干擾影 ...

您好問下,這個問題怎么解決的,測試中也是遇到引導碼變成6.6+3.3,非常感謝
回復

使用道具 舉報

16#
ID:194006 發表于 2021-8-2 16:10 | 只看該作者

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频观看 | 欧洲精品在线观看 | 亚洲一区二区精品视频 | 黄色大片免费播放 | 国产一区二区三区四区 | 国产无套一区二区三区久久 | 一区精品在线观看 | 成年人免费在线视频 | 成年人在线观看 | 久久久久久久一区二区三区 | 欧美精品在线一区 | 国产综合在线视频 | www.日韩| 精品视频在线播放 | 米奇狠狠鲁 | 午夜成人免费视频 | 色视频网站 | 色综合成人网 | 日本午夜在线视频 | 亚洲视频中文字幕 | 亚洲欧美日韩国产综合 | 午夜在线| 国产精品久久久久久久久久免费看 | 91www在线观看| 中文字幕高清 | 日韩中文视频 | 99久久精品免费看国产四区 | 国产精品区一区二区三 | 久久91av | www..99re| 国产在线永久免费 | 成人免费看片又大又黄 | 成人在线精品视频 | 一级毛片观看 | 在线观看亚洲专区 | 亚洲国产精品一区二区www | 久色视频在线观看 | 精品国产乱码久久久久久久久 | 成人精品一区 | 狠狠久久综合 | 91精品在线看 |