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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11892|回復: 10
收起左側

單片機紅外遙控開關程序及設計論文下載(資料很詳細)

  [復制鏈接]
ID:232023 發表于 2017-9-9 10:11 | 顯示全部樓層 |閱讀模式
一、發射部分的工作原理

發射系統開始運行時,單片機首先調用程序里面的按鍵掃描子程序,按鍵掃描子 程序不停的掃描 16 個按鍵,檢測是否有按鍵按下,無按鍵按下時,系統處于等待狀 態;一旦有按鍵按下時,單片機根據按鍵值,然后轉入發射子程序,發射子程序根據 預定的要求裝入不同的脈沖個數,然后調制成 40KHz 的載波信號,通過單片機的 P3.5 口發出,為了提高抗干擾和降低能耗,經過三極管放大后然后由紅外發射管想空中發射。


編碼方式是采用碼分編碼,通過不同的脈沖個數來編碼的。不同的脈沖個數代表 不同的編碼,按鍵 0 的編碼的脈沖個數是 2,按鍵1 是 3 個脈沖,依次類推,按鍵 15 是 17 個脈沖。為了接收可靠,第一位碼的碼寬我們設計成 3ms,其余的為 1ms,遙 控的數據幀間大于 10ms。

圖 4.1 P3-5 輸出口編碼波形圖

二、接收部分原理

系統上電初始化后,對單片機的 P3-1 口進行檢測,當紅外線接收管輸出脈沖數 據幀時,第一位碼是低電平時,單片機將啟動中斷程序,實時的接收數據幀,同時對 第一位碼的碼寬進行驗證,如果第一位碼的低電碼寬小于 2ms 時,單片機將作為錯誤處理,如果間隔位高電平脈寬大于 3ms,便結束接收。然后系統根據累加器中的脈沖個數,來執行相應的程序,操作單片機的各個輸出口,來控制小燈的亮滅和顯示發 射端的按鍵值和隊可控亮度小燈進行亮度控制和亮度值顯示。遙控系統的編碼及解碼
圖 4.2



第三節   遙控發射及接收控制程序流程圖



一、 遙控發射控制流程圖


圖 4.3 遙控發射程序控制流程圖

圖 4.3,左邊是發射部分的主程序,先進行初始化,然后執行鍵盤掃描。右邊是 按鍵掃描程序,先是程序不斷掃描鍵盤是否有按鍵按下,如果有按鍵按下,便調用發 射子程序和顯示子程序。



圖 4.4 遙控發射控制流程圖

圖 4.4 是發射過程,首先按照我們自己定義的協議,裝入脈沖個數,第一個脈沖 發送的是 3ms 的脈沖,方便接收端識別,然后發1ms 脈沖,停發是 1ms 脈沖,直到 發完所有的脈沖便結束這個過程


最全單片機紅外開關設計論文預覽:
0.png 0.png 0.png

