⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timerb1pluse.c

📁 利用430做的一个产生时钟脉冲的程序
💻 C
字号:
//方法:利用定时器产生方波脉冲;考虑使用中断法

#include<msp430x14x.h>

/*====================================================================
*                        数据类型定义部分
====================================================================*/
#define  uint32  unsigned long
#define  ulong   unsigned long
#define  uint16  unsigned int
#define  uint    unsigned int
#define  uchar   unsigned char
#define  uint8   unsigned char

/*====================================================================
*                        数据端口定义部分
====================================================================*/
#define   CLOCK_DIR   P4DIR
#define   CLOCK_SEL   P4SEL
#define   CLOCK_OUT   P4OUT
#define   CLOCK_IN    P4IN

#define   PWMCLOSE    0
#define   PWMOPEN     1
 
/*****************在这个地方我犯了两次错误*************************************/
uint g_Pluse_Div = 1;                  //除数因子为1
uint  g_TimerB_cycle = 500;            //设置时钟脉冲周期(默认周期为1MS)
/*====================================================================
*                         函数声明部分
====================================================================*/
void  Set_TimerB(  uint cycle );
void  InitSys( void );                                //系统初始化函数
void  Timer_pluse( uint pluse_Div, uchar channel );
void  SET_PWM_module(  uint16  PWM_value, uint8 channel);
uchar GoPwm( uchar doPwm );

void Delay_n_Us( uint us );
void Delay_n_Ms( uint ms );

void main(void)
{ 
  InitSys( );
  
  P4DIR |=  BIT5;
  //可以把下面3个函数做成一个函数来 
  Set_TimerB( 1000 );    
  Timer_pluse(4,BIT2|BIT3|BIT4);
  //SET_PWM_module( 250,BIT1 ); 
  
  while(1);
  
}

/*====================================================================
*                         定时器B参数设置函数
====================================================================*/

void Set_TimerB( uint cycle )
{
  TBCTL = TBSSEL1 + TBCLR + TBIE ;            //Select MCLK And Clear TAR And Enable TBIE Interrupt
  g_TimerB_cycle = cycle;
  TBCCR0 = g_TimerB_cycle;                       //设置频率周期
  TBCTL |=  MC0;                        //4分频 增模式  ID1 +
}

/*====================================================================
*                         脉冲设置函数
====================================================================*/
void Timer_pluse( uint pluse_Div, uchar channel )
{
  channel&=0x7e;
  g_Pluse_Div = pluse_Div;
  if(channel&0x02)
  {
    TBCCTL1 = OUTMOD_4 + CCIE ;
    TBCCR1 = 0;
  }
  if(channel&0x04)
  {
    TBCCTL2 = OUTMOD_4 + CCIE;
    TBCCR2 = 0; 
  }
  if(channel&0x08)
  {
    TBCCTL3 = OUTMOD_4 + CCIE;
    TBCCR3 = 0;
  }
  if(channel&0x10)
  {
    TBCCTL4 = OUTMOD_4 + CCIE;
    TBCCR4 = 0;
  }
  if(channel&0x20)
  {
    TBCCTL5 = OUTMOD_4 + CCIE;
    TBCCR5 = 0;
  }
  if(channel&0x40)
  {
    TBCCTL6 = OUTMOD_4 + CCIE;
    TBCCR6 = 0;
  }
  CLOCK_SEL |= channel;
  CLOCK_DIR |= channel;                         //选择输出通道  
}

/*====================================================================
*                        定时器B中断输出脉冲函数
====================================================================*/
interrupt [ TIMERB1_VECTOR ] void TimerBCCR_ISR( void )
{
  static uchar out_Fg = 0;
  _NOP( );
  switch( TBIV )
  {
    case 0x02:
    {
      TBCCR1 += g_Pluse_Div;
    }
    case 0x04:
    {
      TBCCR2 += 2;
      if( out_Fg == 0 )
      {   
         out_Fg = 1;
         CLOCK_OUT &= ~BIT5;
      }
      else
      {
         out_Fg = 0;
         CLOCK_OUT |= BIT5;
      }
      
    }
    case 0x06:
    {
      TBCCR3 += 8;
    }
    case 0x08:
    {
      TBCCR4 += 4;
    }
    case 0x0B:
    {
      TBCCR5 += g_Pluse_Div;
    }
    case 0x0c:
    {
      TBCCR6 += g_Pluse_Div;
    }
    case 0x0E:
    {
      _NOP( );
    }
    default:
    {
      _NOP( );
      break;
    }
  }
}

/*====================================================================
*                        系统初始化函数
====================================================================*/
void InitSys( void )
{
  uint iq0;
  
  WDTCTL = WDTPW + WDTHOLD;              //关闭看门狗 
  BCSCTL1 &= ~XT2OFF;                     //打开XT2振荡器
  do
  {
    IFG1 &= ~OFIFG;                       // 清除振荡器失效标志
    for( iq0 = 0xFF; iq0 > 0; iq0-- );
  }
  while((IFG1 & OFIFG) != 0 );
  
  BCSCTL2 =SELM_2+SELS;				//选择MCLK、SMCLK为XT2
  //Init_TimerB( );
  _EINT();			                        //打开全局中断控制
}

/***********************************************
** 函数名称: uchar GoPwm( uchar doPwm )
** 功能描述: 控制PWM和PLUSE的运行或者停止
** 晶  振:   4MHz
** 输 入:   doPwm:PWMCLOSE:PWM And PLUSE停止, PWMOPEN :PWM And PLUSE运行
** 输 出:   运行状态
** 调用示例: uchar GoPwm( uchar doPwm );
************************************************/
uchar GoPwm( uchar doPwm )
{
  TBCTL &= ~(MC0+MC1);         //关闭定时器,也就是关闭PWM输出
  if( doPwm == PWMOPEN )
  {
    TBCTL |= MC0;              //打开定时器,也就是打开PWM输出  
  }
  
  if(( TBCTL&MC_0 ) == 0)
     return PWMCLOSE;
  else
    return PWMOPEN;
}


/*********************************************************************************************************
** 函数名称: void  PWM_module(uint16  cycle,uint8 channel)
** 功能描述: 启动PWM,设置周期cycle,初始PWM为0,选择通道channel,确定管脚;
** 晶  振:   4MHz
** 输 入:   cycle  需要设置的周期

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -