打印

大家帮忙看看这个程序

[复制链接]
2162|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chao11yue|  楼主 | 2013-4-9 18:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当走到这句时”while((UTCTL0&0x01)==0x00)“就走不动了
#include <msp430x12x.h>

#include <string.h>


static unsigned char flag = 0;                                       //标志用于延时
static unsigned char j=0;                                          //接收数据的下标
static unsigned char RCV_Byte[100];                                  //用于接收AT指令返回
static unsigned char sign_r=0;                                       // 接收标志
static unsigned char *s;
static unsigned char *ptr;


//检查硬件是否连通

const unsigned char Cmd0[] = "AT\r" ;
const unsigned char SIGN_END[] = "\r";

//定义SIMEMS GPRS指令
const unsigned char GTM900B_Cmd1[] = "AT+CMGF=1\r" ;                        //格式化为文本模式
const unsigned char GTM900B_Cmd2[] = "AT+CSCA=+8613800451500\r";          //设置短信中心号码
const unsigned char GTM900B_Cmd3[] = "AT+CMGS=18745045030\r";              //设置接收手机号码
const unsigned char GTM900B_Cmd4[] = "123 CTRL+Z\r";                                 //发送123
//const unsigned char GTM900B_Cmd5[] = "CTRL+Z\r";                            //发送短信


void XT_Init(void);                          //使用DCO晶体
void Uart0_Init(void);                      //USART0 初始化
void Send_Cmd(const unsigned char *s);
void Clear_Rcv(void);                             //清除接受到的数据
void Delay(unsigned int Num);                     // 精确延时
void Check_Return_OK(unsigned char N1);          //是否返回OK



//主程序
void main(void)
{

  WDTCTL = WDTPW + WDTHOLD;
  XT_Init();
  sign_r=0;
  _EINT();
  Uart0_Init();

  while(1)
  {
    P3DIR|=0x40;
    P3OUT&=~0x40;               
    Delay(3276);               
    P3OUT|=0x40;               
    //Send_Cmd(Cmd0);
    Delay(332768);
    Send_Cmd(GTM900B_Cmd1);
    Delay(32768);
    Send_Cmd(GTM900B_Cmd2);
    Delay(32768);
    Send_Cmd(GTM900B_Cmd3);
    Delay(32768);
    Send_Cmd(GTM900B_Cmd4);
    Delay(32768);
    //Send_Cmd(GTM900B_Cmd5);
    //Delay(32768);

    while(1)
    if(sign_r==1)
      {
        Delay(32768); // 延迟足够长的时间,以接到指令  

       }



  }

}
//精确延时TIMERA中断延时服务程序
#pragma vector = TIMERA0_VECTOR
__interrupt void timera (void)
{

  flag = 1;
  CCTL0 &=~ CCIE;

}

//COM0口接收数据中断服务程序
#pragma vector = USART0RX_VECTOR

__interrupt void uart_rx (void)
{
  RCV_Byte[j] = RXBUF0;
  strstr(RCV_Byte,SIGN_END);
    if(ptr)
      sign_r=1;

     j++;

}

//使用DCO晶震
void XT_Init(void)
{

  BCSCTL1 |= XTS;                       // ACLK = LFXT1 = HF XTAL
  BCSCTL2 |= SELM1+SELM0;               // MCLK = LFXT1 (safe)

}

//USART0初始化
void Uart0_Init(void)
{

  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD
  P3DIR |= 0x10;
  ME2 |= UTXE0 + URXE0;                     // Enabled USART0 TXD/RXD
  UCTL0 |= CHAR;                            // 8-bit character
  UTCTL0 |= SSEL0;                          // UCLK = ACLK
  UBR00 = 0x03;                             // 32k/9600 - 3.41
  UBR10 = 0x00;
  UMCTL0 = 0x4A;                            // Modulation
  UCTL0 &= ~SWRST;                          // Initalize USART state machine
  IE2 |= URXIE0;                            // Enabled USART0 RX interrupt

}

//发送指令函数

void Send_Cmd(const unsigned char *s)
{

  while(*s != '\r')
  {
    TXBUF0 = *s;
    while((UTCTL0&0x01)==0x00);
    s++;
  }
  TXBUF0 = '\r';
    while((UTCTL0&0x01)==0x00);

}

//定时器A初始化
void TimerA_Init(void)
{

  TACTL = TASSEL0 + TACLR;

}


//清除接受到的数据
void Clear_Rcv(void)
{
   for(j = 100; j > 0 ; j--)
     RCV_Byte[j-1] = 0;
}

//精确延时
void Delay(unsigned int Num)
{

  CCTL0 |= CCIE;
  CCR0 = Num;
  TACTL |= MC0;
  flag = 0;

}

//是否返回OK
void Check_Return_OK(unsigned char N1)
{

  for(j=0; j<100; j++)

    if((RCV_Byte[j]=='O')&&(RCV_Byte[j+1]=='K'))
    {
      sign_r=1;

    }

}

相关帖子

沙发
haidixibahe| | 2013-4-9 19:04 | 只看该作者
while((UTCTL0&0x01)==0x00)  这句话,条件为真表示什么意思,为假又是什么意思,你知道吗?你查阅了UTCTL0这个寄存器了吗?
你要是什么都没自己动手查一下资料和手册就到处问别人,别人给你说的按资料和手册上的来解释,你到时也听不懂,别人也说得很费力。
有一些东西是别人帮不上忙的,这些部分需要你自己去完成。

使用特权

评论回复
板凳
Linda_008| | 2013-4-29 16:03 | 只看该作者
寄存器UTCTL0第0位初始为1,此句while((UTCTL0 & 0x01) == 0x00)为X1与X1恒等于为0,令单片机费解
判断发送缓存是否为空可检测发送标志位UTXIFG0,
while (!(IFG1 & UTXIFG0));                // TX缓存空闲?

使用特权

评论回复
地板
lzmm| | 2013-4-30 19:57 | 只看该作者
没有配置成功吧。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

896

帖子

1

粉丝