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

QQ登錄

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

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

PIC16F877A單片機(jī)接收BA5104紅外線遙控解碼程序

[復(fù)制鏈接]
ID:75926 發(fā)表于 2015-4-2 23:18 | 顯示全部樓層 |閱讀模式
  1. //熟悉使用單片機(jī)進(jìn)行紅外線遙控解碼
  2. //1、首先根據(jù)BA5104遙控IC的編碼形式進(jìn)行解碼
  3. //2、把解碼出來(lái)的按鍵用LED指示
  4. //**************************************************

  5. //**************************************************
  6. //硬件設(shè)置:
  7. //1、SW1開(kāi)關(guān)2閉合,其他斷開(kāi)
  8. //2、SW2開(kāi)關(guān)1閉合,其他斷開(kāi)
  9. //3、SW4開(kāi)關(guān)全部閉合
  10. //**************************************************

  11. //**************************************************
  12. //*****************定義頭文件**********************
  13. //**************************************************
  14. #include<PIC.h>
  15. #include"delay.h"

  16. //**************************************************
  17. //******************定義配置位*********************
  18. //**************************************************
  19. __CONFIG(0x3545);      
  20. //FLASH代碼不保護(hù),RB6和RB7為調(diào)試模式,F(xiàn)LASH不寫(xiě)保護(hù),數(shù)據(jù)代碼不保護(hù)
  21. //RB3為數(shù)字IO口,低電壓復(fù)位使能,上電延時(shí)開(kāi),看門狗開(kāi),4M晶體XT振蕩器

  22. //**************************************************
  23. //******************定義常量***********************
  24. //**************************************************
  25. #define uchar unsigned char
  26. #define uint  unsigned int
  27. #define IR  RE2

  28. //**************************************************
  29. //******************定義變量***********************
  30. //**************************************************
  31. uint rdata1,data;

  32. //***********************************************
  33. //函 數(shù) 名:port_init();
  34. //入口參數(shù):無(wú)
  35. //出口參數(shù):無(wú)
  36. //函數(shù)作用:端口初始化
  37. //說(shuō)    明:
  38. //***********************************************
  39. void port_init(void)
  40. {
  41.   PORTA=0X00;    //設(shè)置RA口輸出低電平
  42.   PORTD=0X00;    //設(shè)置RD口輸出低電平
  43.   PORTE=0X00;    //設(shè)置RE口輸出低電平
  44.   ADCON1=0X07;   //設(shè)置RA口,RE口為普通IO口
  45.   TRISA=0X00;    //設(shè)置RA口為輸出口
  46.   TRISD=0X00;    //設(shè)置RD口為輸出口
  47.   TRISE=0X04;    //設(shè)置RE2口為輸入口,其他為輸出口
  48.   OPTION=0X8F;   //分頻給WDT,分頻比為128
  49. }

  50. //***********************************************
  51. //函 數(shù) 名:scan();
  52. //入口參數(shù):無(wú)
  53. //出口參數(shù):無(wú)
  54. //函數(shù)作用:遙控接收掃描函數(shù)
  55. //說(shuō)    明:
  56. //***********************************************
  57. void scan(void)
  58. {
  59.   uchar i,count=0;
  60.   rdata1=0;                  //變量清零
  61.   IR=0;                      //先輸入低電平
  62.   if(IR)                     //判斷是否有遙控信號(hào),高電平為有遙控信號(hào)
  63.   {
  64.     while(IR){CLRWDT();;}    //等待32ms延時(shí)
  65.     for(i=0;i<12;i++)        //依次接收12位數(shù)據(jù)
  66.     {
  67.       while(!IR)             //等待低電平信號(hào)結(jié)束
  68.       {
  69.         DelayUs(20);         //延時(shí)50us, 20*2.5us=50us
  70.         count++;
  71.         if(count>25){break;} //延時(shí)大于1.25ms,跳出
  72.       }
  73.       if(count<7){return;}   //延時(shí)小于300us,為干擾跳出
  74.       else if((count>6)&&(count<11)){rdata1|=0x00;} //延時(shí)在350-500us,判定為0
  75.       else if(count>20){rdata1|=0x01;} //延時(shí)在1ms,判定為1
  76.       rdata1=rdata1<<1;                //移位準(zhǔn)備接收下一位數(shù)據(jù)
  77.       count=0;                         //變量清零
  78.       while(IR){CLRWDT();}             //等待高電平結(jié)束,接收下一位
  79.     }
  80.   }
  81. }

  82. //***********************************************
  83. //函 數(shù) 名:delayms(uchar time);
  84. //入口參數(shù):time
  85. //出口參數(shù):無(wú)
  86. //函數(shù)作用:延時(shí)
  87. //說(shuō)    明:
  88. //***********************************************
  89. void delayms(uchar time)
  90. {
  91.   uint i;
  92.   while(time--)
  93.   {
  94.     for(i=93;i>0;i--){;}
  95.   }
  96. }

  97. //***********************************************
  98. //函 數(shù) 名:buzzer();
  99. //入口參數(shù):無(wú)
  100. //出口參數(shù):無(wú)
  101. //函數(shù)作用:產(chǎn)生警報(bào)聲
  102. //說(shuō)    明:
  103. //***********************************************
  104. void buzzer(void)
  105. {
  106.   RA5=1;         //RE1輸出高電平
  107.   delayms(200);
  108.   RA5=0;         //RE1輸出低電平
  109. }

  110. //***********************************************
  111. //函 數(shù) 名:display();
  112. //入口參數(shù):無(wú)
  113. //出口參數(shù):無(wú)
  114. //函數(shù)作用:顯示函數(shù)
  115. //說(shuō)    明:
  116. //***********************************************
  117. void display(void)
  118. {
  119.   switch(data)        
  120.   {
  121.     case 0x0D81:RD0=!RD0;buzzer();break;
  122.     case 0x0D82:RD1=!RD1;buzzer();break;
  123.     case 0x0D84:RD2=!RD2;buzzer();break;
  124.     case 0x0D88:RD3=!RD3;buzzer();break;
  125.     case 0x0D90:RD4=!RD4;buzzer();break;
  126.     case 0x0DA0:RD5=!RD5;buzzer();break;
  127.     case 0x0DC3:RD6=!RD6;buzzer();break;
  128.     case 0x0DC6:RD7=!RD7;buzzer();
  129.   }
  130. }

  131. //***********************************************
  132. //函 數(shù) 名:main();
  133. //入口參數(shù):無(wú)
  134. //出口參數(shù):無(wú)
  135. //函數(shù)作用:MAIN函數(shù)
  136. //說(shuō)    明:
  137. //***********************************************
  138. void main(void)
  139. {
  140.   port_init();            //調(diào)用端口初始化函數(shù)
  141.   while(1)
  142.   {
  143.     scan();               //調(diào)用遙控掃描函數(shù)
  144.     if(data!=rdata1)
  145.     {
  146.       data=rdata1&0x0fff; //保留接收數(shù)據(jù)的低12位
  147.       display();          //調(diào)用遙控按鍵顯示函數(shù)
  148.     }
  149.   }
  150. }
復(fù)制代碼


相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:636697 發(fā)表于 2019-11-25 10:52 | 顯示全部樓層
我正在學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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