X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
微控制器 MCU
[经验] msp430红外解码 通过串口传送编码到PC
qinkaiabc
2014-2-21 14:35
楼主
//外部中断
//定时器增计数模式,捕获模式
//串口通信
#include <msp430x14x.h>
#define MCLK_C (4)//定义主时钟频率,供延时使用
#define Delay_ms(n) __delay_cycles(n*(1000L)*MCLK_C)
#define uint unsigned int
#define uchar unsigned char
uchar i,j;
uint index0,index1;
uint jiema[81]={0};
uchar state;//状态,0表示等待,1引导码长低,2引导码长高,3低,4高
void Iint_Port1(void); //函数声明
/*----------------------------------*/
void starttimer()
{
TACTL |= TASSEL_1+ID_1+MC_2+TACLR;//使用ACLK,增计数方式,从清除开始计数
}
void stoptimer()
{
TACTL |= MC_0;
}
void PutString(uchar *ptr)
{
while(*ptr != '\0')
{
while (!(IFG1 & UTXIFG0)); // TX缓存空闲?
TXBUF0 = *ptr++; // 发送数据
}
while (!(IFG1 & UTXIFG0));
TXBUF0 = '\n';
}
void iniUART()
{
P3SEL |= 0x30; // P3.4,5选择为UART收发端口
ME1 |= UTXE0 + URXE0; // 使能USART0收发
UCTL0 |= CHAR; // 8-bit character
UTCTL0 |= SSEL0; // UCLK = ACLK
UBR00 = 0x0D; // 32k/2400 - 13.65
UBR10 = 0x00; //
UMCTL0 = 0x6B; // Modulation
UCTL0 &= ~SWRST; // 初始化UART0状态机
IE1 |= URXIE0; // 使能接收中断
}
void inizhongduan()
{
P1DIR&=~0x40;//设置红外口为输入
P1IE |= 0x40; //开启p1.6中断允许
CCTL0 = CCIE; //CCR0开中断允许
CCR0 = 200; //向CCR0捕获/比较寄存器装入初值,用于比较
P1IFG = 0; //清除中断标志
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)//增计数一直到捕获点
{
P2OUT=0x00;
for(j=0;j<i;j++)
{
while (!(IFG1 & UTXIFG0)); // TX缓存空闲?
TXBUF0=jiema[j];
}
i=0;
state=0;//回到等待状态
Delay_ms(140);
P1IES |= 0x40;//等待下降沿中断
P1IFG=0;
}
void main(void)
{
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗
//iniCLK();
iniUART();//初始化串口
inizhongduan();
_EINT(); //开总中断允许
P2DIR=0xff;//P2口输出
P2OUT=0xfd;
i=0;
state=0;//等引导码
P1IES |= 0x40;//等待下降沿中断
while(1);
}
#pragma vector=PORT1_VECTOR//语句“#pragma vector=PORT1_VECTOR”指明中断函数是为什么中断服务的,即中断向量。本程序将为端口P1 服务,所以使用PORT1_VECTOR 中断向量
__interrupt void Port1()//出现上升沿,停止计时,输出延时
{
switch (state)
{
case 0:
{
starttimer();//开始计时
state=1;//状态编程引导码长低
P1IES &= ~0x40;//等待上升沿中断
}
P1IFG = 0; //清除中断标志
break;
case 1:
{
stoptimer();
index0=TAR;
starttimer();
state=2;//状态编程引导码长高
P1IES |= 0x40;//等待下降沿中断
while (!(IFG1 & UTXIFG0)); // TX缓存空闲?
TXBUF0=index0;
}
P1IFG = 0; //清除中断标志
break;
case 2://在引导码长高状态
{
stoptimer();
index1=TAR;
state=3;//编码状态低
P1IES &= ~0x40;//等待上升沿中断
while (!(IFG1 & UTXIFG0)); // TX缓存空闲?
TXBUF0=index1;
}
P1IFG = 0; //清除中断标志
break;
case 3://是在编码状态低
{
starttimer();
state=4;// 跳到编码状态高
P1IES |= 0x40;//等待下降沿中断
}
P1IFG = 0; //清除中断标志
break;
case 4://是在编码状态高
{
stoptimer();
jiema[i++]=TAR;//保存计时值
starttimer();
state=3;
P1IES &= ~0x40;//等待上升沿中断
}
P1IFG = 0; //清除中断标志
break;
}
}
点赞
回复评论
暂无评论,赶紧抢沙发吧
最新活动
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
安世半导体理想二极管与负载开关,保障物联网应用的稳健高效运行
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
PI 电源小课堂|无 DC-DC 变换实现多路高精度输出反激电源
2024 瑞萨电子MCU/MPU工业技术研讨会——深圳、上海站, 火热报名中
随便看看
TTL反相器电路中某个三极管集电极电阻的计算问题
ccs中关于cc2650的代码怎么弄
请教各位大侠wince中想写log怎么写啊!!!
EEWORLD大学堂----ARM Mali 图形处理器开发者中心系列视频
通用示波器几种常见故障的分析
STM32 F7 DISCOVERY 来了,猜猜我们要做什么活动?
CC2530发射功率
闹心的DSP与codec器件通信
ip核计算arctan时的结果不会换算
有谁有这两种显示器件的资料啊。
dereferencing type-punned pointer will break strict-aliasing rules
Wap第三方流量统计系统的原罪问题
直流稳压电源 电子大赛培训资料
晒一下小壁虎开发板SLSTK3201A
DS1302程序读写
分频器
急求VHDL高手进来帮我看一看
png按钮的资源释放问题
结构体后面的变量相加是怎样解释好
2.4G无线模块对人体有害吗
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复