《msp430大作业.doc》由会员分享,可在线阅读,更多相关《msp430大作业.doc(20页珍藏版)》请在三一办公上搜索。
1、基于msp430单片机的遥控器设计报告 学号_02121427_ 班级_021215_ 姓名_董国庆_一、摘要红外遥控器在家电中得到了广泛应用,但各产品的遥控器不能相互兼容,使得生活中遥控器数目越来越多,使用时常混淆。另外,若遥控器丢失,找到配套的遥控器也很困难。具有学习功能的智能遥控器以普通的低成本单片机为核心,能解码与记忆遥控器编码,并模拟发射,是一个遥控器可以代替多个遥控器控制多个电器,是一种智能化的控制工具。我在此介绍的多功能红外遥控器是使用MSP430单片机作为整个系统的主控芯片,具有多功能自适应性,两种工作状态:学习状态和控制状态。可以对多种遥控器进行解码以及自学习功能,即实现了对
2、多种电器的遥控控制功能。二、硬件设计红外遥控发射及其编码 红外遥控发射器采用一块大规模集成电路(LSI),当按压功能指令键盘时,由LSI产生经过调制的串行编码,通过激励电路,驱动红外线发光二极管发光,将编码信号经红外线二次调制后发射出去。二次调制首先是用与键盘操作相对应的控制信号对38到40 kHz左右的载波信号进行脉冲调制,然后再去对波长约为950 nm的红外光载波进行第二次幅度调制,即用驱动红外线发光二极管方法产生红外遥控信号。当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.565 ms、间隔0.56 ms、周期为1
3、.125ms的组合表示二进制的“0”;以脉宽为0.565 ms、间隔1.685 ms、周期为2.25 ms的组合表示二进制的“1”,其波形如图所示:遥控器的“0”和“1”上述“0”和“1”组成的32位二进制码经38 kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射,如图所示:完整的红外数据编码图遥控信号编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。后16位为8位操作码(功能码)及其反码。遥控器在按键按下后,周期行地发出同一种32位二进制码,周期约为108 ms。一组码本身的持
4、续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在4562 ms之间。当一个键按下超过36 ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108 ms发射代码由一个起始码(9 ms),一个结束码(4.5 ms),低8位地址码(9 ms18 ms),高8位地址码(9 ms18 ms),8位数据码(9 ms18 ms)和这8位数据的反码(9 ms18 ms)组成。如果键按下超过108 ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9 ms)和结束码(4.5 ms)组成。红外遥控接收及其解码 解码的关键是如何识别“0”和“1”,由于接收代码是发射代码的反码,发射代码中
5、“0”和“1”的高电平宽度相同,低电平宽度不同,所以,从位的定义我们可以发现接收代码中“0”、“1”均以0.56 ms的低电平开始,不同的是高电平的宽度不同,“0”为0.56 ms,“1”为1.68 ms,所以必须根据高电平的宽度区别“0”和“1”。如果从0.56 ms低电平过后,开始延时,0.56 ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56 ms长些,但又不能超过1.12 ms,否则如果该位为“0”,读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最晚可靠,一般取0.84 ms左右均可。红外系统硬件设计 红外
6、遥控系统主要由遥控发射器、一体化接收头、单片机、接口电路组成。遥控器用来产生遥控编码脉冲,驱动红外发射管输出红外遥控信号,遥控接受他完成对遥控信号的放大、检波、整形、解调出遥控编码脉冲。遥控编码脉冲是一组串行二进制码,对于一般的红外遥控系统,此串行码输入到微控制器,由其内部CPU完成对遥控指令解码,并执行相应的遥控功能。使用遥控器作为控制系统的输入,需要解决如下几个关键问题:如何接收红外遥控信号;如何识别红外遥控信号以及解码软件的设计、控制程序的设计。红外系统整体设计框图红外接收电路设计 接收电路使用集成一体化红外接收头SM0038,SM0038对外只有3个引脚:VS、GND和1个脉冲信号输出
7、引脚OUT。与单片机接口非常方便。VCC接电源(+5 V)并经电容进行滤波,以避免电源干扰;GND接系统的地线(0 V);脉冲信号输出接CPU的中断输入引脚。采取这种连接方法,软件解码既可工作于查询方式,也可工作于中断方式。红外发射电路设计 因为发光二极管的发光距离与其发射功率成正比,为了提高发光二极管的发光距离,必须提高它的发射功率,也就是使红外发光二极管工作于脉冲状态。可以用两种方法来实现:一是用硬件方法,即设计脉冲电路来产生占空比尽量小的脉冲载波信号;另一种就是用软件来控制MSP430的输出端P2.0,让其输出即为占空比较小的脉冲信号。红外遥控发射模块框图如图是目前所有红外遥控器发射电路
8、的功能组成,其中的编码器即调制信号,按遥控器用途的编码方式可以很简单、也可以很复杂。例如用于电视机、VCD、DVD和组合音响的遥控发射的编码器,因其控制功能多达50种以上,此时的编码器均采用专用的红外线编码协议进行严格的编程,然而对控制功能少的红外遥控器,其编码器是简单而灵活。前者编码器是由生产厂家的专业人员按红外遥控协议进行编码,而后者适用于一般电子技术人员和电子爱好者的编码。图2-4中的38 kHz振荡器即载波信号比较简单,但专业用的和业余用的也有区别,专业用的振荡器采用了晶振,而后者一般是RC振荡器。例如彩电红外遥控器上的发射端用了455 kHz的晶振,是经过整数分频的,分频系数为12,
9、即455kHz12=37.9kHz。当然也有一些工业用的遥控系统,采用36 kHz、40 kHz或56 kHz等的载波信号。上图中中编码器的编码信号对38 kHz的载波信号进行调制,在经红外发射管D向空间发送信号供遥控接收端一体化接收头接收、解调输出、再做处理。利用红外线的特点,可以制作多路遥控器。在遥控发射电路中,有两种电路,即编码器和38 kHz载波信号发生器。在不需要多路控制的应用电路中,可以使用常规集成电路组成路数不多的红外遥控发射和接收电路,该电路无需使用较复杂的专用编译码器,因此制作容易。单片机控制红外发射电路设计这里利用软件来实现这个功能。即在需要输出高电平的时候,让程序定时把P
10、2.1口输出状态反向,其中定时时间是由指令数和指令周期来决定的,每条指令的指令执行周期是固定的,所以如果想让反向频率高一些,则让指令执行的少一些,反之就让指令多一些。可见输出信号占空比可以由定时时间的长短来决定,这样就可以在高电平时输出占空比尽量小的脉冲信号。因为接收头对38 kHz的光信号转换能力比较强,所以把高电平的频率设置为38 kHz。在需要输出低电平的时候,控制P2.1口一直为低就可以了。红外发光二极管发射时,先发一段前导码,以检验这组码是否为想要的码。前导码由一个9 ms的高电平和一个4 ms的低电平组成。然后再发32位数据代码,其中高电平为0.5 ms,低电平为0.5 ms的一个
11、周期为代码“0”;高电平为0.5 ms,低电平为1.5 ms的一个周期为代码“1”,为了提高发射功率,实际工作时,发光二极管的高电平用38 kHz的载波信号载波,低电平则一直为低。矩阵键盘原理分析行列扫描式键盘又叫矩阵键盘,矩阵键盘电路主要是对MSP430单片机的一般I/O口来进行扩展设计。矩阵键盘由行线和列线组成。矩阵键盘通过扫描来实现捕获键盘的输入。所谓扫描就是单片机不断地对行线一次设置低电平,然后检查列线的输入状态,从而确定键盘是否有输入。如图,为键盘的电路设计图。键盘电路P1.0、P1.1、P1.2、P1.3分别为键盘的列线。P1.4、P1.5、P1.6、P1.7为键盘的行线。列线为输
12、入口,行线为输出口。由于所有列线都上拉到3.3V,所以在没有任何键被按下时,所有列线上都为高电平。当往相应的行线上输出低电平,如果键盘上某个键被按下时,则某个列线就为低电平,单片机读取该列线的状态就可以判断某个被按下,这就是键盘的扫描原理。由于MSP430单片机的P1口具有中断功能,因此在软件设计时,可以采用一般I/O口来实现键盘输入,也可以利用P1口的中断功能来实现键盘输入。三、程序设计一般I/0口方式的程序设计根据上面的原理分析,软件主要是基于扫描实现的。软件通过设置行线上的输出,读取列线上的状态来获取键盘的输入值,整个程序处于键盘的扫描状态。在实际的应用中,有时候按键的抖动可能引起误判,
13、所以在程序设计时必须考虑消除抖动。如图所示为程序流程图。一般I/O方式程序设计流程图可以看出,整个程序包括端口初始化、键盘扫描、抖动消除和键盘识别等几个部分,下面具体分析键盘扫描程序。键盘扫描程序主要是等待按键的按下,如果有按键按下,则进行按键输入分析,在进行键盘扫描的时候,为了简单起见,在等待键盘输入的时候采取的是死循环等待方式,在实际中可以采用其它灵活的方式,具体情况根据系统的需求来确定,下面为具体的程序。int KeyScan(void)int nP10,nP11,nP12,nP13;int nRes = 0;for(;)/读取各个管脚的状态nP10 = P1IN & BIT0;nP11
14、 = (P1IN & BIT1) 1;nP12 = (P1IN & BIT2) 2;nP13 = (P1IN & BIT3) 3;/是否有键被按下if(nP10 = 0 | nP11 = 0 | nP12 = 0 | nP13 = 0)break;/有键被按下Delay();/延时一点时间,消除抖动/读取各个管脚的状态nP10 = P1IN & BIT0;nP11 = (P1IN & BIT1) 1;nP12 = (P1IN & BIT2) 2;nP13 = (P1IN & BIT3) 3;/是否有键被按下if(nP10 = 0 | nP11 = 0 | nP12 = 0 | nP13 = 0
15、)/有键被按下,进行键盘输入分析nRes = KeyProcess();else return -1; /没有输入,为干扰return nRes;其中,Delay()为延时程序,用于消除抖动,具体程序如下:void Delay()int i;for(i=100;i0;i-); /延时一点时间即可中断功能方式的程序设计由于MSP430单片机的P1口有中断功能,因此可以采用中断的方式进行软件设计,采用中断方式实现的软件不需要扫描处理。另外,在端口的初始化时也有所不同,下面是端口初始化的具体程序。void Init_Port(void)/将P1口的所有的管脚在初始化的时候设置为输入方式P1DIR =
16、 0;/将P1口所有的管脚设置为一般I/O口P1SEL = 0;/将P1.4、P1.5、P1.6、P1.7设置为输出方向P1DIR |= BIT4;P1DIR |= BIT5;P1DIR |= BIT6;P1DIR |= BIT7;P1OUT = 0x00; /先输出低电平P1IE = 0; /将中断寄存器清零P1IES = 0;P1IFG =0;/打开管脚的中断功能/对应的管脚由高到低电平跳变是相应的标志置位P1IE |= BIT0;P1IES |= BIT0;P1IE |= BIT1;P1IES |= BIT1;P1IE |= BIT2;P1IES |= BIT2;P1IE |= BIT3
17、;P1IES |= BIT3;_EINT();/打开中断return;上面的程序中增加了中断设置,并设置成低电平触发中断方式。由于使用中断功能,因此必须打开全局中断使能位。上面的“_EINT();”就是打开全局中断功能使能位。键盘的输入处理可以在P1口的中断服务程序中进行处理。下面为中断服务程序。/处理来自端口1的中断interrupt PORT1_VECTOR void PORT_ISR(void)Delay(); /延时消抖KeyProcess();if(P1IFG & BIT0)P1IFG &= (BIT0); /清除中断标志位if(P1IFG & BIT1)P1IFG &= (BIT1
18、); /清除中断标志位if(P1IFG & BIT2)P1IFG &= (BIT2); /清除中断标志位if(P1IFG & BIT3)P1IFG &= (BIT3); /清除中断标志位LCD1602硬件电路设计如图所示,为MSP430与LCD1602的接口电路图,连接电路比较简单,使用P4口作为数据传输接口,使用P3.0、P3.1、P3.2作为液晶控制接口。 液晶硬件连接图LCD1602控制说明状态字说明STA0STA6=D0D7 当前数据地址指针的数值STA7读写操作使能(1:禁止,0:允许)显示模式设置指令码:0x38功能:设置162显示,57点阵,8位数据接口显示开/关及光标设置指令码
19、:00001DCB(8位二进制码)D=1 开显示;D=0 关显示;C=1 显示光标;C=0 不显示光标B=1 光标闪烁;B=0 光标不显示指令码:000001NSN=1 当读或写一个字符后地址指针加1,且光标加1N=0 当读或写一个字符后地址指针减1,且光标减1S=1 当写一个字符,整屏显示左移(N=1)或右移(N=0)S=0 当写一个字符,整屏显示不移动软件程序设计了解了1602的操作时序与指令,将电路连接后,下面开始程序的编写。首先,为了方便程序的书写,我们先对接口进行一下宏定义,这样使得程序易读且清晰。#define DataDir P4DIR /数据方向选择#define DataPo
20、rt P4OUT#define Busy 0x80#define CtrlDir P3DIR#define CLR_RS P3OUT&=BIT0; /RS = P3.0#define SET_RS P3OUT|=BIT0;#define CLR_RW P3OUT&=BIT1;/RW = P3.1#define SET_RW P3OUT|=BIT1;#define CLR_EN P3OUT&=BIT2;/EN = P3.2#define SET_EN P3OUT|=BIT2;向液晶显示的当前地址写入显示数据void LcdWriteData( uchar data ) /data为要显示的数据
21、WaitForEnable(); /等待液晶不忙 SET_RS; CLR_RW; _NOP(); DataPort = data; /将显示数据写入数据端口 _NOP(); SET_EN; /产生使能脉冲信号 _NOP(); _NOP(); CLR_EN;向液晶模块写入命令void LcdWriteCommand(uchar cmd,uchar chk) if (chk) WaitForEnable(); / 检测忙信号? CLR_RS; CLR_RW; _NOP(); DataPort = cmd; /将命令字写入数据端口 _NOP(); SET_EN; /产生使能脉冲信号 _NOP();
22、_NOP(); CLR_EN;1602的初始化void LcdInit(void) CtrlDir |= 0x07; /控制线端口设为输出状态 DataDir = 0xFF; /数据端口设为输出状态 LcdWriteCommand(0x38, 0); /规定的复位操作 Delay5ms(); LcdWriteCommand(0x38, 0); Delay5ms(); LcdWriteCommand(0x38, 0); Delay5ms(); LcdWriteCommand(0x38, 1);/显示模式设置 LcdWriteCommand(0x08, 1);/显示关闭 LcdWriteComma
23、nd(0x01, 1); /显示清屏 LcdWriteCommand(0x06, 1);/写字符时整体不移动 LcdWriteCommand(0x0c, 1);/显示开,不开游标,不闪烁红外数据的解码与存储红外解码程序流程图1.红外解码程序:#include #define Ir_Pin (P2IN & 0X80) /定义红外接收头端口unsigned char Ir_Buf4; / 用于保存解码结果unsigned int Ir_Get_Low(); unsigned int Ir_Get_High();/* 函数名称:main功 能:主函数参 数:无返回值 :无 */void main(v
24、oid) unsigned int temp,delay; char i,j; WDTCTL = WDTPW + WDTHOLD; / 关闭看门狗 BCSCTL1 &= XT2OFF; / XT2on BCSCTL2 |= SELM1 + SELS; / MCLK为8M for(delay=5000;delay0;delay-); IFG1 &=OFIFG; TACCR0=0XFFFF; P2DIR =0X00; / 输入设置 P2DIR |= BIT0; P2OUT &= BIT0; P4DIR =0XFF; LcdReset(); Init_Keypad(); DispNChar(0,0,
25、22,Init); while(1) restart: while(Ir_Pin); /等待红外信号 temp=Ir_Get_Low(); if(temp9500) continue; /引导脉冲低电平9000 temp=Ir_Get_High(); if(temp5000) continue; /引导脉冲高电平4500 for(i=0;i4;i+) /4个字节 for(j=0;j8;j+) /每个字节8位 temp=Ir_Get_Low(); if(temp800) goto restart; temp=Ir_Get_High(); if(temp2000) goto restart; Ir
26、_Bufi=1; if(temp1120) Ir_Bufi|=0x80; /* 函数名称:Ir_Get_Low功 能:计算低电平持续的时间参 数:无 返回值 :TAR*/unsigned int Ir_Get_Low() TAR=0X0000; TACTL|=TASSEL1 + TACLR + ID0 +ID1 + MC0; while(!Ir_Pin & (TAR&0x8000)=0); /等待高电平到来 TACTL=0X00; return TAR; /* 函数名称:Ir_Get_High功 能:计算高电平持续的时间参 数:无 返回值 :TAR*/unsigned int Ir_Get_H
27、igh() TAR=0X0000; TACTL|=TASSEL1 + TACLR + ID0 +ID1 + MC0; while(Ir_Pin & (TAR&0x8000)=0); TACTL=0X00; return TAR; 2.红外发送程序#include msp430x16x.h#define SENDHP1SEL|=BIT2;TBCCTL4&=CCIFG#defineSENDLP1SEL&=BIT2#define SENDSTARTTBCCTL0&=CCIFG;TBCCTL0|=CCIE/*/char address;char data;uchar count = 0;/遥控所需相关
28、资源初始化void HWInit()/初始化TBTBCTL = TBSSEL_2 + TBCLR + MC_1; /TB时钟源:SMCLK 增模式TBCCR0 = 1125 - 1;TBCCR4 = 560-40;/初始化TATACTL = TASSEL_2 + MC_1; /SMCLK,增模式 TACCTL1 |= OUTMOD_7;CCR0 = 26;CCR1 = 13;/相关端口初始化 程序由P1.2口发出红外编码(已加入38K载波)/P!SEL bit2置1即发出38k的红外,清0即停止发送38k的红外P1OUT &= BIT2;P1DIR |= BIT2;/发送数据,包括地址码和数据
29、码void SendData(uchar addr,uchar dat)address = addr;/要发送的数据放入对应存储区域data = dat;SENDSTART; /开始发送/发送引导码 ,TB0中断中调用void SendLeadCode()static uchar i = 0;/计数 1.125ms个数i+;switch(i)/9ms高,4.5ms低case 1:SENDH; break;/9ms高电平case 9:SENDL; break;/4.5ms低电平case 13:SENDH; TBCCR4 = (TBR+560-401124) ? (TBR+560-40-1124)
30、 : (TBR+560-40);if(TBCCR41124) TBCCR4 = 1124;/防止TBCCR4出界i = 0; TBCCTL4|=CCIE; break;/引导码完成 560us高,准备数据default:break;/发送一位数据 ,TB0中断中调用void SendOneBit()uint tAddr = (address8)|(address)&0xff);uint tDat = (data8)|(data)&0xff);static uchar i = 0;/计数static uchar flg = 0;/位“1”可发送:位“1”需要更长时间低电平i+;if(i=16)i
31、f(tAddr&(11124) ? (TBR+560-40-1124) : (TBR+560-40);if(TBCCR41124) TBCCR4 = 1124;/防止TBCCR4出界TBCCTL4|=CCIE;else if(i=32)if(tDat&(11124) ? (TBR+560-40-1124) : (TBR+560-40);if(TBCCR41124) TBCCR4 = 1124;/防止TBCCR4出界TBCCTL4|=CCIE;else/数据发送完成TBCCTL4&=CCIE;TBCCTL0&=CCIE;i = 0;count = 0;/TB0中断 1.125ms#pragma
32、vector=TIMERB0_VECTOR_interrupt void Timer_B0 (void)count+;if(count=13)SendLeadCode();else SendOneBit();/TB1中断#pragma vector=TIMERB1_VECTOR_interrupt void Timer_B1(void)switch( TBIV )case 0x08: / TBCCR4 发送红外数据时,完成置低操作SENDL;TBCCTL4&=CCIE;/置低后,中断关闭等待这一位数据的结尾:有TBCCR0确定break;case 0x0a: / TBCCR5 break;case 0x0e: /overflow 溢出,未用break;default:break;四、总结现在,由于红外遥控器通信必须要对准接收者才能成功的建立链接,而且在发射器和接受器之间不能有障碍,另外,红外遥控通信是单向的(建立双向通信是可能的,但是价钱很高,而且易受其它光源的干扰),所以,有人提出,红外遥控要逐渐的被射频控制所代替。但是射频遥控要实现多控制需要建立一个无线网络,这样使得通信复杂化,另外现在射频控制仍不被家电企业所采用,但是红外通信问题不能忽略。学习型遥控器随着其功能的强大与自主设计的空间变大,使得其成本提高,操作的人性化趋势仍有待发展。