找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机红外的一些小程序

  [复制链接]
跳转到指定楼层
楼主
ID:198748 发表于 2017-5-9 18:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由于我刚开始学红外的时候,什么都不懂,在网上到处找资料,可是在这些找到的资料中,很多都是没有用的,找到的程序,大多都是拷贝的某某公司提供的示例源程序,大多都是千篇一律,看过很多的百度提问,可是基本上都没有从根本上解决问题,也上过豆丁之类的,看看东西还要积分,我郁闷了,当时我就立志等我学会红外红一定做个红外的专题,免费的分享给大家,以方便苦苦探索的莘莘学子。
苦恼了好一阵后,幸好认识一位嵌入的大哥,给我了帮助,给我资料,功夫不负有心人,今天我终于学了红外的一些知识,为了谢谢帮助过我的大哥,我只能将他交给我的分享给大家,以此回报他,因此在这里将我所学到的免费的分享给大家,供大家交流学习。
至于程序,它是灵活多变,大家不要习惯性的CTRl+ACTRL+C,要读懂它的意思,根据程序的思想,然后自己发挥,从而真正掌握它的原理。
大家如有疑问的可以和我交流,我的QQ925171906,在此祝福所有在学习道路上孜孜不倦的可敬可佩的学子们,学业大成!对于经济窘迫的我来说,习惯了拿不收费的资料,并对变相收费有一种深恶痛绝的感觉;让更多的人来(更容易)了解红外,贡献自己的一点力
量。也希望大家有好资料的多分享一下,不要那么小气,还要什么积分什么的。
1硬件连接:P0口为数码管的段选段,P2口的高四位为数码管的位选端,红外接连在P3.2端,即连接在外部中断0

2.主要功能:用数码管显示接收到的红外按键的键码
3.程序如下:
//硬件连接
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit hongwai = P3^2;//此表为 数码管的字模, 共阴数码管 0-9  -
uchar  code table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
uchar  recieve[3];//储存用户码、用户反码与键数据码、键数据反码
uchar  a[]={0,0,0,0};
void delay(uint i)
{
    char j;
    for(i; i > 0; i--)
        for(j = 200; j > 0; j--);
}
void IRdelay(uchar x)    //x*0.14MS
{
       uchar i;
  while(x--)
{
  for (i = 0; i<13; i++);
}
}
void display(uchar keyno)
{  
        uchar i,j;
        a[0]=keyno%10000/1000;
      a[1]=keyno%1000/100;
      a[2]=keyno%100/10; //十位
      a[3]=keyno%10;    //个位
     j=0xfe; //对数码管进行逐位扫描显示
     for(i=0; i<=3; i++)
        {                       
            j=_cror_(j,1);
            P2=j;
            P0 = table[a];      
           delay(50);
        }
        P0 = 0;   
}
void IR_IN(void) interrupt 0      //外部中断0,即红外接收P3.2
{
    uchar j,k,count=0;
     EX0 = 0; //关闭外部中断0,即停止接收红外         
       IRdelay(5);
       if (hongwai==1)
     {
           EX0 =1;
          return;
        }                            //确认IR信号出现
    while (!hongwai)            //IR变为高电平,跳过9ms的前导低电平信号。
    {
           IRdelay(1);
      }
     for (j=0;j<4;j++)         //收集四组数据
     {
          for (k=0;k<8;k++)        //每组数据有8
          {
                    while (hongwai) // IR 变为低电平,跳过4.5ms的前导高电平 信号。
             {
                      IRdelay(1);
                 }
              while (!hongwai)          // IR 变为高电平
             {
                      IRdelay(1);
                 }
             while (hongwai)           //计算IR高电平时长
            {
                   IRdelay(1);
                   count++;           
                   if (count>=30)
                      {
                            EX0=1;
                            return;
                      }                  //0.14ms计数过长自动离开。
            }                        //高电平计数完毕               
             recieve [j]= recieve [j] >> 1;                  //数据最高位补"0"
             if (count>=8)
                 {
                      recieve [j] = recieve [j] | 0x80;
                 }  //数据最高位补"1"
             count=0;
          }//end for k        
     }//end for j   
   if (recieve [2]!=~ recieve [3])//校验键值码与键值反码的值,
   {
              EX0=1;    //如果键值码与键值反码取反后相等,则开外部中断中断0,开始接收下一个红外信号
       return;      
      }      
      EX0 = 1;
}
void main()
{
    EA=1;//开放全局中断
      EX0=1;//开外部中断0
      IT0=1;//触发方式为脉冲负边沿触发
      hongwai=1;
      while(1)
      {
    //显示红外键码
           display(recieve [2]);
   }      
}
2 主要功能:当遥控器上的数字键被按下时,让八个数码管同时显示按下的数字
硬件连接:P0口为数码管的段选段,P2口为数码管的位选端,默认位选端全部开放0x00P3.2接红外接收头
程序如下:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit hongwai = P3^2;
uchar  code    table[]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,
                                                  0x7C,0x39,0x5E,0x79,0x71};
