MSP430F5529红外接收机&红外遥控器解码-使用教程

这款TI的单片机大家都很熟悉了,所以我也就不在多多赘述,直接上代码好了,IO使用常用的P1.0口。使用P1.0口的原因是P1 P2口 有IO中断模块。

思路:红外接收头发出的脉冲信号激发IO中断,然后MSP430单片机计数解码,从而得出遥控指令。

 

声明:代码由一位姓刘的大神用C51移植而来,从此摘录者,定要铭记在心。

代码部分:

#hongwai.h
/*
 * hongwai.h
 *
 *  Created on: 2014-12-12
 *      Author: dell
 */

#ifndef HONGWAI_H_
#define HONGWAI_H_

#define   HONGWAI_BIT      BIT0//红外接收头接于P1.0
#define   HONGWAI_DIR_IN   P1DIR&=~HONGWAI_BIT//设置p1.0为输入
#define   HONGWAI_IES_ON   P1IES|=HONGWAI_BIT//p1.0设置为低电平中断   红外引脚定义
#define   HONGWAI_IE_ON    P1IE|=HONGWAI_BIT//允许pl.0中断
#define   HONGWAI_IE_OFF   P1IE&=~HONGWAI_BIT//禁止p1.0中断
#define   HONGWAI_IFG      P1IFG//p1.0中断标志
#define   HONGWAI_IFG_OFF  P1IFG&=~HONGWAI_BIT
#define   HONGWAI_IN       (P1IN & BIT0) //P1.0输入

#define   uchar  unsigned char
#define   uint   unsigned int

static uint DISPLAY=0;
void int_clk();//时钟初始化子程序声明
void int_io();//制口的初始化
unsigned int return_waiwai();
void RebootDat();
void show();

#endif /* HONGWAI_H_ */

#hongwai.c
/*
 * hongwai.c
 *
 *  Created on: 2014-12-12
 *      Author: dell
 */

#include 
#include "hongwai.h"
#include"LCD12864.h"
#define   uchar  unsigned char
#define   uint   unsigned int
//时钟初始化子程序
 uint  dat[4];
#define XT1_XT2_PORT_DIR            P5DIR
#define XT1_XT2_PORT_OUT            P5OUT
#define XT1_XT2_PORT_SEL            P5SEL
#define XT1_ENABLE                  (BIT4 + BIT5)
#define XT2_ENABLE                  (BIT2 + BIT3)



void int_clk()
{

	  XT1_XT2_PORT_SEL |= XT1_ENABLE + XT2_ENABLE;

	UCSCTL6 |= (XT1OFF+XT2OFF);					//关闭XT1和XT2

	UCSCTL3 |= SELREF_2;   						//FLL基准源选择REFOCLK(32.768KHz)
	UCSCTL4 |= SELA_2;                        	//设置ACLK时钟为REFOCLK(32.768KHz)

	__bis_SR_register(SCG0);                 	//失能FLL循环控制器
	UCSCTL0 = 0x0000;                         	//设置DCO频率的大致范围为最低,开启FLL,DCO和MOD可以自动修改
	UCSCTL1 = DCORSEL_5;                      	//选择DCO工作频率范围24MHz
	UCSCTL2 = FLLD_1 + 374;                   	//设置DCO乘数位,使DCOCLKDIV达到12MHz,(N + 1) * FLLRef = Fdco
	                                            // (374 + 1) * 32768 = 12MHz
	                                            // 设置锁相环2分频,因此DCOCLK=24MHz,DCOCLKDIV=12MHz
	__bic_SR_register(SCG0);                  	// 使能FLL循环控制器

	// 32 x 32 x 12 MHz / 32,768 Hz = 375000 = MCLK cycles for DCO to settle
	__delay_cycles(375000);

												// 循环等待XT1,XT2和DCO的错误标志被清除
	do
	{
		UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
	                                            // 清除XT2,XT1,DCO 的错误标志
	    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
	}while (SFRIFG1&OFIFG);
}

//#############################
void int_io()
{

P1SEL&=~BIT0;
P1OUT|=BIT0;
P1REN|=BIT0;
//  HONGWAI_DIR_IN;//设置接红外引脚的IO为输入

  HONGWAI_IE_ON;//允许红外引脚中断
  HONGWAI_IES_ON;//设置红外引脚IO为下降沿中断
  HONGWAI_IFG_OFF;

}



void delay_us(uint i)//delay 2.5us at 8M
{
   uint ii;
   for(ii =i;ii > 0;ii--)
   {
      _NOP();_NOP();_NOP();_NOP();
      _NOP();_NOP();_NOP();_NOP();

   }
}
void disp()
{
	 uint  i,j,k=0;//,d;//,temp;


	  if((HONGWAI_IN)==0){
	       for (i=0;i<14;i++)
	       {
	        if(HONGWAI_IN)
	        {return;}
	       }
	      while(!(HONGWAI_IN));

	     for(i=0;i<4;i++)
	     {
	      for(j=0;j<8;j++)
	      {
	       while (HONGWAI_IN );       //等 IR 变为低电平

	       while (!(HONGWAI_IN) );     //等 IR 变为高电平
	       {delay_us(28);}
	       while (HONGWAI_IN)       //计算IR高电平时长
	       {
	             delay_us(100);
	             k++;
	             if (k>=30){return;}
	       }
	         dat[i]=dat[i] >> 1;
	       if (k>=8) {dat[i] = dat[i]|0x80;}
	        k=0;
	       }
	    }


	   }
}
void RebootDat()
{
	dat[2]=0;
	}
unsigned int return_waiwai()
{
	return dat[2];
	}
void show(void)
{char dis[2];
dis[0]=(dat[2]/10)+0x30;
dis[1]=(dat[2]%10)+0x30;
 display_string_5x8(1,5,dis);
/*	switch(dat[2])
	{
	case 70: {dis[0]=(dat[2]/10)+0x30;dis[1]=(dat[2]%10)+0x30;
				display_string_5x8(1,5,dis);dat[2]=0;break;}
	case 68: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;}
	case 67: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;}
	case 21: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;}
	case 64: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;}
	case 22: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;}
	case 25: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;}
	case 13: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;}
	case 12: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;}
	case 24: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;}
	case 94: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;}
	case 8: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;}
	case 28: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;}
	case 66: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;}
	case 82: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;}
	case 74: {display_string_5x8(1,5,70+0x30);dat[2]=0;break;}
	default:break;


	}*/
}
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{  disp();
	P1IFG=0;
}

728da9773912b31b8b8d31958318367adbb4e1ad

分享到:更多 ()