typedef unsigned char uchar;
typedef unsigned int uint;
uint a=0;
void produce_strcode();
void produce_pwm(unsigned char c);
void IO_Init(void) ;
uchar val,i;
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/8000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/8000.0))
/****************************************************************************/
// 产生PWM波,发送9ms高电平,4.5ms低电平作为 起始码
//*****************************************************************************
void produce_strcode()
{
TACTL |=TACLR; //ACLK,不分频,清TAR
TACTL |=TASSEL_1;
CCR0=442; //PWM周期,13.5ms
CCTL1=OUTMOD_7; //模式7 复位/置位
CCR1=295; // 先输出一个9ms高电平,4.5ms低电平作为 起始码
TACTL |= MC_1; //启动定时器A 为增计数模式
while((TACTL & 0x01) == 0); //等待溢出标志,进入下一个周期
TACTL &= ~TAIFG; //清标志
}
/********************************************************************************
// 产生PWM波8个用户码,8个用户反码,8个的数据码,之后是8个数据码的反码
//其中以0.56ms高电平,1.125ms周期表示“0”,中以0.56ms高电平,2.25ms周期表示“1”
//
***************************************************************************/
void produce_pwm(unsigned char c)
{
TACTL |=TACLR; //ACLK,不分频,清TAR
TACTL |=TASSEL_1;
CCTL1=OUTMOD_7; //模式7 复位/置位
TACTL |= MC_1; //启动定时器A 为增计数模式
for (i=0;i<8;i++) //发送8位数据码
{
if (c&0x01)
val=1;
else val=0;
while((TACTL & 0x01) == 0); //等待溢出标志,进入下一个周期
if (val)
{ CCR0=74; //PWM周期,2.25ms
CCR1=18; } //0.56ms的高电平 占空比1/4 “1”的编码
else
{ CCR0=37; //PWM周期,1.125ms
CCR1=18; } //0.56ms的高电平 占空比 1/2 “0”的编码
c>>=1;
TACTL &= ~TAIFG; //清中断标志
}
for (i=0;i<8;i++) //发送8位数据反码
{
if (c&0x01) //检测第i位数据反码
val=0;
else val=1;
while((TACTL & 0x01) == 0); //等待溢出标志,进入下一个周期
if (val)
{ CCR0=74; //PWM周期,2.25ms
CCR1=18; } //0.56ms的高电平 占空比1/4 “1”的编码
else
{ CCR0=37; //PWM周期,1.125ms
CCR1=18; } //0.56ms的高电平 占空比 1/2 “0”的编码
c>>=1;
TACTL &= ~TAIFG; //清中断标志
}
}
//****************************************************************************
//PWM 初始化IO P1高四位按键中断响应
void IO_Init(void)
{
P1DIR |= 0x04;
P1SEL |= 0x04; //P1.2输出PWM,TA1
}
//***********************************************************************
//主函数系统时钟初始,PWM的IO口初始化,
//*****************************************************************************
void main(void)
{ WDTCTL=WDTPW+WDTHOLD; //关看门狗
DCOCTL=CALDCO_8MHZ;
BCSCTL1=CALBC1_8MHZ;
IO_Init();//PWM波的IO口初始
while(1)
{
produce_strcode(); // 发送pwm波,
produce_pwm(a);
produce_pwm(0x18);
while((TACTL & 0x01)==0);
TACTL= TACLR; //数据码发送完,关timer_A
P1OUT|=BIT2;
delay_ms(30000);
}
} |