uchar  recieve[3];//储存用户码、用户反码与键数据码、键数据反码
uchar  a[]={0,0,0,0};
void IRdelay(uchar x)    //x*0.14MS
{
uchar i;
  while(x--)
{
  for (i = 0; i<13; i++);
}
}
void main()
{
    EA=1;//开放全局中断
      EX0=1;//开外部中断0
      IT0=1;//触发方式为脉冲负边沿触发
      hongwai=1;
      
      while(1)
      {
           P2=0x00;
           switch(recieve[2])
           {
               case 22:P0=table[0];break;//不同的遥控器可能键值不一样,可以根据程序1测出键值,在修改case后面的值即可
                 case 12:P0=table[1];break;
                 case 24:P0=table[2];break;
                 case 94:P0=table[3];break;
                 case 8:P0=table[4];break;
                 case 28:P0=table[5];break;
                 case 90:P0=table[6];break;
                 case 66:P0=table[7];break;
                 case 82:P0=table[8];break;
                 case 74:P0=table[9];break;
                 case 68:P2=0xff;P0=0x00;break;
           }
   }
        
}
void IR_IN(void) interrupt 0      //外部中断0,即红外接收P3.2
{
    uchar j,k,count=0;
     EX0 = 0; //关闭外部中断0,即停止接收红外         
       IRdelay(5);
       if (hongwai==1)
     {
           EX0 =1;
          return;
        }                            //确认红外信号出现
    while (!hongwai)            //等红外变为高电平,跳过9ms的前导低电平信号。
    {
           IRdelay(1);
      }
     for (j=0;j<4;j++)         //收集四组数据
     {
          for (k=0;k<8;k++)        //每组数据有8
          {
                    while (hongwai)            // IR 变为低电平,跳过4.5ms的前导高电平信号。
             {
                      IRdelay(1);
                 }
              while (!hongwai)          // IR 变为高电平
             {
                      IRdelay(1);
                 }
             while (hongwai)           //计算IR高电平时长
            {
                   IRdelay(1);
                   count++;           
                   if (count>=30)
                      {
                            EX0=1;//高电平时间过长则开外部中断,并返回
                            return;
                      }                  //0.14ms计数过长自动离开。
            }                        //高电平计数完毕               
             recieve[j]=recieve[j] >> 1;  //各数据位右移一位,因为先读出的是高位数据
             if (count>=8) //如果是高电平则将高位变为1,反之则为0,不做修改
                 {
                      recieve[j] = recieve[j] | 0x80;
                 }
             count=0;
          }      
     }  
   if (recieve[2]!=~recieve[3])//校验键值码与键值反码的值,
   {
              EX0=1;    //如果键值码与键值反码取反后相等,则开外部中断中断0,开始接收下一个红外信号
       return;      
      }      
      EX0 = 1;
}
3.红外控制蜂鸣器,硬件连接很简单,P3.2接红外接收头,蜂鸣器接在P1.5
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit hongwai = P3^2;
sbit beep=P1^5;
uchar  recieve[3];//储存用户码、用户反码与键数据码、键数据反码
uchar  a[]={0,0,0,0};
void delay(uchar x)    //x*0.14MS
{
      uchar i;
    while(x--)
     {
          for (i = 0; i<13; i++);
     }
}
void main()
{
    EA=1;//开放全局中断
      EX0=1;//开外部中断0
      IT0=1;//触发方式为脉冲负边沿触发
      hongwai=1;
      beep=1;
      while(1)
      {
           if(recieve[2]==69)
           {
                 beep=~beep;recieve[2]=98;
           }
   }      
}
void hongwaizhongduan(void) interrupt 0        //外部中断0,即红外接收P3.2
{
    uchar j,k,count=0;
     EX0 = 0; //关闭外部中断0,即停止接收红外         
       delay(5);
       if (hongwai==1)
     {
           EX0 =1;
          return;
        }                            //确认红外信号出现
    while (!hongwai)            //等红外变为高电平,跳过9ms的前导低电平信号。
    {
           delay(1);
      }
     for (j=0;j<4;j++)         //收集四组数据
     {
          for (k=0;k<8;k++)        //每组数据有8
          {
                    while (hongwai)            // 红外 变为低电平,跳过4.5ms的前导高电平信号。
             {
                      delay(1);
                 }
              while (!hongwai)          // 红外 变为高电平
             {
                      delay(1);
                 }
             while (hongwai)           //计算红外高电平时长
            {
                   delay(1);
                   count++;           
                   if (count>=30)
                      {
                            EX0=1;//高电平时间过长则开外部中断,并返回
                            return;
                      }                  //0.14ms计数过长自动离开。
            }                        //高电平计数完毕               
             recieve[j]=recieve[j] >> 1;  //各数据位右移一位,因为先读出的是高位数据
             if (count>=8) //如果是高电平则将高位变为1,反之则为0,不做修改
                 {
                      recieve[j] = recieve[j] | 0x80;

…………限于本文篇幅 余下代码请从51黑下载附件…………


所有资料下载:
红外线.rar (2.53 MB, 下载次数: 108)



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

使用道具 举报

沙发
ID:95393 发表于 2017-5-12 21:59 来自手机 | 只看该作者
如果接收到的编码含有a-f,是否还能正常显示?

评分

参与人数 1黑币 +2 收起 理由
木头少年 + 2 赞一个!

查看全部评分

回复

使用道具 举报

板凳
ID:29438 发表于 2017-5-14 12:28 | 只看该作者
正在学习,谢谢!
回复

使用道具 举报

地板
ID:233756 发表于 2018-1-9 16:02 | 只看该作者
感谢分享
回复

使用道具 举报

5#
ID:273870 发表于 2018-1-9 16:59 | 只看该作者
大神,感谢分享
回复

使用道具 举报

6#
ID:299539 发表于 2018-3-30 17:09 | 只看该作者
你好,楼主知道利用单片机连接对射光电传感器实现物体检测怎么做么?
回复

使用道具 举报

7#
ID:301978 发表于 2018-6-5 15:54 | 只看该作者
感谢您的分享
回复

使用道具 举报

8#
ID:345537 发表于 2018-6-5 16:37 | 只看该作者
好好。。。。。
回复

使用道具 举报

9#
ID:345537 发表于 2018-6-5 16:38 | 只看该作者
感谢分享
回复

使用道具 举报

10#
ID:352375 发表于 2018-6-16 02:32 | 只看该作者
感谢楼主分享
回复

使用道具 举报

11#
ID:51975 发表于 2018-10-27 17:56 | 只看该作者
看看,正在学习研究
回复

使用道具 举报

12#
ID:357520 发表于 2018-10-28 15:02 | 只看该作者
使用的是什么芯片
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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