#mspfPWM红外解码(C语言)_第1页
#mspfPWM红外解码(C语言)_第2页
#mspfPWM红外解码(C语言)_第3页
#mspfPWM红外解码(C语言)_第4页
#mspfPWM红外解码(C语言)_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、基于 msp430f149的PWM 红外解码的研究摘要: 因为红外遥控的实用与经济性,本文研究 PWM 方式调制的红外解码的实现。 红外线遥控是目前使用最广泛的一种通信和遥控手段。因为红外线遥控装置具有体积小、功耗低、 功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型 电器装置上也纷纷采用红外线遥控。工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线 遥控不仅完全可靠而且能有效地隔离电气干扰。1红外遥控系统通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如下所示:一)发射部分 键盘矩阵、编码调制、 LE

2、D 红外发送器2 遥控发射器及其编码1)遥控发射器专用芯片很多2)根据编码格式可以分成:脉冲宽度调制和脉冲相位调制两大类 现在我们研究以运用比较广泛,解码比较容易实现的脉冲宽度调制来加以说明。当发射器按键按下 后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征:( a) 采用脉宽调制的串行码( b ) 以脉宽为 0.565ms、间隔 0.56ms、周期为 1.125ms的组合表示二进制的 “0”( c) 以脉宽为 0.565ms、间隔 1.685ms、周期为 2.25ms的组合表示二进制的 “1”遥控器发出由 “0”和“1”组成的 32位二进制码,经 38kHz 的载频进行

3、二次调制以提高发射效率,达到降低 电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射,其中前 16位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。后16位为 8位的操作码和 8位的操作反码用于核对数据是否接收正确。解码的关键是如何识别 “0”和“1”,从位的定义我们可以发现 “0”、“1”均以 0.56ms的低电平开始,不同的 是高电平的宽度不同, “0”为0.56ms,“1为”1.68ms,所以必须根据高电平的宽度区别 “0”和 “1。”如果从 0.56ms 低电平过后,开始延时, 0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为 “1”,为了可

4、靠起见,延时必须比 0.56ms长些,但又不能超过 1.12ms,否则如果该位为 “0”,读到的已是下一位的高电平,因此 取1.12ms+0.56ms) /2=0.84ms最为可靠,一般取 0.84ms左右即可。根据红外编码的格式,程序应该等待9ms的起始码和 4.5ms的结果码完成后才能读码。/ 10接收器及解码VS0038是塑封一体化红外线接收器,它是一种集红外线接收、放大、整形于一体的集成电路,不需 要任何外接元件,就能完成从红外线接收到输出与TTL 电平信号兼容的所有工作,没有红外遥控信号时为高电平,收到红外信号时为低电平,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红

5、外线数据传输。下面是一个 msp430f149 单片机对红外线遥控器的解码程序,它可以把遥控器的32位码42 位码也可以)的红外遥控器每一个按键的键值读出来,并且通过 12864 点阵液晶显示编码和键值,在解码成功的 同时发出“嘀”的提示音。并且能把编码保存起来,如果此时按下键盘上第三个键,就把该信号再向外发 射出去,不过一次只能存一组数据,如果有兴趣可以把编码存入 flash ,这样不仅可以保存更多的编码, 而且掉电数据也不会丢。这是我测试时用的遥控器这是测试的结果,前三行是红外信号的编码,最后一行是 8 位数据码的十六进制格式,因为我的遥 控器采用的是 32 位二进制码,所以后十位是无效位

6、。如果是对42 位二进制码的遥控器解码时,前 26 位是系统码,后 16 位是 8 位数据码和 8 位数据反码。不过此时第四行的十六进制是无效哦。/ 10软件设计思想及流程 :1)程序使用到的 msp430f149单片机的 IO口主要有 P4与P6用于 12864液晶驱动) P1.3与P5.2分别用来实 现红外数据的接收和红外数据的发送)。2)程序的关键部分是红外解码,而根据红外线发出的红外信号编码的规则可以看出,二进制码“ 0和”“ 1最主要的区别在于脉冲时间的长短,所以根据判断脉冲时间便可以判断是“1还”是 “0”。其程序如下:程序已调试通过直接移值就可以用) #include #incl

7、ude config.h#define CPU_F (double8000000 /CPU 主频 8MHZ#define delay_us(x _delay_cycles(long(CPU_F*(doublex/1000000.0 #define delay_ms(x _delay_cycles(long(CPU_F*(doublex/1000.0 #define uchar unsigned char#define uint unsigned int红外接收端口定义 */#define HW_I #define HW_O #define HW_L #define HW_H#define HW

