请各位帮忙看看 我的程序如下:
#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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
上面那个是用定时器1通道4输出的,可以做到T1输出载波。占空比是50%频率38Khz,T1CCTL4.CMP的三个位是101。不过吐槽下。。。定时器1这么高级的家伙只用来输出载波有点浪费的感觉。。。
一周热门 更多>