msp430大作业_第1页
msp430大作业_第2页
msp430大作业_第3页
msp430大作业_第4页
msp430大作业_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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) : (tbr+560-40);if(tbccr41124) tbccr4 = 1124;/防止tbccr4出界i = 0; tbcctl4|=ccie; break;/引导码完成 560us高,准备数据default:break;/发送一位数据 ,tb0中断中调用void sendonebit()uint taddr = (address8)|(address)&0xff);u

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论