找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

紅外接收程序 4X4鍵盤按鍵然后通過數(shù)碼管顯示紅外接收到的信號

[復(fù)制鏈接]
ID:225402 發(fā)表于 2017-8-7 10:39 | 顯示全部樓層 |閱讀模式
這是一個C語言程序,主要是紅外接收測試,4X4鍵盤按鍵然后通過數(shù)碼管顯示紅外接收到的信號!

單片機源程序如下:
  1. #include <reg51.h>
  2. sbit IR=P3^2;  //紅外接口標(biāo)志
  3. sbit dm = P2^2; //段碼
  4. sbit wm = P2^3; //位碼




  5. unsigned char hc[8]; //數(shù)碼管顯示緩存
  6. unsigned char DM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};// 顯示段碼值0~F
  7. unsigned char WM[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位碼。顯示的位置
  8. unsigned char sj[33]; //接收脈沖時間數(shù)組
  9. char w=0; //數(shù)碼管顯示緩存指針(0~7)
  10. unsigned char i; //脈沖個數(shù)記錄
  11. unsigned char mcsj; //脈沖時間(大于0.56ms小于1.125ms為0,大于1.125ms小于2.25ms)
  12. bit MC=0; //接收紅外脈沖開始標(biāo)志(0:脈沖已經(jīng)結(jié)束,1:脈沖剛開始)
  13. bit JS=0; //脈沖接收結(jié)束標(biāo)志位(1標(biāo)志接收結(jié)束)
  14. bit JM=0; //解碼完成標(biāo)志位(1:解碼完成)
  15. void Delay(unsigned char f);
  16. void dsq_0() interrupt 1 using 1 //定時器T0中斷服務(wù)函數(shù)
  17. {
  18. mcsj++; //256
  19. }
  20. void wbzd_0() interrupt 0 //外部中斷服務(wù)函數(shù)
  21. {


  22. if(MC)
  23. {
  24. if(mcsj>32) //判斷是不是引導(dǎo)碼。(如果是i=0)
  25. i=0;
  26. sj[i]=mcsj; //把脈沖時間存入sj這個數(shù)組里
  27. mcsj=0; //清空脈沖時間準(zhǔn)備接收下一個脈沖時間
  28. i++;
  29. if(i==33) //判斷是否接收完脈沖時間
  30. {
  31. i=0;
  32. JS = 1; //接收完成標(biāo)志位置1
  33. MC=0; //紅外脈沖結(jié)束
  34. }
  35. }
  36. else
  37. {
  38. MC=1; //紅外脈沖開始
  39. mcsj=0; //清空脈沖時間
  40. }
  41. }
  42. void csh_dsq_0() //初始化定時器0
  43. {
  44. TMOD = 0x02;
  45. TH0=0x00; //定時器0的重裝數(shù)據(jù)
  46. TL0=0x00; //初始化
  47. ET0=1; //打開定時器0中斷
  48. TR0=1; //啟用定時器0
  49. }


  50. void csh_wbzd_0() //初始化外部中斷0
  51. {
  52. IT0=1; //外部中斷0下降沿觸發(fā)
  53. EX0=1; //啟用外部中斷0
  54. EA=1; //打開總中斷
  55. }
  56. void hwjm(unsigned char *p) //紅外解碼函數(shù)
  57. {
  58. unsigned char i,j,k=1;
  59. for(i=0;i<4;i++) //4組數(shù)據(jù)的計數(shù)
  60. {
  61. for(j=0;j<8;j++) //每組數(shù)據(jù)中的8位數(shù)據(jù)計算
  62. {
  63. p[i] >>= 1; //數(shù)據(jù)右移一位
  64. if(sj[k]>7) //脈沖時間大于7的就是1
  65. p[i] |= 0x80;
  66. k++;
  67. }
  68. }
  69. JS = 0; //分析完成清零JS
  70. JM = 1; //解碼完成JM置1


  71. }
  72. unsigned char xhc(unsigned char *p) //紅外按鍵匹配函數(shù)
  73. {
  74. /*
  75. hc[0]=DM[p[1]/16]; //客戶碼
  76. hc[1]=DM[p[1]%16]; //客戶碼
  77. hc[2]=0x40;
  78. hc[3]=DM[p[2]/16]; //數(shù)據(jù)
  79. hc[4]=DM[p[2]%16]; //數(shù)據(jù)
  80. hc[5]=0x40;
  81. hc[6]=DM[p[3]/16]; //數(shù)據(jù)反碼
  82. hc[7]=DM[p[3]%16]; //數(shù)據(jù)反碼
  83. 以上注釋的代碼是顯示
  84. 紅外解碼后的原始數(shù)據(jù)
  85. */


  86. switch(p[2]) //匹配按鍵
  87. {
  88. case 0x16:hc[w]=DM[0];break; //按鍵0
  89. case 0x0c:hc[w]=DM[1];break; //按鍵1
  90. case 0x18:hc[w]=DM[2];break; //按鍵2
  91. case 0x5e:hc[w]=DM[3];break; //按鍵3
  92. case 0x08:hc[w]=DM[4];break; //按鍵4
  93. case 0x1c:hc[w]=DM[5];break; //按鍵5
  94. case 0x5a:hc[w]=DM[6];break; //按鍵6
  95. case 0x42:hc[w]=DM[7];break; //按鍵7
  96. case 0x52:hc[w]=DM[8];break; //按鍵8
  97. case 0x4a:hc[w]=DM[9];break; //按鍵9
  98. case 0x09: //熄滅所有數(shù)碼管(清零)
  99. {
  100. hc[0]=0x00; //熄滅所有數(shù)碼管
  101. w=7; //準(zhǔn)備清空數(shù)碼管顯示緩存(不是真的清空)
  102. break;
  103. }
  104. default: return 0; //如果沒有匹配的按鍵就結(jié)束函數(shù)
  105. }
  106. if(w<7) //數(shù)碼管顯示緩存寫入指針不能大于7
  107. {
  108. w++; //顯示緩存指針加一
  109. hc[w]=0x00; //設(shè)置數(shù)碼管掃描結(jié)束標(biāo)志
  110. }
  111. else
  112. w=0;//顯示緩存指針清零
  113.    JM=0;


  114. }
  115. void Delay(unsigned char f) //延時
  116. {
  117. while(f--);
  118. }
  119. void main()
  120. {
  121. unsigned char k=0; //數(shù)碼管掃描的位置
  122. unsigned char jmsj[4]; //紅外接收解碼后的所有數(shù)據(jù)
  123. csh_dsq_0(); //初始化定時器0
  124. csh_wbzd_0(); //初始化外部中斷0
  125. while(1)
  126. {
  127. if(JS) //脈沖接收結(jié)束后調(diào)用解碼函數(shù)解碼
  128. {hwjm(jmsj);}
  129. if(JM) //解碼完成后調(diào)用按鍵匹配函數(shù)
  130. {xhc(jmsj);}
  131. //下面的代碼是數(shù)碼管掃描
  132. P1 = 0; //消影
  133. dm = 1;
  134. ……………………

  135. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
hongc.rar (1.61 KB, 下載次數(shù): 14)


回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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