TI中文支持网
TI专业的中文技术问题搜集分享网站

【MSP430 LaunchPad设计心得】基于MSP430f5438的与GPRS之间的串口通信及液晶显示

(真抱歉,当时申报的项目和后来所做的项目大有差别,结果开发板被我用来做仿真了~。但为了感谢TI给我送的板子,我想想还是把最近做的项目贴出来分享吧,但不是为了参赛。其余的我也就真不想要了)

本项目是“基于zigbee的无线传感器网络的森林火灾检测系统”的终端通信及显示模块。能与GPRS进行通信。系统复位后,首先要对GPRS进行初始化,先给他发3条指令,每条指令发成功后,GPRS都会自动返回“OK”,程序以此为判断是否接收成功。初始化完毕后程序等待,直到GPRS接收到信息后,主动给430发个信息,然后430辨别出此信息,再给GPRS一条指令,表示读取此信息,GPRS将信息全给430,430接收后进行帅选数据,帅选完后就可以放在液晶里显示了。关键内容就是上面,其余的完善部分如:按键可刷屏,还有铃声中断程序等都放在子文件里。

由于作品已经参加完“利尔达杯”,所以都被拆了,现在就拿出来分享下5系列的串口的调试和彩屏液晶的调试,彩屏液晶用的主芯片是ili9481,由于本身对430不是特别精通,所以这些都是初级程序。希望大家能多给我建议。谢谢啊~

下面是主程序,里面包含的头文件及工程都放在附件里了:

#include "msp430x54x.h"
#include "DOTFT.h"
#include"init_time.h"
#include"send.h"

unsigned int cnt=0;//用于计数
unsigned int lcnt=0;//用来记录fbuff的最后一个数字
unsigned char fbuff[SIZE];//存储输入的数
unsigned char tx_buff[SIZE];
 unsigned char tx_num;
 unsigned char tx_cnt;
unsigned char  weizhi;
unsigned int anjiancnt;
unsigned int pk;
 //unsigned char restore[SIZE];
int n;
int k;
int m=0;
int key1=0;//key1是用来判断是否要开始接收最后的3行数据,接收并显示完后务必清零,否则不能再接收
int key2=0;//用来决定是否接收下去,得在显示信号后清零
int key3=0;//说明接收完数据该处理了,得在显示信号后清零
int cnt2=0;//专门用在末尾的计数
int cnt3=0;//用于提取fbuu计数,显示信号后清零即可
int cnt4=0;//用于restore的专用计数,显示信号后可清零
unsigned char tiqu[SIZE];//存储输入的数
int ofkey=0;
char put(unsigned char*ptr,unsigned int lenth)
{
int j ;
if(UCA0IE&UCTXIE)  return(0);
if(lenth>SIZE) return(0);
for(j=0;j<lenth;j++)
{
tx_buff[j]=ptr[j];
}
tx_cnt=0;
tx_num=lenth;
UCA0IFG|=UCTXIFG;
UCA0IE|=UCTXIE;
return(1);
}

 

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  TIME();
  unsigned char put1[6]={'A','T','E','0',0x0D,0x0A};
  unsigned char put2[19]={'A','T','+','C','N','M','I','=','2',',','1',',','0',',','0',',','0',0x0D,0x0A};
    unsigned char put3[11]={'A','T','+','C','M','G','F','=','1',0x0D,0x0A};
  unsigned char put4[11]={'A','T','+','C','M','G','R','=','1',0x0D,0x0A};
  unsigned char put5[11]={'A','T','+','C','M','G','D','=','1',0x0D,0x0A};
  P3SEL = 0x30;                             // P3.4,5 = USCI_A0 TXD/RXD
  UCA0CTL1 |= UCSWRST;                      // **Put state machine in reset**
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
  UCA0BR0 =0X4E;                              // 1MHz 9600 (see User's Guide)
  UCA0BR1 = 0;                              // 1MHz 9600
  UCA0MCTL = UCBRS_0 + UCBRF_2 + UCOS16;   // Modln UCBRSx=0, UCBRFx=0,
                                            // over sampling
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  UCA0IE |= UCRXIE+UCTXIE;                         // Enable USCI_A0 RX interrupt
    P2DIR&=~(BIT2+BIT0+BIT4);
  P2IES|=(BIT2);
  P2IE|=(BIT2);
  //dotft();
  _EINT();
        put(put1,6);
  __delay_cycles(7000000);
    put(put2,19);
  __delay_cycles(7000000);
    put(put3,11);
  __delay_cycles(7000000);
  while(1)
  {

    put(put1,6);
     __delay_cycles(7000000);
    for(k=0;k<3;)
    {     put(put1,6);
     __delay_cycles(7000000);
      if(fbuff[0]=='O'){fbuff[0]='u';put(put1,6); k++;m++;}
         }
            __delay_cycles(7000000);
   for(k=0;k<1;)
   {
         if(fbuff[0]=='O'){fbuff[0]='u';put(put2,19); k++;m++;}
      }
           __delay_cycles(7000000);
   for(k=0;k<1;)     {
         if(fbuff[0]=='O'){/*fbuff[0]='u';*/put(put3,11);k++;m++;}
     //__delay_cycles(7000000);

     //if(fbuff[0]=='O'){k++;m++;}
        }
           __delay_cycles(7000000);
      put(put5,11);
     dotft();
    retft();
    OK();
   while(1)
      {                     if(m>=5&fbuff[3]=='T')      //最后一步没有+CMTA的信号就不执行此步
          {
            key1=1;                   //到达最后三行要输入的时候了
            //put4[8]=fbuff[lcnt];     //读取
           // put5[8]=fbuff[lcnt];     //删除
            put(put4,11);            //发送信号取出这三行
            while(key2<3);            //等待收完三行
            key3=1;                  //接收完数据了
                                      // __delay_cycles(8000000);
          }
              __delay_cycles(7000000);
           if(m>=5&key3==1)
           {               for(cnt3=0;fbuff[cnt3]!=0x0A;cnt3++);//删掉第一句话做准备
              for(;fbuff[cnt3+1]!=0x0A;cnt3++);//删掉第二句话做准备
              for(cnt4=0;fbuff[cnt3+2]!=0x0A;cnt4++,cnt3++) tiqu[cnt4]=fbuff[cnt3];//将第三句话给restore
               tiqu[cnt4]=fbuff[cnt3];
            show(tiqu,cnt4);
              for(cnt4=0;cnt4<SIZE;cnt4++) tiqu[cnt4]=0;//清零restore
              key1=0;//key1是用来判断是否要开始接收最后的3行数据,接收并显示完后务必清零,否则不能再接收
              key2=0;//用来决定是否接收下去,得在显示信号后清零
              key3=0;//说明接收完数据该处理了,得在显示信号后清零
              cnt2=0;//专门用在末尾的计数
              cnt3=0;//用于提取fbuu计数,显示信号后清零即可
              cnt4=0;//用于restore的专用计数,显示信号后可清零
              cnt2=0;//万一又有一个信号来了,这里做准备
              put(put5,11);

           }
               }
    }// For debug
}

// Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
  switch(__even_in_range(UCA0IV,4))
  {
  case 0:break;                             // Vector 0 – no interrupt
 
                                                  /*输入中断处理函数*/
  case 2:                                   // Vector 2 – RXIFG
    if(key1==0)
   {
            if(UCA0RXBUF==0X0D) return;
            if(UCA0RXBUF==0X0A)
           {
                 _NOP();
              for(n=cnt;n<SIZE;n++) fbuff[n]=0;
              lcnt=cnt-1;
                           cnt=0;//为输ru下一串做准备
                return;
           }
              /*用来输ru制定的字节*/
             if(cnt<SIZE)
           {
             fbuff[cnt]=UCA0RXBUF;
              cnt++;
           }
                                               //while (!(UCA0IFG&UCTXIFG));             // USCI_A0 TX buffer ready?
                                       // UCA0TXBUF = UCA0RXBUF;                                            // TX -> RXed character
   }
        if(key1==1&key2<3)
     {
             if(cnt2<SIZE&key2<3)
           {
             fbuff[cnt2]=UCA0RXBUF;
              cnt2++;
           }
       if(UCA0RXBUF==0X0A)
         {
           key2++;    //如果有三句话过来。key2预计为3
                   }
     }
     break;
 
                        /* 输出中断处理函数*/   case 4:
    UCA0TXBUF =tx_buff[tx_cnt];
    tx_cnt++;
    if(tx_cnt>=tx_num)
    {
    UCA0IE&=~UCTXIE;
    }
    break;                           // Vector 4 – TXIFG
      default: break;
  }
}

 

                     /*按键中断*/
#pragma vector=PORT2_VECTOR
__interrupt void P2_ISR(void)
{

  pk=P2IFG&BIT2;
  for(anjiancnt=0;anjiancnt<1000;anjiancnt++);
   if((P2IN&BIT2)==pk)  //判断是否干扰
  {P2IFG=0;return;}
  if(pk&BIT2)
  {                //的确有健按下
 retft();          //刷屏,且不发声
  }
 }

Shimeng Gao:

请问楼主的GPRS用的哪个型号的模块?

赞(0)
未经允许不得转载:TI中文支持网 » 【MSP430 LaunchPad设计心得】基于MSP430f5438的与GPRS之间的串口通信及液晶显示
分享到: 更多 (0)