基于单片机的遥控解码.docx
《基于单片机的遥控解码.docx》由会员分享,可在线阅读,更多相关《基于单片机的遥控解码.docx(24页珍藏版)》请在冰豆网上搜索。
基于单片机的遥控解码
课程设计任务书
设计要求:
一.设计基于单片机的一个遥控器解码的电路。
用lcd1602显示tc9012红外遥控器所按得键值。
二.设计出硬件电路
1.原理图设计要符合项目的工作原理,连线要正确,端了要不得有标号。
2.图中所使用的元器件要合理选用,电阻,电容等器件的参数要正确标明。
3.原理图要完整,CPU,外围器件,扩器接口,输入/输出装置要一应俱全。
三.设计出软件编程方法,并写出源代码;
1.根据要求,将总体项能分解成若干个子功能模块,每个功能模块完成一个特定的功能。
2.根据总体要求及分解的功能模块,确定各功能模块之间的关系,设直出完整的程序流程图。
3.系统的各各功能模块要清楚,有序。
1.摘要
本系统通过tc9012红外遥控器发射红外信号再由tl1838接收红外信号。
由AT89C52将接收到的信号通过lcd1602显示出来。
单片计算机即单片微型计算机。
由RAM,ROM,CPU构成,定时,计数和多种接口于一体的微控制器。
它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。
而51系列单片机是各单片机中最为典型和最有代表性的一种。
这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。
TC9012F是一种通用型红外遥控信号发送用CMOS大规模集成电路,适用于电视(TV),磁带录像机(VTR),激光唱机等设备的遥控操作。
市场上,以TC9012F为核心的9012型红外遥控器被广泛使用且价格便宜。
tc9012红外遥控器常用的有通过脉冲宽度来实现信号调制的脉宽调制(pwm)和通过脉冲串之间的时间间隔来实现先好调制脉时调制(ppm)两种方法
Lcd1602显示的是tc9012遥控器键值,以十六进制方式表示。
距离是小于10m
重点词汇红外发射器tc9012红外接收tl1838lcd1602AT89C52
目录
1.摘要
2.引言
3.基本知识的介绍
3.1红外接收器和遥控器的介绍
3.2显示器lcd1602的介绍
3.3单片机的介绍
4硬件方案的设计
4.1红外收发器1838的设计
4.2lcd1602的设计
4.3AT89C52的设计
4.4整个系统的电路图
5软件方案的设计
5.1主程序的工作流程图
5.2中断服务程序的工作流程图
6附录程序
7实物图
8总结
2.引言
红外线遥控是目前使用最广泛的一种通信和遥控手段。
由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。
工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。
红外遥控器实际上是有红外发射器常用的有通过脉冲宽度来实现信号调制的脉宽调制(pwm)和通过脉冲串之间的时间间隔来实现先好调制脉时调制(ppm)两种方法我们可以通过tl1838接收红外信号。
由tl1838内部电路将红外脉冲信号转化成数字信号。
再有单片机解码由lcd1602显示出来。
Lc9012红外遥控器常用的有通过脉冲宽度来实现信号调制的脉宽调制(pwm)和通过脉冲串之间的时间间隔来实现先好调制脉时调制(ppm)两种方法
3.基本知识的介绍
3.1红外接收头和遥控器
红外遥控信号是一连串的二进制脉冲码。
为了使其在无线传输过程中免受其他红外信号的干扰,通常都是先将其调制在特定的载波频率上,然后再经红外发射二极管发射出去,而红外线接收装置则要滤除其他杂波,只接收该特定频率的信号并将其还原成二进制脉冲码,也就是解调.
目前,对于这种进行了调制的红外遥控信号,通常是采用一体化红外线接收头进行调解.一体化红外线接收头将红外发光二极管,低噪音放大器,限幅器,带通滤波器,解调器,,以及整形驱动电路等集成在一起.一体化红外线接收头体积小,灵敏度高,外接元件少,抗干扰能力强,使用十分方便.
Tl1838一.概述一体化红外线遥控接收头是将光探测器与前置放大器封装在一起,以实现遥控信号的放大。
带内屏蔽封装可滤除可见光干扰,检波输出可直接由微处理器译码,主要用于家用电器、空调、玩具等领域。
二.特点没有外围电路可靠性高内外带部屏蔽,抗干扰能力强宽电压(2.2~6.0),低功耗高灵敏度,输出范围大TTL和CMOS兼容,低电平有效三.极限参数(T=25℃)
遥控器:
TC9012F是一种通用型红外遥控信号发送用CMOS大规模集成电路,适用于电视(TV),磁带录像机(VTR),激光唱机等设备的遥控操作。
市场上,以TC9012F为核心的9012型红外遥控器被广泛使用且价格便宜。
常用的有通过脉冲宽度来实现信号调制的脉宽调制(pwm)和通过脉冲串之间的时间间隔来实现先好调制脉时调制(ppm)两种方法
数据格式包括引导码,数据码,用户码,数据反码。
编码总站32个字节。
编码可以对对数据纠错。
使用455k晶振时各代码所占用的时间
3.2显示器lcd1602
字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样
1602液晶的基本的操作分为以下四种:
状态字读操作:
输入RS=低、RW=高、EP=高;输出:
DB0~7读出为状态字;
数据读出操作:
输入RS=高、RW=高、EP=高;输出:
DB0~7读出为数据;
指令写入操作:
输入RS=低、RW=低、EP=上升沿;输出:
无;
数据写入操作:
输入RS=高、RW=低、EP=上升沿;输出:
无。
如图3.21602模块的引脚
指令说明:
显示代码0x38;
显示开/关及光标设置
数据指针控制设置
读时序操作图
写时序操作图
时序参数
3.3单片机的介绍
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C52的一些特殊功能口,如下表所示:
口管脚备选功能
P3.0RXD(串行输入口)P3.1TXD(串行输出口)P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)P3.4T0(记时器0外部输入)P3.5T1(记时器1外部输入)P3.6/WR(外部数据存储器写选通)P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,
图3.389C52单片机
将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
4硬件的设计
4.1红外接收头tl1838的设计
Tl1838电路图如下
图4.1tl1838
4.2lcd1602的设计
图中P3A,P3B,P3C分别依次接单片机的P3口的P30,P31和P2口的P22。
4.3单片机AT89C52的设计
下图中按钮时单片机复位按钮,右侧是复位电路。
4.4整个系统电路图
5软件方案的设计
5.1主程序工作流程图
按上述工作原理和硬件结构分析可知系统主程序工作流程图如下图所示;
N
Y
Y
N
5.2中断服务程序工作流程图
本程序功能是当监测的有红外信号时,通过单片机解码再由LCD1602显示出遥控器的键值。
N
Y
6附录
//本程序主要是遥控器解码和1602驱动程序
//-------------------------------------------------------
//LCD1602IR-DECODE
//writedbynxp---2010.6.3
//-------------------------------------------------------
//连线表:
CPU=89c52
//SysClock=12MHz
//LCD:
1602
//功能:
解码红外遥控器
//遥控器芯片:
tc9012-011
#include
#defineucharunsignedchar
#defineuintunsignedint
/*-----------------------控制I/O口设置,根据实际而定---------------*/
#defineRSP3_0//RS数据命令选择端,高电平数据,低电平命令
#defineRWP3_1//RW读写选择端,高电平读操作,低电平写操作
#defineEP2_2//E使能控制端,E高电平跳变为低电平时LCD执行命令
#defineDATAP0//数据端口定义
#defineD0P0_0
#defineD1P0_1
#defineD2P0_2
#defineD3P0_3
#defineD4P0_4
#defineD5P0_5
#defineD6P0_6
#defineD7P0_7
#defineKEY1P1_0
#defineKEY2P1_1
#defineIR_REP3_2
/*-----------------------------------------------------------------*/
bitk=0;//红外解码判断标志位,为0则为有效信号,为1则为无效
ucharn=0;//用来控制外部中断
ucharcodestr0[16]="REMOTECONTROL";//开机画面显示
ucharcodestr1[16]="IR-CODE:
";
ucharcodestr2[16]="ERROR";
uchar*p0=str0;
uchar*p1=str1;
uchar*p2=str2;
delay1ms(uintk);
voiddisp(void);//红外键值显示程序
uchardatadate[4];//date数组为存放地址原码,反码,数据原码,反码
/*------------LCD忙判断子程序-----------------------------------*/
voidbusy()
{
RS=0;RW=1;
E=0;E=1;DATA=0xff;
while(D7);
}
/*-----------写命令子程序-----------------------------------------*/
voidwcom(ucharcom)
{
busy();
RS=0;RW=0;
E=1;
DATA=com;
E=0;
}
/*------------写数据子程序--------------------------------------*/
voidwdata(uchardat)
{
busy();
RS=1;RW=0;
E=1;
DATA=dat;
E=0;
}
/*------------读命令子程序-----------------------------------*/
ucharrcom(void)
{
ucharcom;
busy();
RS=0;RW=1;
DATA=0xff;
E=1;
com=DATA;
E=0;
return(com);
}
/*-----------------读数据子程序-----------------------------*/
ucharrdat(void)
{
uchardat;
busy();
RS=1;RW=1;
DATA=0xff;
E=1;
dat=DATA;
E=0;
return(dat);
}
/*--------------------------延时1ms程子程序-----------------------*/
delay1000()
{
uinti,j;
for(i=0;i<1;i++)
for(j=0;j<124;j++)
;
}
/*---------------------延时882us子程序-----------------------*/
delay882()
{
uinti,j;
for(i=0;i<1;i++)
for(j=0;j<109;j++)
;
}
/*-----------------延时2400ms程子程序-----------------------*/
delay2400()
{
uinti,j;
for(i=0;i<3;i++)
for(j=0;j<99;j++)
;
}
/*--------以下为初始化程序,由上面子程序组成,根据个人爱好-----------*/
/******************************清屏程序***************************/
voidclear()
{wcom(0x01);}
/******************************归位程序*****************************/
voidrehome()
{wcom(0x02);}
/**************8*****888**88888显示模式设定8888888888888888888888*/
voidmode(bitx)
{
if(x==1)wcom(0x38);//两行5*8mode
elsewcom(0x34);//一行5*10mode
}
/*--------------显示开关控制命令----------------------------*/
voidon_off(bitx)
{
if(x==1)wcom(0x0f);//显示开,光标开,光标闪烁
elsewcom(0x0c);//显示开,光标关
}
/*---------------------init初始化组合-------------------------*/
voidinit()
{
clear();//清屏
mode
(1);//模式设置
on_off
(1);//显示设置
wcom(0x06);//移动方式
}
/*---------------------------对字符串的处理------------------------*/
voidstrchar(uchar*p)
{
while(*p!
='\0')
{
wdata(*p);
p++;
}
}
/*----------------------------------------------------------*/
/*-----------------------红外解码程序(核心)-----------------*/
/*----------------------------------------------------------*/
voidIR_decode()
{
uchari,j;
while(IR_RE==0);
delay2400();
if(IR_RE==1)//延时2.4ms后如果是高电平则是新码
{
delay2400();//延时4.8ms避开4.5ms的高电平
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(IR_RE==0);//等待地址码第1位高电平到来
delay882();//延时882ms判断此时引脚电平
///CY=IR_RE;
if(IR_RE==0)
{
date[i]>>=1;
date[i]=date[i]&0x7f;
}
elseif(IR_RE==1)
{
delay1000();
date[i]>>=1;
date[i]=date[i]|0x80;
}
}//1位数据接收结束
}//32位二进制码接收结束
}
}
/*--------------二进制码转换为压缩型BCD码,并显示---------------*/
voidtwo_2_bcd(uchardate)
{
uchartemp;
temp=date;
date&=0xf0;
date>>=4;//右移四位得到高四位码
date&=0x0f;//与0x0f想与确保高四位为0
if(date<=0x09)
{
//wcom(0xcb);
wdata(0x30+date);//lcd显示键值高四位
}
else
{
date=date-0x09;
//wcom(0xcb);
wdata(0x40+date);
}
date=temp;
date&=0x0f;
if(date<=0x09)
{
wdata(0x30+date);//lcd显示低四位值
}
else
{
date=date-0x09;
wdata(0x40+date);
}
wdata(0x48);//显示字符'H'
}
//////////////////////////////转换程序结束///////////////////////////
/*--------------解码成功后,1602显示键值子程序---------------*/
voiddisp()
{
uchardate1;
date1=date[3]^0xff;//如果得到的数据原码和数据反码相反
if(date[2]==date1)//显示键值
{
wcom(0xc0);
two_2_bcd(date[0]);
wdata(0x20);
two_2_bcd(date[1]);
wdata(0x20);
two_2_bcd(date[2]);
wdata(0x20);
two_2_bcd(date[3]);
}
}
/*----------------------外部中断0程序-------------------------*/
/*---------------主要用于处理红外遥控键值--------------------*/
voidint0()interrupt0
{
uinti;
for(i=0;i<4;i++)
{
delay1000();
if(IR_RE==1){k=~k;}//刚开始为4.5ms的引导码,如果4ms内出现高电平则退出解码程序
}
if(k==0)
{
EX0=0;//检测到有效信号关中断,防止干扰
IR_decode();//如果接收到的是有效信号,则调用解码程序
disp();//解码成功,调用显示程序,显示该键值
}
EX0=1;//开外部中断,允许新的遥控按键
}
/*---------------------------------------------------------------*/
/*以下为主程序,主要对LCD初始化,开始界面设置*/
/*---------------------------------------------------------------*/
voidmain(void)
{
SP=0x60;//堆栈指针
TMOD=0x11;//定时器模式设置所选为模式1
TH0=0xd8;//定时器初值理论为10ms;
TL0=0xf7;//实际取d8f7
ET0=1;//允许定时器0中断
EX0=1;//允许外部中断0,用于检测红外遥控器按键
EA=1;//总中断开
init();//初始化LCD
wcom(0x80);//写入字符的地址为第1行第1列
strchar(p0);//调用显示字符串函数
wcom(0xc0);
while
(1);
}
7实物图
按下遥控器的“0”显示是
遥控器
按下遥控器的“静音”显示是