资源描述
嵌入式系统设计与开发课程设计一、 设计题目:基于89C52的红外遥控数码管二、设计目的:1.熟悉STC89C52开发板的结构,功能;2.熟悉程序的编写过程、下载过程;3.了解遥控器解码的过程;4.理解主要程序的功能。三、设计内容:通过开发板上的八位数码管,显示遥控器上相应的按键所代表的数字。四、 STC89C52介绍:STC89C52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 特性:1)片内存储器包含8KB的FLASH,可在线编程,檫写次数不少于1000次2)256字节片内数据RAM3)32根可编程I/0口线4)8个中断源、6个中断矢量、两个优先权的中断结构5)1个可编程全双工串行接口6)3个可编程定时/计数器7)两种低功耗模式分别是空闲模式和掉电模式8)具有3级程序锁定位9)含有一个看门狗定时器10)具有断电标志POF11)全静态工作频率033MHz12)完全兼容MCS51产品原理图:芯片图:引脚介绍:ALE 地址锁存允许/PSEN 程序存储器允许EA/VPP 为0访问外部程序存储器 为1访问内部程序存储器RST 复位信号输入XTAL1、XTAL2 外部晶振P0.0P0.7 I/O端口(P0口)P1.0P1.7 I/O端口(P1口)P2.0P2.7 I/O端口(P2口)P3.0P3.7 I/O端口(P3口) 五、 设计原理:红外对射管由发射管和接受管组成,设计中发射管在遥控上,接受管为方形红外接收管,下面将进行详细介绍。1、 红外接收管: 红外线接收管是在LED行业中命名的,是专门用来接收和感应红外线发射管发出的红外线光线的。一般情况下都是与红外线发射管成套运用在产品设备当中。 红外线接收管是将红外线光信号变成电信号的半导体器件,它的核心部件是一个特殊材料的PN结,和普通二极管相比,在结构上采取了大的改变,红外线接收管为了更多更大面积的接受入射光线,PN结面积尽量做的比较大,电极面积尽量减小,而且PN结的结深很浅,一般小于1微米。红外线接收二极管是在反向电压作用之下工作的。没有光照时,反向电流很小(一般小于0.1微安),称为暗电流。当有红外线光照时,携带能量的红外线光子进入PN结后,把能量传给共价键上的束缚电子,使部分电子挣脱共价键,从而产生电子-空穴对(简称:光生载流子)。它们在反向电压作用下参加漂移运动,使反向电流明显变大,光的强度越大,反向电流也越大。这种特性称为“光电导”。红外线接收二极管在一般照度的光线照射下,所产生的电流叫光电流。如果在外电路上接上负载,负载上就获得了电信号,而且这个电信号随着光的变化而相应变化。 2.遥控器红外线遥控是目前使用最广泛的一种通信和遥控手段,它具有体积小、功耗低、功能强、成本低等特点。通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如下所示:a.发射部分:键盘矩阵、编码调制、LED红外发送器键盘编码调制红外LED发射(38KHz的载波)b.接收部分光/电放大解调52单片机解码3.红外解码当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征:a. 采用脉宽调制的串行码b. 以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”。LC7461产生的遥控编码是连续的42位二进制码组,其中前26位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。后16位为8位的操作码和8位的操作反码用于核对数据是否接收正确。当遥控器上任意一个按键按下超过36ms时,LC7461芯片的振荡器使芯片激活,将发射一个特定的同步码头,对于接收端而言就是一个9ms的低电平,和一个4.5ms的高电平,这个同步码头可以使程序知道从这个同步码头以后可以开始接收数据。解码时,“0”、“1”均以0.56ms的低电平开始,不同的是高电平的宽度不同,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平的宽度区别“0”和“1”。如果从0.56ms低电平过后,再经过0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”。为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,读到的已是下一位的高电平,一般取0.84ms左右即可。4. 数码管显示电路六、 设计过程:1.熟悉阶段:开发板、编程软件(KEIL)、下载方法(看门狗STC-ISP)2.硬件结构STC89C52红外遥控器红外接收头复位电路时钟振荡电路数码管显示3.程序流程图码值识别数码管显示并返回初始化时间值转换为二进制(解码)接收到红外线?NY七、心得体会经过这次的设计,对51单片机中的红外遥控数码管这一部分有了充分的了解。先从硬件上来说,对红外对射管有了一定的了解,知道了它的工作原理。对遥控解码原理也有了一定的了解,理解到是通过判断电平延时的长度判断遥控码为0还是为1。在读取了所有遥控码之后,再对遥控码第三位的数据码进行读取,从而显示相应的按键数字。了解时间值的作用之后,也就自然知道解码过程是把时间值转换为二进制值的原因了。再从程序来说,以前学过C语言,MATLAB,JAVA,都是编程的,所以对嵌入式的程序不会太陌生,但是要真正搞懂或者要自己编程还是有极大的困难,而通过这次设计,对本实验的程序做了一定的了解,虽然有些地方还不是很明白,但是充分提供了一个学习的机会,经过上网查找,同学讨论,还是学到了不少东西。通过自己选题,可以选择自己感兴趣的课题做实验,增加了学习兴趣,发现嵌入式系统的优点:专用性强,系统精简等。主要还是靠程序。相信在不断训练,理解程序下,将来自己也可以编写出实用的程序,来实现一些功能。八、参考资料1.红外线解码心得和解码程序 作者:程克辉网址: 2.遥控器红外解码数码管显示 作者:151129网址: 3.基于51单片机的红外线控制系统 作者:突然想去很远网址: 4.红外解码1602液晶显示 作者:QLS小屁孩网址: 附:程序/使用12M晶振#include#include#include#define TURE 1#define FALSE 0基本参数定义sbit IR=P32;/红外接口标志sbit Q=P25;sbit dula=P26;sbit wela=P27;unsigned char const dofly=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/显示0-9unsigned char irtime;/红外用全局变量bit irpro_ok,irok;unsigned char IRcord4;/红外码一般由四个字节组成:地址码-地址码-数据码-数据反码unsigned char irdata33;/存储32+1位void Delay(unsigned char mS);void Ir_work(void);void Ircordpro(void);void tim0_isr (void) interrupt 1 using 1/定时器0中断服务函数,记录电平的持续时间 irtime+;void ex0_isr (void) interrupt 0 using 0/外部中断0服务函数,存储持续时间 static unsigned char i; static bit startflag; if(startflag) if(irtime=33)/引导码 TC9012的头码 i=0; irdatai=irtime;/ 存储每个电平的持续时间 irtime=0; i+; if(i=33) irok=1;定时器及中断 i=0; elseirtime=0;startflag=1;void TIM0init(void)/定时器0初始化 TMOD=0x02;/定时器0工作方式2,TH0是重装值,TL0是初值 TH0=0x00;/reload value TL0=0x00;/initial value ET0=1;/开中断 TR0=1;void EX0init(void) IT0 = 1; / Configure interrupt 0 for falling edge on /INT0 (P3.2) EX0 = 1; / Enable EX0 Interrupt EA = 1; void Ir_work(void)/红外键值散转程序 Q=1; wela=1; P0=0x00; wela=0; dula=1; switch(IRcord2)/判断第三位的数码值 case 0:P0=dofly1;break;/1 显示相应的按键值 case 1:P0=dofly2;break;/2 case 2:P0=dofly3;break;/3 case 3:P0=dofly4;break;/4 case 4:P0=dofly5;break;/5 case 5:P0=dofly6;break;/6 case 6:P0=dofly7;break;/7 case 7:P0=dofly8;break;/8 case 8:P0=dofly9;break;/9 irpro_ok=0;/处理完成标志 dula=0; void Ircordpro(void)/红外码值处理函数,即解码 unsigned char i, j, k; unsigned char cord,value; k=1; for(i=0;i4;i+)/处理4个字节 for(j=1;j7)/判断读取的时间值是否大于1 value=value|0x80;/读取数置1 else value=value; if(j1;/由于从高位读取遥控器发送的数据,故要右移把第一次度的数据送到最低位 k+; IRcordi=value; value=0; irpro_ok=1;/处理完毕标志位置1 void main(void) EX0init(); / Enable Global Interrupt Flag TIM0init();/初始化定时器0while(1)/主循环 if(irok)/接收到红外 Ircordpro();/解码,时间值转换为二进制 irok=0; if(irpro_ok)/解码成功 Ir_work();/码值识别散转 嵌入式相关资料
展开阅读全文