|
/******************************************
红外发送
*******************************************/
#include "msp430x14x.h"
#define uchar unsigned char
#define uint unsigned int
#define SENDH P2SEL|=BIT1;//TBCCTL4&=~CCIFG
#define SENDL P2SEL&=~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 )
{
case 0x08: // TBCCR4 发送红外数据时完成置低操作
SENDL;
TBCCTL4&=~CCIE; //置低后中断关闭等待这一位数据结尾有TBCCR0确定
break;
case 0x0a: // TBCCR5
break;
case 0x0e: //overflow 溢出未用
break;
default: break;
}
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
HWInit();
while(1);
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|