51单片机学习笔记【九】——红外通信实验

发布者:数字小巨人最新更新时间:2021-07-26 来源: eefocus关键字:51单片机  非可见光 手机看文章 扫描二维码
随时随地手机看文章

一.红外通信基础

1.红外线原理

红外线是波长在760nm~1mm之间的非可见光。红外通信装置由红外发射管和红外接受管组成,红外发射管是能发射出红外线的发光二极管,发射强度随着电流的增大而增大;红外接受管是一个具有红外光敏感特征的PN节的光敏二极管,只对红外线有反应,产生光电流


2.信号调制原理

基带信号:从信号源发出没有经过调制的原始信号,特点是频率较低,信号频率从0开始,频谱较宽。


调制:就是用待传送信号去控制某个高频信号的幅度、相位、频率等参量变化的过程,即用一个信号去装载另一个信号。


红外遥控器使用38KB的载波对原始信号进行解调,原理如下

1

调制后产生一定频段的高低电平,但红外接收头接受到的信号和调制后的信号电平相反。


3.NEC协议

红外遥控由多种协议控制,这里介绍最主要,应用最广的NEC协议。NEC数据格式:引导码、用户码、用户码(或者用户码反码)、按键键码和键码反码,最后一个停止位。


引导码:9ms的载波+4.5ms的空闲。

比特值“0”:560us的载波+560us的空闲。

比特值“1”:560us的载波+1.68ms的空闲。

2

协议规定低位首先发送。一串信息首先发送9ms的AGC(自动增益控制)的高脉冲,接着发送4.5ms的起始低电平,接下来是发送四个字节的地址码和命令码。如果你一直按那个按键,一串信息也只能发送一次,一直按着,发送的则是以110ms为周期的重复码。


二.实验例程

1.实验原理

产生下降沿,进入外部中断0的中断函数,延时一下之后检IO口是否还是低电平,是就等待9ms的低电平过去。等待完9ms低电平过去,再去等待4.5ms的高电平过去。接着开始接收传送的4组数据先等待560us的低电平过去检测高电平的持续时间,如果超过1.12ms那么是高电平(高电平的的持续时间为1.69ms,低电平的持续时间为565us。)检测接收到的数据和数据的反码进行比较,是否等到的数据是一样的。


2.实验说明

本实验通过单片机控制红外接受设备接受红外发送设备发送的信号,并通过数码管的显示判断是否接受到信号。实验接线为JP10接J12,J6的A,B,C分别接P2.2,P2.3,P2.4。


3.源代码

/**************************************

  > File Name: 红外通信原理

  > Author: pengshp

  > Mail: pengshp3@outlook.com

  > Date: 2015年 7 月 27 日

***************************************/

#include

#define GPIO_DIG P0


sbit LSA  = P2^2;

sbit LSB  = P2^3;

sbit LSC  = P2^4;

sbit IRIN = P3^2;                           //红外接收器位声明


unsigned char code DIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

                                 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

unsigned char DisplayData[8];               //用来存放要显示的8位数的值

unsigned char IrValue[6];                   //用来存放读取到的红外值

unsigned char Time;


void DigDisplay();                          //动态显示函数

void IrInit();

void DelayMs(unsigned int);


void main()

{

    IrInit();

    while(1)

    {

        IrValue[4]=IrValue[2]>>4;           //高位

        IrValue[5]=IrValue[2]&0x0f;         //低位

        DisplayData[0] = 0x00;

        DisplayData[1] = DIG_CODE[IrValue[4]];

        DisplayData[2] = DIG_CODE[IrValue[5]];

        DisplayData[3] = 0x76;    

        DisplayData[4] = 0x00;

        DisplayData[5] = DIG_CODE[IrValue[4]];

        DisplayData[6] = DIG_CODE[IrValue[5]];

        DisplayData[7] = 0x76;

        DigDisplay();   

    }

}


void DelayMs(unsigned int x)                 //0.14ms误差 0us

