今天学习了红外遥控,现在来对今天学习的内容来进行管理整理一下
Lcd1602在的工作原理以及代码已经在上一篇文章发过啦,还是不理解的小伙伴可以去看看前面的文章。
好了开始进入今天的正题~
什么是红外遥控:
学习这个的话得先了解它得工作原理,在这里我推荐大家去看一下其他博主得博客,那里讲的挺好的,这里我引用的是其他博主的原理图
红外遥控系统主要由红外发射装置和红外接收装置构成。
红外发射装置主要由键盘电路、红外编码芯片、电源和红外发射电路组成(比如遥控器),如图:
红外接收装置主要由红外接收电路、红外解码芯片、电源和应用电路组成,在单片机开发板上有红外接收电路,而且单片机充当解码芯片。
- 红外信号是怎么传输的
人的眼睛能看到的可见光按波长从长到短排列依次为:红、橙、黄、绿、青、蓝、紫。其中红光的波长范围为0.62~0.72微米,红外遥控就是利用波长为0.76至1.5微米之间的近红外线来传送控制信号的。
红外信号的发射由红外发射电路中的红外发光二极管完成,通常情况下为了提高抗干扰能力与降低电源消耗,遥控器将遥控信号(二进制脉冲码)调制在载波(载波是传送信息的物理基础和承载工具)上经放大后发送至红外二极管,再由二极管转换为红外信号发送出去。
遥控器上不同的按键有着不一样的键值,按下相对应的键,红外二极管就会发送对应的信号,接收装置接收到信号后会对信号进行信号解调后会得到相应按键的键值,再根据不同的键值执行相应的操作。
- NEC协议
就像串口通信一样,红外通信也有其自己的通信协议,我们一般遵循NEC协议。
NEC规定红外二极管每次发送的信号的数据格式如下:
发送的数据主要由引导码、用户码1、用户码2、数据码、数据反码组成。引导码相当于暗号,当接收装置接收到正确的引导码后就开始读取数据,俩组用户码是为了区别其他的红外发射器发射的信号,数据码中的内容就对应着相应的键值,数据反码是为了在接收信号后检验信号的正确性。(引导码是“9ms高电平+4.5ms低电平”)
这样我们虽然清楚了信号的发送形式,但是怎么表达数据发送中的高低位(“0"和"1”)呢?这又涉及到NEC的位定义了,规定:“0.56ms高电平+0.565ms低电平”代表“1”;“0.56ms高电平+1.69ms低电平”代表“0”,就是说“0”与“1”的不同就是他们低电平所持续的时间不同。(PS:发送数据时从最低位开始发送)
不知道读者注意到黑体字标出的发送没,为什么要刻意强调是发送时的呢?因为单片机接收到的数据格式与发送时的恰恰相反,就是说接收时的引导码是“9ms低电平+4.5ms高电平”;“0”是“0.56ms低电平+0.565ms高电平”;“1”是“0.56ms低电平+1.69ms高电平”。这一点我们要格外注意,因为续我们在解码程序中是以接收到的数据为准的!!!
红外遥控的键码值:
如下图所示:
程序的设计思想:
在LCD1602上显示0-9的话就先让他显示红外遥控发射一段数码,然后单片机端接收,经过助理然后转成相应的ASCll码值在l1602上显示。大致的思路就是这样子了。
代码分析:
lcd.c
//下面是代码段
#include "lcd.h"
/*******************************************************************************
* º¯ Êý Ãû : Lcd1602_Delay1ms
* º¯Êý¹¦ÄÜ : ÑÓʱº¯Êý£¬ÑÓʱ1ms
* Êä Èë : c
* Êä ³ö : ÎÞ
* ˵ Ãû : ¸Ãº¯ÊýÊÇÔÚ12MHZ¾§ÕñÏ£¬12·ÖƵµ¥Æ¬»úµÄÑÓʱ¡£
*******************************************************************************/
void Lcd1602_Delay1ms(uint c) //Îó²î 0us
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
/*******************************************************************************
* º¯ Êý Ãû : LcdWriteCom
* º¯Êý¹¦ÄÜ : ÏòLCDдÈëÒ»¸ö×Ö½ÚµÄÃüÁî
* Êä Èë : com
* Êä ³ö : ÎÞ
*******************************************************************************/
#ifndef LCD1602_4PINS //µ±Ã»Óж¨ÒåÕâ¸öLCD1602_4PINSʱ
void LcdWriteCom(uchar com) //дÈëÃüÁî
{
LCD1602_E = 0; //ʹÄÜ
LCD1602_RS = 0; //Ñ¡Ôñ·¢ËÍÃüÁî
LCD1602_RW = 0; //Ñ¡ÔñдÈë
LCD1602_DATAPINS = com; //·ÅÈëÃüÁî
Lcd1602_Delay1ms(1); //µÈ´ýÊý¾ÝÎȶ¨
LCD1602_E = 1; //дÈëʱÐò
Lcd1602_Delay1ms(5); //±£³Öʱ¼ä
LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com) //дÈëÃüÁî
{
LCD1602_E = 0; //ʹÄÜÇåÁã
LCD1602_RS = 0; //Ñ¡ÔñдÈëÃüÁî
LCD1602_RW = 0; //Ñ¡ÔñдÈë
LCD1602_DATAPINS = com; //ÓÉÓÚ4λµÄ½ÓÏßÊǽӵ½P0¿ÚµÄ¸ßËÄ룬ËùÒÔ´«Ë͸ßËÄλ²»ÓøÄ
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //дÈëʱÐò
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = com << 4; //·¢Ë͵ÍËÄλ
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //дÈëʱÐò
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/*******************************************************************************
* º¯ Êý Ãû : LcdWriteData
* º¯Êý¹¦ÄÜ : ÏòLCDдÈëÒ»¸ö×Ö½ÚµÄÊý¾Ý
* Êä Èë : dat
* Êä ³ö : ÎÞ
*******************************************************************************/
#ifndef LCD1602_4PINS
void LcdWriteData(uchar dat) //дÈëÊý¾Ý
{
LCD1602_E = 0; //ʹÄÜÇåÁã
LCD1602_RS = 1; //Ñ¡ÔñÊäÈëÊý¾Ý
LCD1602_RW = 0; //Ñ¡ÔñдÈë
LCD1602_DATAPINS = dat; //дÈëÊý¾Ý
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //дÈëʱÐò
Lcd1602_Delay1ms(5); //±£³Öʱ¼ä
LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat) //дÈëÊý¾Ý
{
LCD1602_E = 0; //ʹÄÜÇåÁã
LCD1602_RS = 1; //Ñ¡ÔñдÈëÊý¾Ý
LCD1602_RW = 0; //Ñ¡ÔñдÈë
LCD1602_DATAPINS = dat; //ÓÉÓÚ4λµÄ½ÓÏßÊǽӵ½P0¿ÚµÄ¸ßËÄ룬ËùÒÔ´«Ë͸ßËÄλ²»ÓøÄ
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //дÈëʱÐò
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = dat << 4; //дÈëµÍËÄλ
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //дÈëʱÐò
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/*******************************************************************************
* º¯ Êý Ãû : LcdInit()
* º¯Êý¹¦ÄÜ : ³õʼ»¯LCDÆÁ
* Êä Èë : ÎÞ
* Êä ³ö : ÎÞ
*******************************************************************************/
#ifndef LCD1602_4PINS
void LcdInit() //LCD³õʼ»¯×Ó³ÌÐò
{
LcdWriteCom(0x38); //¿ªÏÔʾ
LcdWriteCom(0x0c); //¿ªÏÔʾ²»ÏÔʾ¹â±ê
LcdWriteCom(0x06); //дһ¸öÖ¸Õë¼Ó1
LcdWriteCom(0x01); //ÇåÆÁ
LcdWriteCom(0x80); //ÉèÖÃÊý¾ÝÖ¸ÕëÆðµã
}
#else
void LcdInit() //LCD³õʼ»¯×Ó³ÌÐò
{
LcdWriteCom(0x32); //½«8λ×ÜÏßתΪ4λ×ÜÏß
LcdWriteCom(0x28); //ÔÚËÄλÏßϵijõʼ»¯
LcdWriteCom(0x0c); //¿ªÏÔʾ²»ÏÔʾ¹â±ê
LcdWriteCom(0x06); //дһ¸öÖ¸Õë¼Ó1
LcdWriteCom(0x01); //ÇåÆÁ
LcdWriteCom(0x80); //ÉèÖÃÊý¾ÝÖ¸ÕëÆðµã
}
#endif
lcd.h
#ifndef __LCD_H_
#define __LCD_H_
/**********************************
µ±Ê¹ÓõÄÊÇ4λÊý¾Ý´«ÊäµÄʱºò¶¨Ò壬
ʹÓÃ8λȡÏûÕâ¸ö¶¨Òå
**********************************/
//#define LCD1602_4PINS
/**********************************
°üº¬Í·Îļþ
**********************************/
#include<reg52.h>
//---Öض¨Òå¹Ø¼ü´Ê---//
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
/**********************************
PIN¿Ú¶¨Òå
**********************************/
#define LCD1602_DATAPINS P0
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
sbit LCD1602_E=P2^7;
/**********************************
º¯ÊýÉùÃ÷
**********************************/
/*ÔÚ51µ¥Æ¬»ú12MHZʱÖÓϵÄÑÓʱº¯Êý*/
void Lcd1602_Delay1ms(uint c); //Îó²î 0us
/*LCD1602дÈë8λÃüÁî×Óº¯Êý*/
void LcdWriteCom(uchar com);
/*LCD1602дÈë8λÊý¾Ý×Óº¯Êý*/
void LcdWriteData(uchar dat) ;
/*LCD1602³õʼ»¯×Ó³ÌÐò*/
void LcdInit();
#endif
main.c
#include<reg52.h>
#include<lcd.h>
#include "reg52.h" //´ËÎļþÖж¨ÒåÁ˵¥Æ¬»úµÄһЩÌØÊ⹦ÄܼĴæÆ÷
#include "lcd.h"
unsigned char irtime;//ºìÍâÓÃÈ«¾Ö±äÁ¿
sbit ir=P3^2;//ºìÍâÒý½Å¡£
bit irpro_ok,irok;
unsigned char IRcord[4]; //ºìÍâ½ÓÊÜ´¦Àí´æ·ÅÊý×é¡£
unsigned char irdata[33]; //ºìÍâÊý¾Ý
typedef unsigned int u16; //¶ÔÊý¾ÝÀàÐͽøÐÐÉùÃ÷¶¨Òå
typedef unsigned char u8;
typedef unsigned char u9;
typedef unsigned char u13;
//u13 zhu[]="1,2,3,4,5,6,7,8,9";
u8 Disp[]="Please password ";
u8 Displ[]=" eorr ";
u8 Disp2[]=" open ";
void Ir_work(void);
void Ircordpro(void);
/**********************************************
¶¨Ê±Æ÷0Öжϴ¦Àí
***********************************************/
void tim0_isr () interrupt 1 using 1
{
irtime++; //ÓÃÓÚ¼ÆÊý2¸öϽµÑØÖ®¼äµÄʱ¼ä
}
/**********************************************
ÍⲿÖжÏ0Öжϴ¦Àí
***********************************************/
void EX0_ISR (void) interrupt 0 //ÍⲿÖжÏ0·þÎñº¯Êý
{
static unsigned char i; //½ÓÊÕºìÍâÐźŴ¦Àí
static bit startflag; //ÊÇ·ñ¿ªÊ¼´¦Àí±ê־λ
if(startflag)
{
if(irtime<63&&irtime>=33)//Òýµ¼Âë TC9012µÄÍ·Â룬9ms+4.5ms
i=0;
irdata[i]=irtime;//´æ´¢Ã¿¸öµçƽµÄ³ÖÐøʱ¼ä£¬ÓÃÓÚÒÔºóÅжÏÊÇ0»¹ÊÇ1
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}
else
{
irtime=0;
startflag=1;
}
}
/***********************************
¶¨Ê±Æ÷0³õʼ»¯
***********************************/
void TIM0init(void)//¶¨Ê±Æ÷0³õʼ»¯
{
TMOD=0x02;//¶¨Ê±Æ÷0¹¤×÷·½Ê½2£¬TH0ÊÇÖØ×°Öµ£¬TL0ÊdzõÖµ
TH0=0x00; //ÖØÔØÖµ
TL0=0x00; //³õʼ»¯Öµ
ET0=1; //¿ªÖжÏ
TR0=1;
}
/****************************************
ÍⲿÖжÏ0³õʼ»¯
****************************************/
void EX0init(void)
{
IT0 = 1; //Ö¸¶¨ÍⲿÖжÏ0ϽµÑØ´¥·¢£¬INT0 (P3.2)
EX0 = 1; //ʹÄÜÍⲿÖжÏ
EA = 1; //¿ª×ÜÖжÏ
}
/***************************************
Ò£¿Ø¼üÖµ´¦Àí
****************************************/
void Ir_work(void)//ºìÍ⽨ֵɢת³ÌÐò
{
//LcdInit(); //lcd³õʼ»¯
switch(IRcord[2])
{
case 0x0c: LcdWriteData('1');break;//1
case 0x18: LcdWriteData('2');break;//2 // LcdWtiteCom(0x40+0x80)
case 0x5e: LcdWriteData('3');break;//3
case 0x08: LcdWriteData('4');break;//4
case 0x1c: LcdWriteData('5');break;//5
case 0x5a: LcdWriteData('6');break;//6
case 0x42: LcdWriteData('7');break;//7
case 0x52: LcdWriteData('8');break;//8
case 0x4a: LcdWriteData('9');break;//9
default:break;
}
irpro_ok=0;//´¦ÀíÍê³É±êÖ¾
}
/******************************************************
ºìÍâÂëÖµ´¦Àí
*******************************************************/
void Ircordpro(void)
{
unsigned char i,j,k;
unsigned char cord,value;
k=1;
for(i=0;i<4;i++) //´¦ÀíËĸö×Ö½Ú
{
for(j=1;j<=8;j++) //´¦Àí1¸ö×Ö½Ú8λ
{
cord=irdata[k];
if(cord>7)//´óÓÚij¸öÖµÊÇ1λ
value|=0x80;
if(j<8)
{
value>>=1;
}
k++;
}
IRcord[i]=value;
value=0;
}
irpro_ok=1;//´¦ÀíÍê³É±êÖ¾
}
/*******************************************************************************
* º¯ Êý Ãû : main
* º¯Êý¹¦ÄÜ : Ö÷º¯Êý
* Êä Èë : ÎÞ
* Êä ³ö : ÎÞ
*******************************************************************************/
void main(void)
{
int i=0;
EX0init(); //³õʼ»¯ÍⲿÖжÏ
TIM0init(); //³õʼ»¯¶¨Ê±Æ÷
LcdInit();
// u8 i;
for(i=0;i<16;i++)
{
LcdWriteData(Disp[i]);
}
while(1)//ËÀÑ»·
{
if(irok)
{
Ircordpro();
irok=0;
}
if(irpro_ok) //Èç¹û´¦ÀíºÃºó½øÐй¤×÷´¦Àí£¬Èç°´¶ÔÓ¦µÄ°´¼üºóÏÔʾ¶ÔÓ¦µÄÊý×ÖµÈ
{
Ir_work();
}
}
}
// u8 i;
// u9 j;
//int date='1' ;
//date=date;
// LcdInit(); //³õʼ»¯
// for(i=0;i<16;i++) //Ñ»·±éÀú×Ö·û´®
// {
// LcdWriteData(Disp[i]);//lcdдÈëÏàÓ¦ÊýÖµ
// }
// LcdWriteCom(0x40+0x80); //µÚ¶þÐÐ
// for(j=0;j<16;j++)
// {
// LcdWriteData(date);
// }
// while(1);
//}
实验结果:
按下红外遥控然后LCD1602显示0——9;