找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9514|回复: 1
收起左侧

PIC16F877A单片机接收BA5104红外线遥控解码程序

[复制链接]
ID:75926 发表于 2015-4-2 23:18 | 显示全部楼层 |阅读模式
  1. //熟悉使用单片机进行红外线遥控解码
  2. //1、首先根据BA5104遥控IC的编码形式进行解码
  3. //2、把解码出来的按键用LED指示
  4. //**************************************************

  5. //**************************************************
  6. //硬件设置:
  7. //1、SW1开关2闭合,其他断开
  8. //2、SW2开关1闭合,其他断开
  9. //3、SW4开关全部闭合
  10. //**************************************************

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

  16. //**************************************************
  17. //******************定义配置位*********************
  18. //**************************************************
  19. __CONFIG(0x3545);      
  20. //FLASH代码不保护,RB6和RB7为调试模式,FLASH不写保护,数据代码不保护
  21. //RB3为数字IO口,低电压复位使能,上电延时开,看门狗开,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. //函 数 名:port_init();
  34. //入口参数:无
  35. //出口参数:无
  36. //函数作用:端口初始化
  37. //说    明:
  38. //***********************************************
  39. void port_init(void)
  40. {
  41.   PORTA=0X00;    //设置RA口输出低电平
  42.   PORTD=0X00;    //设置RD口输出低电平
  43.   PORTE=0X00;    //设置RE口输出低电平
  44.   ADCON1=0X07;   //设置RA口,RE口为普通IO口
  45.   TRISA=0X00;    //设置RA口为输出口
  46.   TRISD=0X00;    //设置RD口为输出口
  47.   TRISE=0X04;    //设置RE2口为输入口,其他为输出口
  48.   OPTION=0X8F;   //分频给WDT,分频比为128
  49. }

  50. //***********************************************
  51. //函 数 名:scan();
  52. //入口参数:无
  53. //出口参数:无
  54. //函数作用:遥控接收扫描函数
  55. //说    明:
  56. //***********************************************
  57. void scan(void)
  58. {
  59.   uchar i,count=0;
  60.   rdata1=0;                  //变量清零
  61.   IR=0;                      //先输入低电平
  62.   if(IR)                     //判断是否有遥控信号,高电平为有遥控信号
  63.   {
  64.     while(IR){CLRWDT();;}    //等待32ms延时
  65.     for(i=0;i<12;i++)        //依次接收12位数据
  66.     {
  67.       while(!IR)             //等待低电平信号结束
  68.       {
  69.         DelayUs(20);         //延时50us, 20*2.5us=50us
  70.         count++;
  71.         if(count>25){break;} //延时大于1.25ms,跳出
  72.       }
  73.       if(count<7){return;}   //延时小于300us,为干扰跳出
  74.       else if((count>6)&&(count<11)){rdata1|=0x00;} //延时在350-500us,判定为0
  75.       else if(count>20){rdata1|=0x01;} //延时在1ms,判定为1
  76.       rdata1=rdata1<<1;                //移位准备接收下一位数据
  77.       count=0;                         //变量清零
  78.       while(IR){CLRWDT();}             //等待高电平结束,接收下一位
  79.     }
  80.   }
  81. }

  82. //***********************************************
  83. //函 数 名:delayms(uchar time);
  84. //入口参数:time
  85. //出口参数:无
  86. //函数作用:延时
  87. //说    明:
  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. //函 数 名:buzzer();
  99. //入口参数:无
  100. //出口参数:无
  101. //函数作用:产生警报声
  102. //说    明:
  103. //***********************************************
  104. void buzzer(void)
  105. {
  106.   RA5=1;         //RE1输出高电平
  107.   delayms(200);
  108.   RA5=0;         //RE1输出低电平
  109. }

  110. //***********************************************
  111. //函 数 名:display();
  112. //入口参数:无
  113. //出口参数:无
  114. //函数作用:显示函数
  115. //说    明:
  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. //函 数 名:main();
  133. //入口参数:无
  134. //出口参数:无
  135. //函数作用:MAIN函数
  136. //说    明:
  137. //***********************************************
  138. void main(void)
  139. {
  140.   port_init();            //调用端口初始化函数
  141.   while(1)
  142.   {
  143.     scan();               //调用遥控扫描函数
  144.     if(data!=rdata1)
  145.     {
  146.       data=rdata1&0x0fff; //保留接收数据的低12位
  147.       display();          //调用遥控按键显示函数
  148.     }
  149.   }
  150. }
复制代码


回复

使用道具 举报

ID:636697 发表于 2019-11-25 10:52 | 显示全部楼层
我正在学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表