基于MSP430F149为主芯片下的红外线解码资料源程序
基于MSP430F149为主芯片下的红外线解码资料源程序.zip
(37.8 KB, 下载次数: 7)
2015-3-10 17:03 上传
点击文件名下载附件
- //******************************************************************************
- // MSP430P149 Demo - InfraredRX, Ultra-Low Pwr UART 9600 Echo ISR, 32kHz ACLK
- //
- // Description: Echo a received character, RX ISR used. Normal mode is LPM3,
- // USART1 RX interrupt triggers TX Echo.
- // ACLK = UCLK1 = LFXT1 = 32768, MCLK = SMCLK = DCO~ 800k
- // Baud rate divider with 32768hz XTAL [url=home.php?mod=space&uid=681799]@9600[/url] = 32768Hz/9600 = 3.41 (0003h 4Ah )
- // //* An external watch crystal is required on XIN XOUT for ACLK *//
- //
- //
- // MSP430F149
- // -----------------
- // /|| XIN|-
- // | | | 32kHz
- // --|RST XOUT|-
- // | |
- // | |
- // | P2.7 |<----INR_RXD
- // | |
- //
- // Copyright (c) 2009.04 WH, All Rights Reserved.
- // WebSite:www.smart-dz.cn
- // Description : The InfraredRX module
- // History :
- // [Author] [Date] [Version] [Description]
- // [1] dragonhzw 2009/04/09 Ver 1.0.0 Initial file.
- //
- // Built with IAR Assembler for MSP430V3.20A/W32 (3.20.1.9)
- //******************************************************************************
- #include <msp430x14x.h>
- #include "InfraredRX.h"
- //-------------------------------------------------------------------------------
- unsigned char dis_code[18] = {0x3f,0x06,0x5b,0x4f,0x66, //段码表
- // 0 1 2 3 4 对应内容
- 0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,0x5e,0x79,0x71,0xff};
- // 5 6 7 8 9 A B C D E F
- unsigned char dis_0 = 0; // 个位值
- unsigned char dis_1 = 0; // 十位值
- unsigned char dis_2 = 0; // 百位值
- unsigned char dis_3 = 0; // 千位值
-
- unsigned char IR_State=IR_Idle;//接收状态变量,初值为空闲
- unsigned char IR_Ready=0;//数据接收完标志
- unsigned char IR_Repeat=0;//连发标志
- unsigned char IR_Data[4]={0,0,0,0};//接收到的4字节数据
- unsigned char Tmp;
- unsigned char IRtimer=0;
- //--------------------------------------------------------------------------------
- /***FUNC+*********************************************************************/
- /* Name : Port2INT */
- /* Descrp : 端口1中断处理程序 */
- /* Input : num. */
- /* Output : None. */
- /* Return : None. */
- /***FUNC-*********************************************************************/
- #pragma vector=PORT2_VECTOR
- __interrupt void Port2INT(void)
- {
- unsigned int Count;
- //红外线接收头中断
- if(P2IFG&BIT7)
- {
- Count= TAR;//读取计数值
- TACTL|=MC0+TACLR;//定时器B重新开始计数
- switch(IR_State)
- {
- case IR_Idle:
- {
- IR_State = IR_WaitStart;
- IRtimer = 11;
- break;
- }
- case IR_WaitStart:
- {
- if((Count>ms_125)&&(Count<ms_15))
- {
- //接收到引导码
- IR_Data[0]=0;
- IR_Data[1]=0;
- IR_Data[2]=0;
- IR_Data[3]=0;
- Tmp=1;
- IR_Repeat=0;
- IR_State=IR_GetAddress;
- }
- else if((Count>ms_9)&&(Count<ms_125))
- {//接收连发代码
- IR_Repeat=1;
- IR_State=IR_Idle;
- }
- else
- {
- IR_State=IR_Idle;
- }
- break;
- }
- case IR_GetAddress:
- {
- if(Count>ms_168)
- {//接收到1
- IR_Data[0]|=Tmp;
- }
- Tmp<<=1;
- if(!Tmp)
- {
- IR_State=IR_GetAddressInv;
- Tmp=1;
- }
- break;
- }
- case IR_GetAddressInv:
- {
- if(Count>ms_168)
- {//接收到1
- IR_Data[1]|=Tmp;
- }
- Tmp<<=1;
- if(!Tmp)
- {
- IR_State=IR_GetData;
- Tmp=1;
- }
- break;
- }
- case IR_GetData:
- {
- if(Count>ms_168)
- {//接收到1
- IR_Data[2]|=Tmp;
- }
- Tmp<<=1;
- if(!Tmp)
- {
- IR_State=IR_GetDataInv;
- Tmp=1;
- }
- break;
- }
- case IR_GetDataInv:
- {
- if(Count>ms_168)
- {//接收到1
- IR_Data[3]|=Tmp;
- }
- Tmp<<=1;
- if(!Tmp)
- {
- if(((IR_Data[0]^IR_Data[1])==0xFF)&&((IR_Data[2]^IR_Data[3])==0xFF))
- IR_Ready=1;//校验数据
- IR_State=IR_Idle;
- }
- break;
- }
- default:
- {
- IR_State=IR_Idle;
- break;
- }
- }
- }
- P2IFG=0x00;//清除中断标志位
- }
- /***FUNC+*********************************************************************/
- /* Name : InitTimerA */
- /* Descrp : 定时器A初始化 */
- /* Input : num. */
- /* Output : None. */
- /* Return : None. */
- /***FUNC-*********************************************************************/
- void InitTimerA(void)
- {
- TACTL=TASSEL1+ID1+ID0+MC0+TACLR;//选择1/8SMCLK 增计数 清除TAR
- TACCR0=65535;//时间间隔10ms
- }
- /***FUNC+*********************************************************************/
- /* Name : InitTimerB */
- /* Descrp : 定时器B初始化 */
- /* Input : num. */
- /* Output : None. */
- /* Return : None. */
- /***FUNC-*********************************************************************/
- void InitTimerB(void)
- {
- TBCTL=TBSSEL1+ID1+ID0+MC0+TBCLR;//选择1/8SMCLK 增计数 清除TBR
- TBCCTL0=CCIE;//CCR0中断允许 比较模式
- TBCCR0=10000;//时间间隔10ms
- }
- /***FUNC+*********************************************************************/
- /* Name : TimerBINT */
- /* Descrp : 定时器B中断 */
- /* Input : num. */
- /* Output : None. */
- /* Return : None. */
- /***FUNC-*********************************************************************/
- #pragma vector=TIMERB0_VECTOR
- __interrupt void TimerBINT(void)
- {
- if(IRtimer)
- {
- IRtimer--;
- }
- else
- {
- IR_State = IR_Idle;//解码超时
- }
- }
- /***FUNC+*********************************************************************/
- /* Name : Init_CLK */
- /* Descrp : Set PLL Clock. */
- /* Input : None. */
- /* Output : None. */
- /* Return : None. */
- /***FUNC-*********************************************************************/
- void Init_CLK(void)
- {
- int index;
- BCSCTL1&=~0X00; //打开XT2振荡器
- do
- {
- IFG1 &= ~OFIFG; // 清除振荡器失效标志
- for (index = 0xFF; index > 0; index--)// 延时,等待XT2起振
- {
- ;
- }
- } while ((IFG1 & OFIFG) != 0);// 判断XT2是否起振
-
- BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2
- }
- /******* 红外遥控器键值表 ******
- 45 46 47
- 44 40 43
- 07 15 09
- 16 19 0d
- 0c 18 5e
- 08 1c 5a
- 42 52 4a
- **********************************/
- /***FUNC+*********************************************************************/
- /* Name : main */
- /* Descrp : 主程序 */
- /* Input : num. */
- /* Output : None. */
- /* Return : None. */
- /***FUNC-*********************************************************************/
- void main( void )
- {
- WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
- Init_CLK();//时钟初始化
- //Init_UART1();
- InitTimerA();//定时器A初始化
- InitTimerB();//定时器B初始化
- /****************************************************************************/
- /* 1、初始化数码管引脚 */
- /****************************************************************************/
- // 将P4设置为I/O口
- P4SEL = 0x00;
- // 将P4设置为输出方向
- P4DIR = 0xFF;
- // 将P4口输出全高
- P4OUT = 0xFF;
- // 将P3设置为I/O口
- P3SEL = 0x00;
- // 将P3设置为输出方向
- P3DIR |= 0x0F;
- P3OUT = 0x0F;
- /****************************************************************************/
- /* 2、初始化红外线接收引脚 */
- /****************************************************************************/
-
- P2DIR&=~BIT7;//P2.7设置为输入方向
-
- P2IES|=BIT7;//P2.7下降沿触发中断
- P2IE|=BIT7;//P2.7中断允许
- _EINT();//打开中断
-
- while(1)
- {
- if(IR_Ready==1)
- { //计算要显示的每位数字
- while(1)
- { //计算要显示的每位数字
- IR_Ready=0;
-
- dis_0 = (IR_Data[2]&0xF0)>>4;//数码管后2位显示数据
- P4OUT = dis_code[dis_0];
- P3OUT &= ~BIT1; // 开第一个显示(P2.2口控制个位数码管)
- delay_ms(5);
- P3OUT |= BIT1; // 关第一个显示(P2.2口控制个位数码管)
-
- dis_1 = (IR_Data[2]&0x0F);
- P4OUT = dis_code[dis_1];
- P3OUT &= ~BIT2; // 开第一个显示(P2.2口控制个位数码管)
- delay_ms(5);
- P3OUT |= BIT2; // 关第一个显示(P2.2口控制个位数码管)
-
- P4OUT =0x76;//'H'
- P3OUT &= ~BIT3; // 开第一个显示(P2.2口控制个位数码管)
- delay_ms(5);
- P3OUT |= BIT3; // 关第一个显示(P2.2口控制个位数码管)
- }
- }
- }
- }
- /***FUNC+*********************************************************************/
- /* Name : delay_ms */
- /* Descrp : delay time */
- /* Input : num. */
- /* Output : None. */
- /* Return : None. */
- /***FUNC-*********************************************************************/
- void delay_ms(unsigned long ms) // 延时毫秒@12M,ms最大值255
- {
- unsigned char i;
- while(ms--)
- for(i = 0; i < 124; i++);
- }
复制代码
一周热门 更多>