單片機源程序如下:
  1. #include "reg51.h"
  2. #include "intrins.h"              //_nop_();延時函數用
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit              remoteout=P3^5;              //  遙控輸出口
  6. uchar temp,key;
  7. uint              m;
  8. uchar code              table[]={
  9. 0x3f,0x06,0x5b,0x4f,
  10. 0x66,0x6d,0x7d,0x07,
  11. 0x7f,0x6f,0x77,0x7c,
  12. 0x39,0x5e,0x79,0x71};
  13. /***********延時化函數**********/
  14. void              delayms(uint xms)
  15. {
  16. uint i,j;
  17. for(i=xms;i>0;i--)
  18. for(j=120;j>0;j--);
  19. }
  20. /***********初始化函數**********/
  21. clearmen()
  22. {
  23. remoteout=0;              //關遙控輸出
  24. IE=0x00;              //IE 單片機寄存器              此句表示單片機復位
  25. IP=0x01;              //開啟外部中斷 0
  26. TMOD=0x22;              //單片機工作在方式2 即 8 位自動重裝 模式
  27. TH1=0xf3;              //40KHZ 初值
  28. TL1=0xf3;              //當 TF1 計數溢出時,常數 TH0
  29. 里的常數重裝入 TL1
  30. EA=1;              //開總中斷
  31. }
  32. /***********按鍵顯示函數**********/
  33. void display(uchar num)
  34. {
  35. P0=table[num];
  36. }
  37. /**********發射函數************/
  38. sed()
  39. {
  40. ET1=1;              //開計數器 1 中斷
  41. TR1=1;              //開定時器 1
  42. delayms(3);
  43. ET1=0;              //關
  44. TR1=0;
  45. remoteout=0;              //40KHZ 發 3 毫秒
  46. for(m=key;m>0;m--)
  47. {
  48. delayms(1);              //停 1 毫秒
  49. ET1=1; TR1=1; delayms(1);



  50. ET1=0; TR1=0;
  51. remoteout=0;              //40KHZ 發 1 毫秒
  52. }
  53. delayms(10);
  54. }
  55. tx()              //這個子函數是在發射脈沖個數,
  56. 不同的按鍵裝入不同的按鍵個數
  57. {
  58. switch(key)
  59. {
  60. case 0:key=key+1;sed();break; case 1:key=key+1;sed();break; case 2:key=key+1;sed();break; case 3:key=key+1;sed();break; case 4:key=key+1;sed();break; case 5:key=key+1;sed();break; case 6:key=key+1;sed();break; case 7:key=key+1;sed();break; case 8:key=key+1;sed();break; case 9:key=key+1;sed();break; case 10:key=key+1;sed();break; case 11:key=key+1;sed();break; case 12:key=key+1;sed();break; case 13:key=key+1;sed();break; case 14:key=key+1;sed();break; case 15:key=key+1;sed();break; default:break;
  61. }
  62. }
  63. /***********按鍵掃描函數**********/
  64. void matrixkeyscan()
  65. {
  66. P2=0xfe; temp= P2; temp=temp&0xf0; if(temp!=0xf0)
  67. {
  68. delayms(10);
  69. temp= P2; temp=temp&0xf0; if(temp!=0xf0)
  70. { temp=P2; switch(temp)
  71. {
  72. case 0xee:   key=0;break; case 0xde:    key=1;break; case 0xbe:    key=2;break; case 0x7e:    key=3;break;
  73. }
  74. while(temp!=0xf0)
  75. { temp=P2; temp=temp&0xf0;
  76. }
  77. display(key);



  78. tx();
  79. }
  80. }
  81. P2=0xfd; temp=P2; temp=temp&0xf0; if(temp!=0xf0)
  82. {
  83. delayms(10);
  84. temp=P2; temp=temp&0xf0; if(temp!=0xf0)
  85. { temp=P2; switch(temp)
  86. {
  87. case 0xed:    key=4;break; case 0xdd:   key=5;break; case 0xbd:   key=6;break; case 0x7d:   key=7;break;
  88. }
  89. while(temp!=0xf0)
  90. {
  91. temp=P2;temp=temp&0xf0;
  92. }
  93. display(key);
  94. tx();
  95. }

  96. } P2=0xfb;temp=P2;temp=temp&0xf0; if(temp!=0xf0)
  97. { delayms(10);temp=P2;temp=temp&0xf0; if(temp!=0xf0)
  98. { temp=P2; switch(temp)
  99. {
  100. case 0xeb:              key=8;break; case 0xdb:              key=9;break; case 0xbb:              key=10;break; case 0x7b:              key=11;break;
  101. }
  102. while(temp!=0xf0)
  103. {
  104. temp=P2;temp=temp&0xf0;
  105. }
  106. display(key);
  107. tx();
  108. }
  109. } P2=0xf7;temp=P2;temp=temp&0xf0; if(temp!=0xf0)
  110. {
  111. delayms(10);
  112. temp=P2;



  113. temp=temp&0xf0;
  114. if(temp!=0xf0)
  115. {
  116. temp=P2;
  117. switch(temp)
  118. {
  119. case 0xe7:    key=12;break; case 0xd7:   key=13;break; case 0xb7:    key=14;break; case 0x77:    key=15;break;
  120. }
  121. while(temp!=0xf0)
  122. { temp=P2; temp=temp&0xf0;
  123. } display(key); tx();
  124. }
  125. }
  126. }
  127. /***********主函數**********/
  128. void main()
  129. {
  130. clearmen();

  131. while(1)
  132. {
  133. matrixkeyscan();
  134. }
  135. }
  136. /*********40KHZ 發生器***********/
  137. //              定時中斷 T1
  138. void time_intt1(void) interrupt 3
  139. {
  140. remoteout=~remoteout;              //遙控開關取反
  141. }
  142. //*********************結束**************************//
  143. 接收端
  144. /*********************************************************************/
  145. /
  146. /*********************************************************************/

  147. //              接收端

  148. /*********************************************************************/
  149. //使用 AT89C52 單片機,12MHZ 晶振,
  150. //
  151. //#pragma src(E:\remote.asm)
  152. #include "reg51.h"
  153. #include "intrins.h"
  154. #define uchar unsigned char
  155. #define uint unsigned int
  156. #define disout P2 sbit              dula=P3^7; uchar code              table[]={



  157. 0x3f,0x06,0x5b,0x4f,
  158. 0x66,0x6d,0x7d,0x07,
  159. 0x7f,0x6f,0x77,0x7c,
  160. 0x39,0x5e,0x79,0x71};
  161. sbit sbit sbit
  162. remotein=P3^1; sin=P3^0; K1=P0^0;
  163. // 遙控輸入
  164. //基準正弦波相位輸入
  165. sbit
  166. K2=P0^1;


  167. sbit
  168. K3=P0^2;


  169. sbit
  170. K4=P0^3;


  171. sbit
  172. K5=P0^4;


  173. sbit
  174. K6=P0^5;


  175. sbit
  176. K7=P0^6;


  177. sbit
  178. K8=P0^7;


  179. uint i,j,m,n,k,s=1;
  180. uint keyvol;              //值存放
  181. //
  182. /*********1 毫秒延時程序**********/
  183. delay1ms(uint t)
  184. {
  185. for(i=0;i<t;i++)
  186. for(j=0;j<120;j++);
  187. }
  188. /***********初始化函數**********/
  189. clearmen()
  190. { dula=0; EX0=1;
  191. EA=1;              //開總中斷
  192. }
  193. //

  194. /**********函數************/
  195. loop()
  196. {
  197. switch(disout&0x07)
  198. {
  199. case 0:{s=1;break;}
  200. case 1:{s=2;break;} case 2:{s=3;break;} case 3:{s=4;break;} case 4:{s=5;break;} case 5:{s=6;break;} case 6:{s=7;break;} case 7:{s=8;break;} default:break;}
  201. }
  202. xianshi()
  203. {
  204. dula=1; P1=table[keyvol-2] ; dula=0;
  205. }


  206. //
  207. //



  208. /***********主函數***************/
  209. main()
  210. {
  211. clearmen();              //初始化
  212. loop();
  213. while(1)
  214. {
  215. while(sin==1); delay1ms(s); K8=0;delay1ms(1);K8=1;
  216. }
  217. }
  218. /************外中斷遙控接收函數**************/
  219. //外中斷 0
  220. void intt0(void) interrupt 0
  221. {
  222. EX0=0;keyvol=0;
  223. if(remotein==0)
  224. {delay1ms(1);
  225. if(remotein==0)
  226. {while(1)
  227. {while(remotein==0);
  228. keyvol++;k=0;
  229. while(remotein==1){delay1ms(1);k++;if(k>2){ xianshi();goto OOUUTT; xianshi();};}
  230. }
  231. OOUUTT:
  232. switch(keyvol)
  233. {
  234. case 2:{K1=~K1;break;}
  235. case 3:{K2=~K2;break;} case 4:{K3=~K3;break;} case 5:{K4=~K4;break;} case 6:{K5=~K5;break;} case 7:{K6=~K6;break;} case 8:{K7=~K7;break;}
  236. case 9:{if(disout==0x00){disout=0xff;}else{disout--;}loop();break;}
  237. default:break;
  238. }
  239. }
  240. }
  241. EX0=1;
  242. }
  243. //
  244. //*********************結束**************************//
復制代碼

完整的pdf格式文檔51黑下載地址(共62頁):
基于單片機的紅外遙控開關設計.pdf (1.58 MB, 下載次數: 144)
回復

使用道具 舉報

ID:116826 發表于 2017-9-10 07:25 | 顯示全部樓層
感謝分享,mark一下備用。
回復

使用道具 舉報

ID:165276 發表于 2017-9-17 07:27 | 顯示全部樓層
不錯不錯,有空好好研究一下。
回復

使用道具 舉報

ID:67366 發表于 2017-10-5 12:27 | 顯示全部樓層
學習學習
回復

使用道具 舉報

ID:319538 發表于 2018-5-24 11:53 | 顯示全部樓層
謝謝樓主
回復

使用道具 舉報

ID:335611 發表于 2018-5-24 13:56 | 顯示全部樓層
不錯啊,很好
回復

使用道具 舉報

ID:48140 發表于 2018-6-5 21:43 | 顯示全部樓層
謝謝樓主,很好.
回復

使用道具 舉報

ID:48140 發表于 2018-6-5 21:44 | 顯示全部樓層
很好,謝謝樓主
回復

使用道具 舉報

ID:89072 發表于 2018-7-16 01:16 | 顯示全部樓層
代碼問題很多啊
回復

使用道具 舉報

ID:344420 發表于 2018-7-17 09:13 | 顯示全部樓層
很好的一篇文章,學習學習
回復

使用道具 舉報

ID:517951 發表于 2020-11-15 13:29 | 顯示全部樓層
內容詳細,有時間也來做一個遙控
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91伊人网| 久久免费视频在线 | 精品欧美一区二区中文字幕视频 | 天天爽夜夜骑 | 欧美一区二区三区四区视频 | www.婷婷| 99r在线| 亚洲一区二区三区四区五区中文 | 91精品国产色综合久久不卡98 | 91麻豆精品国产91久久久久久久久 | 成人av免费在线观看 | 超碰日本 | 中文天堂在线一区 | 久草在线中文888 | 中文在线a在线 | 国产高清一区二区 | 97国产在线视频 | 一区二区三区日韩 | www.五月天婷婷.com | 日韩在线看片 | 一级片网址 | 国产精品五月天 | 国产日本精品视频 | 综合色久| www.久久久 | 欧美成人猛片aaaaaaa | 欧美视频网 | 麻豆精品一区二区三区在线观看 | 国产中文在线 | 欧美成人精品二区三区99精品 | 国产精品久久久久久久久久久新郎 | 国产在线精品免费 | 亚洲一区国产精品 | 欧美激情综合色综合啪啪五月 | 亚洲bt 欧美bt 日本bt | 国产片一区二区三区 | 国产精品五区 | 不卡一区二区三区四区 | 日韩视频在线观看 | 亚洲一区二区三区四区av | 欧美日韩三级 |