世纪电源网社区logo
社区
Datasheet
标题
返回顶部
未解决

【求助】基于msp430g2553的红外遥控解码程序问题

[复制链接]
查看: 1216 |回复: 1
1
rijkaard
  • 积分:103
  • |
  • 主题:1
  • |
  • 帖子:0
积分:103
LV2
本网技师
  • 2013-4-26 18:02:35
100问答币
求大神帮忙看看基于msp430g2553红外解码的程序问题,本人小白一枚,很白痴。
我的思路是这样的:当有键按下时,其下降沿触发中断,并且保存这是的计数值,第二次下降沿来时在记下时间,将两者相减,看减后得到的值大小判断是“0”还是“1”,以此来得到按键的编码。
但是我仿真之后貌似time_a没有计数,是怎么回事啊?程序那里写错了呢?


/***********main.c*************/
#include <msp430g2553.h>
#include "keyhand.h"


void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT

BCSCTL1 = CALBC1_8MHZ;
DCOCTL = CALDCO_8MHZ;

TACTL = TASSEL_2 + MC_1; // SMCLK, contmode
// TACCTL0 |= CCIE+CM_2+CAP+SCS;

P2DIR |= BIT4; //输出

P2DIR &= ~BIT0; //输入口
P2IES |= BIT0; //下降沿触发中断
P2IE |= BIT0;

// TACCR0 = 0;
_BIS_SR(LPM0_bits + GIE); // 进入低功耗/全局中断
// while(1)
// {
// display();
// }
}
/*
//Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR //TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
Record();
}
*/


// P2口中断服务程序
#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void)
{
//if(P2IFG & 0x01)
//{
Record();
P2IFG &= ~0x01;
_DINT();
//}
}


/**********keyhand.h**************/

#define uchar unsigned char
#define uint unsigned int


uint flag;

uint temp;
uint data0,data1;
uchar bitcnt;
uchar first=1;
uint last;


void Record(void)
{


if(first==1)
{
TACTL |= MC_1;
last=0;
first=0;
}
else if(first==0)
{
P2OUT ^= BIT4; //标志位,看程序有没有执行到这一句
temp=TA0R-last;
TA0R=0;


if ((temp>1000) && (temp<1200)) temp=0; // “0”信号


else if ((temp>2000) && (temp<3500)) temp=1; //“1”信号


else if ((temp>13400) && (temp<13600)) //header信号
{
bitcnt=0;
data0=0;
data1=0;
return; //返回,等待下次开始接收
}

else{ first=1; return; }// 干扰信号,重新计数
//P2OUT ^= BIT4;
bitcnt++;
if (bitcnt<16) //开始接收前16位
{
data0=data0|temp;
data0=data0<<1;
}
else if (bitcnt==16) data0=data0|temp;
else if (bitcnt<32) //开始接收后16位
{
data1=data1|temp;
data1=data1<<1;
}
else if (bitcnt==32)
{
data1=data1|temp;
flag=1;
} // 接收完最后一位

//P2OUT ^= BIT4;
}
}
/*
uchar key_covert(uint code_data)
{
uchar j,key=0;
for(j=0;j<21;j++)
if(code_data==code[j])
{
if(j<=9)
key=j;
// else key=j+55;
}
return key;
}
*/
void display(void)
{
if(flag==1)
P2OUT ^= BIT4;
}


void uart_init(void) //串口初始化
{
BCSCTL1 = CALBC1_8MHZ;
DCOCTL = CALDCO_8MHZ;
P1SEL = BIT1+BIT2; // P1.1 = RXD, P1.2=TXD
P1SEL2 = BIT1+BIT2; // P1.1 = RXD, P1.2=TXD
UCA0CTL1 = UCSWRST; //置位UCSWRST位,使UART模块的寄存器处于初始状态
UCA0CTL1 |= UCSSEL1; //UCLK=SMCLK=1MHz;
UCA0BR0 = 65; //USCI_A0 baud rate countrol
UCA0BR1 = 3; //baud rate:波特率
UCA0CTL1 &= ~UCSWRST; //置0
IE2 |= (UCA0RXIE+UCA0TXIE); //允许串口接收和发送
}


请各位大神解答,我真的弄不明白了
收藏收藏
admin
  • 积分:32503
  • |
  • 主题:2330
  • |
  • 帖子:8891
积分:32503
管理员
最新回复
  • 2013-4-27 09:12:17
  • 倒数1
 
帮顶下
热门技术、经典电源设计资源推荐

世纪电源网总部

地 址:天津市南开区黄河道大通大厦8层

电 话:400-022-5587

传 真:(022)27690960

邮 编:300110

E-mail:21dy#21dianyuan.com(#换成@)

世纪电源网分部

广 东:(0755)82437996 /(138 2356 2357)

北 京:(010)69525295 /(15901552591)

上 海:(021)24200688 /(13585599008)

香 港:HK(852)92121212

China(86)15220029145

网站简介 | 网站帮助 | 意见反馈 | 联系我们 | 广告服务 | 法律声明 | 友情链接 | 清除Cookie | 小黑屋 | 不良信息举报 | 网站举报

Copyright 2008-2024 21dianyuan.com All Rights Reserved    备案许可证号为:津ICP备10002348号-2   津公网安备 12010402000296号