標(biāo)題: 單片機(jī)紅外線發(fā)射接收電路+源程序與Proteus仿真圖 [打印本頁]

作者: 17340794003    時間: 2020-6-29 10:23
標(biāo)題: 單片機(jī)紅外線發(fā)射接收電路+源程序與Proteus仿真圖
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. /***************************************************************
  2.         作品:紅外線發(fā)射
  3.   單片機(jī):STC89C52RC
  4.     晶振:12M
  5. 編譯環(huán)境:Keil uVision4 V9.00
  6. ***************************************************************/
  7. //
  8. //        發(fā)射引腳(接PNP三極管b極)
  9. //        PNP三極管e極接2Ω電阻,c極接紅外發(fā)射管
  10.      
  11. #include <REG51.h>
  12. #include <intrins.h>
  13. #define uchar unsigned char
  14. #define uint  unsigned int

  15. #define SBM   0x80                //識別碼

  16. #define m9    (65536-9000)               //約9mS
  17. #define m4_5  (65536-4500)               //約4.5mS
  18. #define m1_6  (65536-1630)               //約1.65mS
  19. #define m_65  (65536-580)               //約0.65mS
  20. #define m_56  (65536-560)               //約0.56mS
  21. #define m40   (65536-40000)       //約40mS
  22. #define m56   (65536-56000)       //56mS
  23. #define m2_25 (65536-2250)        //約2.25mS

  24. sbit IR  = P3^6;                                  //定義發(fā)射引腳(接PNP三極管基極)
  25. sbit LED = P3^7;                                  //發(fā)射指示燈

  26. uchar KEY(void);
  27. void  SanZhuan(void);
  28. void  ZZ(uchar x);
  29. void  Z0(uchar temp);
  30. void  TT0(bit BT,uint x);
  31. void  YS(uchar time);

  32. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  33. 函數(shù)功能:主函數(shù)
  34. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  35. void main(void)
  36. {

  37.   TMOD = 0x01;         //T0 16位工作方式
  38.   IR=1;                                   //發(fā)射端口常態(tài)為高電平

  39.   while(1)
  40.   {
  41.    SanZhuan();
  42.   }
  43. }
  44. /***************************************************************
  45. 函數(shù)功能:             4×4矩陣鍵盤
  46.                            鍵值                    
  47. P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
  48. │     │    │    │    │    │    │    │    ┃
  49. │     │    │    └────13   14   15   16   ┃   
  50. │     │    └─────────9    10   11   12   ┃   
  51. │     └──────────────5    6    7    8    ┃   
  52. └────────────────────1    2    3    4    ┃  
  53. ***************************************************************/
  54. uchar KEY(void)
  55. {
  56. uchar H,L;            //行值,列值
  57. H=0;
  58. L=0;
  59. P1 = 0xf0;            //將鍵盤端口行值設(shè)為1,列值設(shè)為0
  60. if(P1!= 0xf0)         //檢測是否有按鍵按下,如果有則hangval必不為0x0f
  61.    {
  62.     YS(10);            //按鍵去抖動,延時10毫秒
  63.     if(P1!=0xf0)       //確實有按鍵按下
  64.       {
  65.        H  = P1&0xf0;   //按鍵后得到按鍵的行標(biāo)志位,將行標(biāo)志位賦值給hangval
  66.        P1 = 0x0f;      //翻轉(zhuǎn)鍵盤接口輸出
  67.        L  = P1&0x0f;   //得到列標(biāo)志位
  68.       }
  69.         return (H+L);
  70.    }
  71.   return 0;
  72. }
  73. /***************************************************************
  74. 函數(shù)功能:散轉(zhuǎn)程序
  75. 入口參數(shù):v
  76. //
  77. //  13 14 15 16
  78. //  9  10 11 12
  79. //  5  6  7  8
  80. //  1  2  3  4
  81. ***************************************************************/
  82. void SanZhuan(void)
  83. {
  84. uchar v;
  85. v = KEY();

  86. switch(v)
  87. {
  88.   case 0x77:ZZ(0x01);v=0;break;                //"  "
  89.   case 0xb7:ZZ(0x02);v=0;break;                //"  "
  90.   case 0xd7:ZZ(0x03);v=0;break;                //"  "
  91.   case 0xe7:ZZ(0x04);v=0;break;                //"  "
  92.   case 0x7b:ZZ(0x05);v=0;break;                //"  "
  93.   case 0xbb:ZZ(0x06);v=0;break;                //"  "
  94.   case 0xdb:ZZ(0x07);v=0;break;                //"  "
  95.   case 0xeb:ZZ(0x08);v=0;break;                //"  "
  96.   case 0x7d:ZZ(0x09);v=0;break;                //"  "
  97.   case 0xbd:ZZ(0x10);v=0;break;                //"  "
  98.   case 0xdd:ZZ(0x11);v=0;break;                //"  "
  99.   case 0xed:ZZ(0x12);v=0;break;                //"  "
  100.   case 0x7e:ZZ(0x13);v=0;break;                //"  "
  101.   case 0xbe:ZZ(0x14);v=0;break;                //"  "
  102.   case 0xde:ZZ(0x15);v=0;break;                //"  "
  103.   case 0xee:ZZ(0x16);v=0;break;                //"  "
  104.   default:v=0;
  105. }
  106. }
  107. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  108. 函數(shù)功能:發(fā)送主程序
  109. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  110. void ZZ(uchar x)
  111. {
  112.   TT0(1,m9);                   //高電平9mS
  113.   TT0(0,m4_5);               //低電平4.5mS

  114.   /*┈ 發(fā)送4幀數(shù)據(jù) ┈*/
  115.   Z0(SBM);                                                                                                                                       
  116.   Z0(~SBM);
  117.   Z0(x);
  118.   Z0(~x);

  119.   /*┈┈ 結(jié)束碼 ┈┈*/
  120.   TT0(1,m_65);
  121.   TT0(0,m40);

  122.   /*┈┈ 重復(fù)碼 ┈┈*/
  123.   while(KEY())
  124.    {
  125.         TT0(1,m9);
  126.         TT0(0,m2_25);

  127.         TT0(1,m_56);
  128.         TT0(0,m40);
  129.                 TT0(0,m56);
  130.                
  131.                 LED = !LED;                  //指示燈                                          
  132.     }

  133.    LED = 1;                    

  134. }
  135. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  136. 函數(shù)功能:單幀發(fā)送程序
  137. 入口參數(shù):1幀數(shù)據(jù)
  138. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  139. void Z0(uchar temp)
  140. {
  141.   uchar v;
  142.   for (v=0;v<8;v++)                     //循環(huán)8次移位
  143.        {     
  144.                  TT0(1,m_65);                        //高電平0.65mS         
  145.                          if(temp&0x01) TT0(0,m1_6); //發(fā)送最低位
  146.                          else          TT0(0,m_56);     
  147.                          temp >>= 1;                //右移一位
  148.         }   
  149. }

  150. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  151. 函數(shù)功能:38KHz脈沖發(fā)射 + 延時程序
  152. 入口參數(shù):(是否發(fā)射脈沖,延時約 x (uS))
  153. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  154. void TT0(bit BT,uint x)
  155. {
  156.   TH0 = x>>8;                    //輸入T0初始值
  157.   TL0 = x;
  158.   TF0=0;                                //清0
  159.   TR0=1;                                //啟動定時器0
  160.   if(BT == 0) while(!TF0);        //BT=0時不發(fā)射38KHz脈沖只延時;BT=1發(fā)射38KHz脈沖且延時;
  161.   else while(1)                            //38KHz脈沖,占空比5:26
  162.          {
  163.                   IR = 0;
  164.                   if(TF0)break;
  165.                if(TF0)break;
  166.                   IR = 1;
  167.                 if(TF0)break;
  168.                  if(TF0)break;
  169. ……………………

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

所有資料51hei提供下載:
紅外線遙控Proteus仿真電路+發(fā)射+接收程序.7z (1.19 MB, 下載次數(shù): 122)


作者: dilongking    時間: 2020-8-20 15:26
這對于我這初學(xué)者還蠻難理解的。不過也要贊一下




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