{

    unsigned char i;

    while(x--)

    {

        for (i = 0; i<13; i++);

    }

}


void IrInit()

{

    IT0=1;                                   //下降沿触发

    EX0=1;                                   //打开中断0允许

    EA=1;                                    //打开总中断

    IRIN=1;                                  //初始化端口

}


void ReadIr() interrupt 0

{

    unsigned char j,k;

    unsigned int err;

    Time=0;                  

    DelayMs(70);

    if(IRIN==0)                              //确认是否真的接收到正确的信号

    {    

        err=1000;                            //1000*10us=10ms,超过说明接收到错误的信号

        while((IRIN==0)&&(err>0))            //等待前面9ms的低电平过去        

        {           

            DelayMs(1);

            err--;

        } 

        if(IRIN==1)                          //如果正确等到9ms低电平

        {

            err=500;

            while((IRIN==1)&&(err>0))        //等待4.5ms的起始高电平过去

            {

                DelayMs(1);

                err--;

            }

            for(k=0;k<4;k++)                 //共有4组数据

            {               

                for(j=0;j<8;j++)             //接收一组数据

                {

                    err=60;     

                    while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去

                    {

                        DelayMs(1);

                        err--;

                    }

                    err=500;

                    while((IRIN==1)&&(err>0))//计算高电平的时间长度。

                    {

                        DelayMs(1);          //0.14ms

                        Time++;

                        err--;

                        if(Time>30)

                        {

                            EX0=1;

                            return;

                        }

                    }

                    IrValue[k]>>=1;          //k表示第几组数据

                    if(Time>=8)              //如果高电平出现大于565us,那么是1

                    {

                        IrValue[k]|=0x80;

                    }

                    Time=0;                  //用完时间要重新赋值                            

                }

            }

        }

        if(IrValue[2]!=~IrValue[3])          //反码取反后与原码相同则说明信号接受正确

        {

            return;

        }

    }           

}


void DigDisplay()

