关于CC253 硬件模式输出 IR PWM的问题

2019-07-25 14:28发布

请各位帮忙看看 我的程序如下:
#include"bool_ir.h"

/*******************************************
定时器1装载比较寄存器以及 定时器3操作
*******************************************/

#define T1_0_set(dat)     T1CC0L = dat; T1CC0H = dat >> 8   //通道0
#define T1_4_set(dat)     T1CC4L = dat; T1CC4H = dat >> 8   //通道4

#define T3_start()  T3CTL |= 0x10    //启动定时器3
#define T3_stop()   T3CTL &= ~0x10   //停止定时器3

uchar flag = 1;

/********************************
系统32M晶振初始化
*********************************/
void init_sck(void)
{
  CLKCONCMD &= ~0X7f;      //系统时钟源是32MHZ    hig clock
  while(CLKCONSTA & 0x40); //等待时钟稳定     
  

}


/**************************************************************************
**********************                                 ********************
                   以下部分用于红外信号PWM发射配置
**********************                                 ********************
***************************************************************************/



/**********************************
配置IR输出IO引脚  IR输出引脚 P0.6
***********************************/
void init_IR_io (void)
{
  P0SEL |= 0x40;      //P0.6 选择为外设
  P0DIR |= 0x40;      //P0.6 选择为输出
  
  
  P0_6 = 0;         
}


/*************************************
定时器1的配置初始化
**************************************/
void init_T1_timer(void)
{
  T1IE = 0;              //关闭定时器1中断
  
  T1CTL = 0x02 ;         //定时器1设定在 摸模式
  T1CCTL0 = 0x04 ;       //定时器1通道0设定在比较值清除
  T1CCTL4 = 0x74 ;       //定时器1通道4设定在110 关闭中断  在T1CC0输出 T1CC4清楚
}

/**************************************
定时器3的配置初始化
**************************************/
void init_T3_timer(void)
{
  T3IE = 0;               //关闭定时器3中断
  T3CTL = 0x46;           //定时器3设四分频,莫模式
  T3CCTL0 = 0x04;
  T3CCTL1 = 0x24;         //定时器3开通道1 设定在101 同定时器1
  
  T3CC0 = 211;            //38K载波3分之1占空比
  T3CC1 = 70;
}


/*****************************************
睡眠定时器的配置
*****************************************/

void init_SLEEP_timer(void)
{
  ST2 = 0x00;
  ST1 = 0x00;
  ST0 = 0x00;
  
  EA = 1;        //开中断
  STIE = 1;      //睡眠定时器中断使能
  STIF = 0;       //中断状态置0
}



/***************************************
设置睡眠定时器时间,用来控制周期  1*大约30uS
***************************************/
void set_ST_period(uint sec)
{
  
  ulong sleeptime = 0;  //睡眠时间
  
  sleeptime |= ST0;                     //读初始值
  sleeptime |= (ulong) ST1 << 8;
  sleeptime |= (ulong) ST2 << 16;
  
  sleeptime += sec;   //睡眠时间
  
  ST2 = (uchar)(sleeptime >> 16);        //赋值睡眠时间
  ST1 = (uchar)(sleeptime >> 8);
  ST0 = (uchar) sleeptime;
}

/*********************************************
以NEC协议格式发送
包括9MS高电平+4.5MS低电平引导码
以及发送 双字节数据
*********************************************/
void send_IR_data()         //传输数据的类型可能需要改改
{
  
  IRCTL = 0x01;        //将定时器3和定时器1连接起来 定时器3的方波用作定时器1的脉冲
  T3_start();          //启动定时器3

  // 发送9MS 的高电平+ 4.5MS 的低电平 引导码
  
  T1_0_set(513);       //9+4.5 MS
  T1_4_set(342);       //9 MS
  set_ST_period(486);  //睡眠时间14.7MS
  while( flag);      //定时时间到                           
  flag = 1;                 //清除
  
  T3_stop();   //停止定时器3
}




void main(void)
{
  init_sck();
  init_IR_io();
  init_T1_timer();
  init_T3_timer();
  init_SLEEP_timer();
  
  P2DIR = 0x01;
  P2_0 = 0;
  
  while(1)
  {
    send_IR_data();
  }
}




#pragma vector =  ST_VECTOR
__interrupt void ST_ISR(void)
{
   STIF = 0;
   
   flag = 0;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
m503022388
2019-07-27 07:21
天凡云赐 发表于 2015-10-12 18:04
你用的是P1.1引脚~ 我这边是公司已经做好的硬件~使用的是P0.6 定时器3和4的比较输出我都用不上~很难受啊~ ...

上面那个是用定时器1通道4输出的,可以做到T1输出载波。占空比是50%频率38Khz,T1CCTL4.CMP的三个位是101。不过吐槽下。。。定时器1这么高级的家伙只用来输出载波有点浪费的感觉。。。

一周热门 更多>