基于MSP430F149为主芯片下的红外线解码资料源程序
基于MSP430F149为主芯片下的红外线解码资料源程序.zip
(37.8 KB)
//******************************************************************************
// 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++);
}
|