8、_QP1DIR &=BIT3 P1DIR |= BIT3 P1OUT &=BIT3 P1OUT |= BIT3 (P1IN & BIT3*12864液晶端口定义 */#define RS (1 #define RW (1 #define EC (1 #define PSB (1/ 10#defineRST(1/*红外发射端口定义 */#defineFS_HP5OUT |=BIT2#defineFS_LP5OUT&=BIT2#defineFS_IP5DIR&=BIT2#defineFS_OP5DIR |=BIT2#defineFS_FP5OUT =BIT2#defineFSIEON TACCTL

9、0|=CCIE 。 TACCTL1|=CCIE#defineFSIEOFF TACCTL0&=CCIE 。 TACCTL1&=CCIE#defineBUZ_OFF P6OUT|=BIT2#defineBUZ_ON P6OUT&=BIT2uchar flag,ff,mf,num 。int width 。 /用来设定载波信号的持续时间uchar table_IR42 。 /用来存放接收的红外信号编码uchar table_ir0=0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1 。 /音量 - uchar table_i

10、r1=0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1,0,1,0,0,0,0,1,0,1,0,1,1,1 。 /音量 + uchartable_lcd=48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70 。 /液晶显示数字对应 ASIIC void LCD_INIT(void 。 /液晶初始化函数声明void WRITE_COM(uchar com 。 /液晶写指令函数声明 void WRITE_DATA(uchar data 。 /液晶写数据函数声明 char READ_BF(void 。 /液晶忙检查函数声明 void

11、 infrared(void 。 /红外接收检测函数声明 void IR_SEND(uchar *pir 。 /红外发射函数声明 uchar key(void 。 /矩阵键盘扫描函数声明 void main(voiduint i=0 。uchar keydata。 /存放键值用WDTCTL=WDTPW+WDTHOLD 。 /关闭看门狗 BCSCTL1 &=XT2OFF 。/开启XT2 高速晶体振荡器BCSCTL2|=SELM_2+SELS 。doIFG1&=OFIFG 。for(i=0 。 i_NOP( 。while(IFG1&OFIFG 。IFG1 &=OFIFG 。Close_LED( 。

12、 /关闭数码管P5DIR|=RS+RW+EC+PSB+RST 。/ 初始化液晶相关端口P6DIR|=BIT2 。 /蜂鸣器端口设为输出模式BUZ_OFF 。 /关闭蜂鸣器HW_L 。HW_I 。 /初始化红外接收端口/ 10P1DIR=0 x0f 。P1OUT=0 x00 。 /初始化矩阵键盘端口,红外接收复用P1.3口FS_O。FS_L。 /初始化红外发射端口P2DIR=0 xff 。P2OUT=0 xff 。/初始化 LED 端口LCD_INIT( 。 /初始化液晶TACTL|=TASSEL_2+MC_1+TACLR 。/设置定时器 A 时钟源为 MCLK ,不分频,增计数模式 TACCT

13、L0|=CCIE 。 /允许比较 0中断TACCTL1|=CCIE 。 /允许比较 1中断TACCR0=210 。/26.25us中断一次,用以产生 38kHZ ,占空比为 1:3的方波TACCR1=70 。 /8.75us中断一次 /_BIS_SR(GIE 。_EINT( 。 /开启总中断/_DINT( 。 /关闭总中断for( 。 infrared( 。 / 红外接收检测P1DIR=0 x0f 。 /红外接收和矩阵键盘端口复用,所以在调用键盘扫描程序前重定义端口 P1OUT=0 x00 。keydata=key( 。 /读键值if(keydata/ 如果用按键按下,根据返回值调用发射相对的

14、编码 switch(keydatacase 1:IR_SEND(table_ir0 。 break。/如果按下 1,发射 “音量 -”case 2:IR_SEND(table_ir1 。break。/如果按下 2,发射 “音量 +”case 3:IR_SEND(table_IR 。break。 /如果按下 3,发射上次红外接收的编码值 default :break 。 /*红外发射函数 */void IR_SEND(uchar *pir uchar i 。width=383 。_EINT( 。 /开启总中断 while(width0 。 /输出 9ms的载波信号 _DINT( 。 /关闭总中断

15、FS_H。 delay_us(4500 。 /输出 4.5ms的高电平 for(i=0 。 iwidth=21 。 /21/ 10_EINT( 。 /开启总中断while(width0 。/输出 0.56ms的载波信号_DINT( 。 /关闭总中断if(*pir+FS_H 。delay_us(1685 。 /根据编码确定要输出 “0还”是 “1” else FS_H 。 delay_us(560 。 /如果是 “ 1输”出1.685ms的高电平, / 如果是 “ 0,”输出 0.56ms 的高电平width=21 。 /21_EINT( 。 /开启总中断while(width0 。/输出 0.

16、56ms的载波信号作为结束码_DINT( 。 /关闭总中断FS_L。/关闭红外发射管 P2OUT&=BIT0 。delay_ms(100 。P2OUT|=BIT0 。 /LED0 闪烁一下作为发射标志 void infrared(void红外接收函数 */uchar k 。uchar ir=0 。uchar j=0 。uchar value_L=0,value_H=0 。 /存放操作码的高四位和低四位HW_I 。 /在检测前把端口为输入for(k=0 。k delay_us(400 。 if(HW_Q return 。 / 检测是否有 9ms的低电平,否则返回重新检测 while(!HW_Q

17、。/等待 9ms低电平过去 for(k=0 。k delay_us(500 。if(!HW_Qreturn 。 /如果在 2.5ms内有低电平,则认为是干扰,并且退出重新检测 while(HW_Q 。 /等待 4.5ms高电平过去 for(k=0 。k while(!HW_Q 。 / 等待 0.565ms的低电平过去 while(HW_Q / 计算高电平的宽度,判断接收的为“ 0还”是 “ 1 ” delay_us(100 。 j+ 。 if(j22break 。 / 如果高电平时间过长,跳出循环,继续执行下面的程序/ 10if(j=7/ 如果高电平的宽度大于 0.7ms,则接收的为 1, 同

18、时存入数组table_IRk=1 。else table_IRk=0 。/如果高电平宽度小于 0.7ms,则接收的为 “ 0,”同时存入数组 j=0 。for(k=16 。k/把第 3个字节低四位存入 value_L内,便于在液晶上显示value_Lvalue_L|=0 x01 。for(k=20 。k/把第 3个字节高四位存入 value_H内,便于在液晶上显示value_Hvalue_H|=0 x01 。WRITE_COM(0 x80 。 /设置液晶第一行显示前 16位字符 。for(k=0 。kir=table_IRk 。WRITE_DATA(table_lcdir 。while(REA

19、D_BF( 。WRITE_COM(0 x90 。 /设置液晶第二行显示 8位的操作码和 8位的操作反码 while(READ_BF( 。for(k=0 。kir=table_IRk+16 。WRITE_DATA(table_lcdir 。while(READ_BF( 。WRITE_COM(0 x88 。 /如果遥控器发出的是 42位二进制码,则剩余的部分在第三行显示 while(READ_BF( 。for(k=0 。kir=table_IRk+32 。WRITE_DATA(table_lcdir 。while(READ_BF( 。WRITE_COM(0 x98 。 /第四行显示 16进制的操作

20、码/ 10while(READ_BF( 。WRITE_DATA(table_lcdvalue_L 。WRITE_DATA(table_lcdvalue_H 。HW_O 。BUZ_ON 。delay_ms(50 。BUZ_OFF 。/* 矩阵键盘检测函数,根据返回值可以判断按下的是哪个键 */ unsigned char key(voidunsigned char rank 。char row 。unsigned char temp 。unsigned char num=0 。 if(P1IN&0 xf0!=0 xf0delay_ms(15 。 if(P1IN&0 xf0!=0 xf0switc

21、h(P1IN&0 xf0/ 列检测case 0 x70:rank=0 。 break。case 0 xb0:rank=4 。 break。case 0 xd0:rank=8 。 break。case 0 xe0:rank=12 。 break。temp=0 x01 。for(row=4 。 row0 。 row-P1OUT= temp 。 if(P1IN&0 xf0!=0 xf0num=row+rank 。P1OUT=0 xf0 。return num 。temp!=0 xf0 。delay_ms(15 。while(P1IN&0 xf0!=0 xf0 。/ 10return num 。液晶初始化函数 */void LCD_INIT(voidP5OUT|=RST 。P5OUT|=PSB 。WRITE_COM(0 x30 。 while(READ_BF( 。 WRITE_COM(0 x0c 。 while(READ_BF( 。 WRITE_COM(0 x01

温馨提示

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

评论

0/150

提交评论