唐 山 学 院 毕 业 设 计
pBuf[5] = 'G'; pBuf[6] = 'S'; pBuf[7] = '='; pBuf[8] = '+'; pBuf[9] = '8'; pBuf[10] = '6'; pBuf[11] = '1'; pBuf[12] = '3'; pBuf[13] = '8'; pBuf[14] = '0'; pBuf[15] = '0'; pBuf[16] = '3'; pBuf[17] = '1'; pBuf[18] = '1'; pBuf[19] = '5'; pBuf[20] = '0'; pBuf[21] = '0'; pBuf[22] = ','; pBuf[23] = '1'; pBuf[24] = '4'; pBuf[25] = '5';
pBuf[26] = (char)(index & 0xff + 0x30); //指针指向所需数据 pBuf[27] = '26'; //结束字符 return 28; //返回数据包的长度 }
在该程序中,封装好了命令“AT+CMGS=
4.2.5 短信接收
//接收短消息
int revSms(char pBuf[]) {
pBuf[0] = 'A'; pBuf[1] = 'T';
26
唐 山 学 院 毕 业 设 计
pBuf[2] = '+'; pBuf[3] = 'C'; pBuf[4] = 'M'; pBuf[5] = 'G'; pBuf[6] = 'R'; pBuf[7] = '=';
pBuf[8] = (char)(index & 0xff + 0x30); //接收指针指向的数据 pBuf[9] = 13; //结束字符 return 10; //返回数据包长度 }
在该程序中封装好了“AT+CMGR=
4.2.6 删除短消息
//删除短消息
int deleteSms(char pBuf[]) {
pBuf[0] = 'A'; pBuf[1] = 'T'; pBuf[2] = '+'; pBuf[3] = 'C'; pBuf[4] = 'M'; pBuf[5] = 'G'; pBuf[6] = 'D'; pBuf[7] = '=';
pBuf[8] = (char)(index & 0xff + 0x30); //删除具体内容 pBuf[9] = 13; //结束
return 10; //返回数据包长度 }
在函数中封装好了“AT+CMGD=
27
唐 山 学 院 毕 业 设 计
4.3 串口程序
串口程序主要完成的是单片机与TC35的通信,由于MSP430F149单片机内有UART,因此实现串口通信相当容易,只需要设置适当的寄存器就可以使串口工作起来。串口工作使用中断机制,发送数据和接受数据都采用中断机制。当接收到有数据到来时,设置一个标志来通知主程序数据到来,当主程序有数据要发送的时候,设置一个标志进入中断发送数据,串口通讯流程图如下:
等待 等待 N
N 设置发送标志 数据到来 Y 发送数据 Y 设置标志 图4-5串口通讯流程图
下面是具体的程序
首先完成的是初始化部分,主要是通过设置适当的寄存器相应的位来使能UART功能。
void Init_UART0(void) {
U0CTL = 0X00; //将寄存器的内容清零 U0CTL += CHAR; U0TCTL = 0X00; UBR0_0 = 0X45; UBR1_0 = 0X00;
UMCTL_0 = 0X49; //调整寄存器
ME0 |= UTXE0 + URXE0; //使能UART0的TXD和RXD IE0 |= URXIE0; IE0 |= UTXIE0; P3SEL |= BIT4; P3SEL |= BIT5;
//使能UART0的RX中断 //使能UART0的TX中断 //设置P3.4为UART0的TXD //设置P3.5为UART0的RXD //数据位为8bit //将寄存器的内容清零 //波特率为115200
U0TCTL += SSEL1; //波特率发生器选择SMCLK
28
唐 山 学 院 毕 业 设 计
P3DIR |= BIT4; return; }
//P3.4为输出管脚
串口中断主要是发送和接受中断下面是具体的程序: /////////////////////////////////////// // 处理来自串口 0 的接收中断
interrupt [UART0RX_VECTOR] void UART0_RX_ISR(void) {
UART0_RX_BUF[nRX1_Len_temp] = RXBUF0; //接收来自的数据 nRX1_Len_temp += 1;
if(UART0_RX_BUF[nRX0_Len_temp - 1] == 13) { } }
/////////////////////////////////////// // 处理来自串口 0 的发送中断
interrupt [UART0TX_VECTOR] void UART0_TX_ISR(void) {
if(nTX0_Len != 0) { } }
nTX0_Flag = 0; nSend_TX0 += 1;
if(nSend_TX0 >= nTX0_Len) {
nSend_TX0 = 0; nTX0_Len = 0; nTX0_Flag = 1; }
// 表示缓冲区里的数据没有发送完
TXBUF0 = UART0_TX_BUF[nSend_TX0]; nRX0_Len = nRX0_Len_temp; nRev_UART0 = 1; nRX0_Len_temp = 0;
29
唐 山 学 院 毕 业 设 计
4.4 主处理程序
主处理模块作用是将各个模块进行协调处理和进行数据交互,主处理模块首先完成初始化工作,然后后进入循环处理,在循环过程中主处理获得采集的模拟数据,并将得到的数据发送到上位机,同时下位机也接收来自上位机的数据。整个程序基于中断服务结构,为了实现中断程序与主程序之间的数据交互,通过设置一些全局变量和全局的缓冲区来实现。
通过流程图可以看出,主处理只负责简单的标志判断和设置标志,然后从指定的缓冲区读取数据,或者将数据放到相应的缓冲区,其他的由中断来进行处理,因此主程序主要和中断程序进行数据交换。 主处理模块方框图如下:
采集新数据 等待 打开中断 TC35数据 程序初始化 发送数据 Y 单片机处理 Y 启动/停止水泵 N Y
图4-6 主处理模块方框图
设置发送标志
具体的程序如后面的附录
30