找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1852|回复: 0
打印 上一主题 下一主题
收起左侧

单片机红外线接收源码

[复制链接]
跳转到指定楼层
楼主
ID:335713 发表于 2018-5-22 15:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过中断方式接收红外线,并译出对应编码。

单片机源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>

  3. sbit hwx=P3^3;   //定义红外接收脚,

  4. code unsigned char d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  5.     //P0段选,共阳数码管 0-9 a-f - 表
  6. unsigned char code w[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
  7.     //P1位选,直接使用P1的8个端口进行8位选择

  8. unsigned char l_tmpdate[4]={0,0,0,0};//显示管数据

  9. unsigned char l_lhj[66];   //定义66位数组变量来存储接收的时间参数
  10. void delay();                   //延时子函数
  11. void display(unsigned char *lp);//数字的显示函数;lp为指向数组的地址

  12. void main(void)     //入口函数
  13. {
  14. EA=1;    //首先开启总中断
  15. EX1=1;    //开启外部中断 1
  16. IT1=1;        // 设置成 下降沿触发方式
  17. while(1){   //循环显示,接收都由中断处理
  18.    display(l_tmpdate);  
  19. }  

  20. }
  21. void display(unsigned char *lp)//显示
  22. {
  23. P2=w[5];  
  24. P0=~d[lp[0]];   //查表法得到要显示数字的数码段
  25. delay();
  26. //P0=0;     //清除显示,为下一位显示准备

  27. P2=w[4];  
  28. P0=~d[lp[1]];
  29. delay();
  30. //   P0=0;

  31. P2=w[2];  
  32. P0=~d[lp[2]];  
  33. delay();
  34. //   P0=0;

  35. P2=w[1];  
  36. P0=~d[lp[3]];
  37. delay();
  38. //P0=0;


  39. }
  40. void delay(void)         //空5个指令
  41. {
  42. unsigned char i=13;
  43. while(i)
  44.    i--;
  45. }
  46. void hongwai(void)   interrupt 2     //外部中断 1 ,INT1(P3^3)连接红外线接收IC数据脚
  47. {
  48. unsigned char i,j,tmp;
  49. EX1=0;    //暂是关闭处断中断1,才能正常接收数据
  50. j=33;    //传送一组数包括引导码1位,地址码8位加反码8位,指令码8位加反码8位,总共33位
  51. i=0;    //从第一维数组开始
  52. tmp=100;   //加八延时,按键消抖
  53. while(tmp){
  54. tmp--;
  55. }
  56. if(hwx){   //然后再检测红线接收脚是有数据接收,有继续,没有则退出
  57.    EX1=1;
  58.    return;
  59. }
  60. while(j){   //循环接收33位数据,为何我们用到66位数组,我们可以不接收高电平时间常数,只接低电平常数就
  61.      //可以判断1或0了,在这里我们都接收,为串口调试软件接收计算波形
  62.      //还有一点要知道,接收波形是反向,在没有接收时端口为高电平
  63.    tmp=0;
  64.    l_lhj[i]=1;   //时间量从1开始
  65.    while(!hwx){ //检测高低电平的变化,累计低电平的持续时间
  66.     l_lhj[i]++;   //没变继续加1
  67.     delay();   //加入延时,是因为我们采用8位二进来存储,如果不加延时,时间量将计满
  68.     tmp++;    //此变量为防止干扰带来的死循环,也就是低电平持续时间最长不超过250个延时
  69.     if(tmp==250)
  70.      break;
  71.    }
  72.    i++;
  73.    tmp=0;
  74.    l_lhj[i]=1;   //时间量从1开始
  75.    while(hwx){   //检测高低电平的变化,累计高电平的持续时间
  76.     l_lhj[i]++; //没变继续加1
  77.     delay();   //同上
  78.     tmp++;
  79.     if(tmp==250)
  80.      break;
  81.    }
  82.    i++;  
  83.    j--;
  84. }
  85. i=255;     //加入循环延时,抗干扰
  86. while(i){
  87. tmp=255;
  88. while(tmp){
  89. P0=0XF0;
  90. tmp--;
  91. }
  92. i--;   
  93. }

  94. tmp=0;
  95. for(i=3;i<19;i++,i++){   //处理地址位,对低电平时间数据的数理,这里我们只处理地址码和指令码,引导码和反码我们就忽略
  96.    tmp>>=1;     //右移一位,接收低电平在前
  97.    if(l_lhj[i]>30)    //检测低电平时间超过30就确认为1
  98.     tmp+=0x80;    //0x80=10000000
  99. }
  100. l_tmpdate[0]=tmp/16;   //分开2位以16进制显示
  101. l_tmpdate[1]=tmp%16;
  102.         
  103. tmp=0;
  104. for(i=35;i<51;i++,i++){   //同上,这里处理指令位
  105.    tmp>>=1;
  106.    if(l_lhj[i]>30)
  107.     tmp+=0x80;
  108. }
  109. l_tmpdate[2]=tmp/16;
  110. l_tmpdate[3]=tmp%16;
  111.     EX1=1;
  112. //再次启用外部中断1,为下一次接收做准备

  113. }
复制代码

所有资料51hei提供下载:
ir.rar (18.28 KB, 下载次数: 12)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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