{

    unsigned char i;

    unsigned int j;

    for(i=0;i<8;i++)

    {

        switch(i)                           //位选,选择点亮的数码管

        {

            case(0):

                LSA=0;LSB=0;LSC=0; break;   //显示第0位

            case(1):

                LSA=1;LSB=0;LSC=0; break;   //显示第1位

            case(2):

                LSA=0;LSB=1;LSC=0; break;   //显示第2位

            case(3):

                LSA=1;LSB=1;LSC=0; break;   //显示第3位

            case(4):

                LSA=0;LSB=0;LSC=1; break;   //显示第4位

            case(5):

                LSA=1;LSB=0;LSC=1; break;   //显示第5位

            case(6):

                LSA=0;LSB=1;LSC=1; break;   //显示第6位

            case(7):

                LSA=1;LSB=1;LSC=1; break;   //显示第7位 

        }

        GPIO_DIG=DisplayData[i];            //发送段码

[1] [2]
关键字:51单片机  非可见光 引用地址:51单片机学习笔记【九】——红外通信实验

上一篇:51单片机学习笔记【一】——LED灯实验
下一篇:51单片机学习笔记【七】——蜂鸣器和继电器

推荐阅读最新更新时间:2024-11-13 11:41

51单片机复习004 -- HD44780控制的1602LCD
1、HD44780控制的1602LCD : 也称1602字符型液晶 1602 : 即每行最多有16个字符的显示位,共有2行。 显示字符的位与位之间存在间隔,所以一般不用1602LCD显示图片 (主要是效果不好) 每个显示位分为 5*7点阵 和 5*11点阵,我学习时用的是5*7点阵的LCD 2、HD44780控制的1602LCD的外观、引脚、内部资源 3、基本时序和11条操作指令
[单片机]
<font color='red'>51单片机</font>复习004 -- HD44780控制的1602LCD
用于51单片机的智能灌溉系统 自动浇花程序
#include reg52.h //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #include intrins.h #define u8 unsigned char #define u16 unsigned int #define uchar unsigned char #define uint unsigned int uchar yushe_Moisture=20; //Moisture预设值下限 uchar yushe_MoistureH=40; //Moisture
[单片机]
51单片机容易忽略的东西
P0口将作为总线的低8位地址线和8位数据线使用 P2口将作为总线的高8位地址线使用 如果十六进制数以字母ABCDEF中的某一个开头,必须在前面加一个0.譬如,MOV P1, #0BFH ORG 00H 表示的是伪指令,作用帮助汇编器汇编指令,并不是单片机指令的一部分,因此伪指令不占用存储器空间。这段代码的含义是从程序存储器的00H开始执行程序。 一段小程序,循环闪烁小灯 ORG 00H START: MOV P1, #00H CALL DELAY MOV P1, #0FFH CALL DELAY JMP START DELAY: MOV R3, #50 D1: MOV R4, #20 D2: MOV R5, #
[单片机]
51单片机 模块化编程
了解模块化编程 1.首先了解一下传统方式编程和模块化编程 传统方式编程:所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路 模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include XXX.h 文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等 2. 模块化编程注意事项 .c文件:函数、变量的定义 .h文件:可被外部调用的函数、变量的声明 任何自定义的变量、函数在调用前必须有定义或声明(同一个.c) 使用到的自定义函数的.
[单片机]
<font color='red'>51单片机</font> 模块化编程
51单片机播放音乐程序
给大家分享下51单片机播放音乐简谱的函数库: /********************************************* SOUND PLAY FOR 51MCU COPYRIGHT (c) 2005 BY JJJ. -- ALL RIGHTS RESERVED -- File Name: SoundPlay.h Author: Jiang Jian Jun Created: 2005/5/16 Modified: NO Revision: 1.0 *********************************
[单片机]
TFT画出矩形
以51单片机为平台,用TFT画出实心矩形! 以下程序关键在于自己的应用,有多余的经历则可以深入研究! 关键在于用!!! 希望能给大家带来帮助 #include reg52.h #define uint unsigned int #define uchar unsigned char #define TYPE_LCD_DATA 1 #define TYPE_LCD_COMMAND 0 #define LCD_SIZE_X 128 #define LCD_SIZE_Y 160 #define DATA P0 sbit LCD_RST = P2^7; //RST 引脚定义 sbit LCD_RD
[单片机]
51单片机C和汇编指令对比
一、单一指令比较: 字节操作 加法指令 减法指令 乘法指令 除法指令 取模指令 位测试指令 _testbit_ (bit); 左移指令 Variable = Variable 1; 右移指令 Variable = Variable 1; 位取反指令 与运算指令 或运算指令 异或运算指令 子程序调用 RESULT=BYTESUB(ARG1, ARG2); CALL BYTESUB 判断指令 CJNE R1,#0F0H,LABEL1 DJNZ R1,LABEL1 查表指令 RESULT = NUM ; MOVC A,@A+DPTR 指针操作指令 POINT = & NUM;
[单片机]
MCS_51单片机与8255A的接口设计
所谓可编程的接口芯片是指其功能可由微处理机的指令来加以改变的接口芯片,利用编程的方法,可以使一个接口芯片执行不同的接口功能。目前,各生产厂家已提供了很多系列的可编程接口,MCS-51单片机常用的两种接口芯片是8255以及8155。 8255和MCS-51相连,可以为外设提供三个8位的I/O端口:A口、B口和C口,三个端口的功能完全由编程来决定。 1.  8255的内部结构和引脚排列 下图7为8255的内部结构和引脚图。 (1)A口、B口和C口。A口、B口和C口均为8位I/O数据口,但结构上略有差别。A口由一个8位的数据输出缓冲/锁存器和一个8位的数据输入缓冲/锁存器组成。B口由一个8位的数据输出缓冲/锁存器和一个8位的
[单片机]
MCS_<font color='red'>51单片机</font>与8255A的接口设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved