wrr891208 发表于 2012-8-10 10:47:29

求帮助~帮我调试MSP430做的学习型遥控器的红外发送的代码

/******************************************
                红外发送
*******************************************/

#include "msp430x14x.h"

#define uchar unsigned char
#define uintunsigned int
#define SENDHP2SEL|=BIT1;//TBCCTL4&=~CCIFG 
#define SENDLP2SEL&=~BIT1
#define SENDSTART TBCCTL0&=~CCIFG;TBCCTL0|=CCIE

/***************************************************/

char address;
char data;
uchar count = 0;

//遥控所需相关资源初始化
void HWInit()
{
      //初始化TB
      TBCTL = TBSSEL_2 + TBCLR + MC_1+TBIE;//SMCLK 增模式
      TBCCTL0=CCIE;
      TBCCTL4=CCIE;
      TBCCR0 = 1125 - 1;
      TBCCR4 = 560-40;
      //初始化TA
      TACTL = TASSEL_2 + MC_1+TAIE;    //SMCLK增模式 中断允许
      TBCCTL1=CCIE;
      TACCTL1 |= OUTMOD_7; //PWM复位/置位
      CCR0 = 26;    //周期
      CCR1 = 13;    //占空值
      //相关端口初始化 程序由P2.1口发出红外编码(已加入38K载波)
      //P2SEL bit1置1即发出38k的红外清0即停止发送38k的红外
      P2OUT &=~ BIT1;
      P2DIR |= BIT1;
      _EINT();
      

}

//发送数据包括地址码和数据码

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-40>1124) ? (TBR+560-40-1124) : (TBR+560-40);
          if(TBCCR4>1124) TBCCR4 = 1124;//防止TBCCR4出界
          i = 0;
          TBCCTL4|=CCIE;
          break; //引导码完成 560us高准备数据
      default:break;
      }

}

//发送一位数据 ,TB0中断中调用

void SendOneBit()

{
      uint tAddr = (address<<8)|((~address)&0xff);
      uint tDat = (data<<8)|((~data)&0xff);
      static uchar i = 0;      //计数
      static uchar flg = 0; //位―1‖可发送位―1‖需要更长时间低电平 
      i++;
      if(i<=16)
      {
            if((tAddr&(1<<(16-i))) && flg==0) //"1"第一次
            {
                flg = 1;
                i--;
            }
            else
            {
                flg = 0;
                SENDH;
                TBCCR4 = (TBR+560-40>1124) ? (TBR+560-40-1124) : (TBR+560-40);
                if(TBCCR4>1124) TBCCR4 = 1124; //防止TBCCR4出界
                TBCCTL4|=CCIE;
            }
      }
      else if(i<=32)
      {
          if((tDat&(1<<(16+16-i))) && flg==0) //"1"第一次
          {
            flg = 1;
            i--;
          }
          else
          {
            flg = 0;
            SENDH;
            TBCCR4 = (TBR+560-40>1124) ? (TBR+560-40-1124) :(TBR+560-40);
            if(TBCCR4>1124) TBCCR4 = 1124; //防止TBCCR4出界
            TBCCTL4|=CCIE;
          }
      }
      else         //数据发送完成
      {
          TBCCTL4&=~CCIE;
          TBCCTL0&=~CCIE;
          i = 0;
          count = 0;
      }
}



//TB0中断 1.125ms

#pragma vector=TIMERB0_VECTOR

__interrupt void Timer_B0 (void)

{
       count++;

      if(count<=13)SendLeadCode;
      else SendOneBit();

}



//TB1中断

#pragma vector=TIMERB1_VECTOR
__interrupt void Timer_B1(void)
{
      switch( TBIV )
      {
            case0x08:   // TBCCR4 发送红外数据时完成置低操作
            SENDL;
            TBCCTL4&=~CCIE;//置低后中断关闭等待这一位数据结尾有TBCCR0确定
            break;
      case0x0a:                   // TBCCR5
      break;
      case0x0e:                        //overflow 溢出未用
      break;

      default: break;
      }

}


void main(void)
{
   
    WDTCTL = WDTPW + WDTHOLD;       // 关闭看门狗
   
    HWInit();
    while(1);
   
}   
      
                  

512826028 发表于 2012-8-11 19:05:25

我也想知道。嘿嘿。帮你顶一下。

Fulai 发表于 2012-8-16 23:29:44

进中断退出之前,中断标记要清掉
页: [1]
查看完整版本: 求帮助~帮我调试MSP430做的学习型遥控器的红外发送的代码