(真抱歉,当时申报的项目和后来所做的项目大有差别,结果开发板被我用来做仿真了~。但为了感谢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用的哪个型号的模块?