📄 main.c
字号:
#include <MSP430X14X.h>
#include "uart.h"
#include "TC35.h"
#include "adc.h"
#include "common.h"
#include "process.h"
void sendSms(char pPhone[],int phonelen,char pData[],int nLen,int mode);
//定义串口操作变量
// 串口 0 的接收标志
char nRev_UART0;
// 串口 1 的接收标志
char nRev_UART1;
// 串口 0 的发送缓冲区
char UART0_TX_BUF[200];
// 串口 0 的接收缓冲区
char UART0_RX_BUF[200];
// 串口 1 的发送缓冲区
char UART1_TX_BUF[50];
// 串口 1 的接收缓冲区
char UART1_RX_BUF[50];
int nTX1_Len;
char nRX1_Len;
char nRX1_Len_temp;
int nTX0_Len;
int nRX0_Len;
int nRX0_Len_temp;
char nTX0_Flag;
char nTX1_Flag;
int nSend_TX0;
int nSend_TX1;
int nADC_Count;
int nADC_Sa;
char nADC_Flag;
int ADC_BUF[10 * 8];
int ADC_BUF_Temp[10 * 8];
int nComm;
void main(void)
{
int count;
int i;
int nLen;
char PhoneNumber[18];
char UART1_RX_Temp[50];
char csca[14];
char pBuf[80];
int nPhone;
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
_DINT(); // 关闭中断
nSend_TX1 = 0;
nSend_TX0 = 0;
nTX1_Flag = 0;
nTX0_Flag = 0;
nTX0_Len = 0;
nTX1_Len = 0;
nRX1_Len = 0;
nRX0_Len = 0;
nRev_UART1 = 0;
nRev_UART0 = 0;
nPhone = 0;
nLen = 0;
nComm = 0;
nADC_Count = 0;
count = 0;
/////////////////////////////////
// 初始化
Init_CLK();
Init_UART0();
Init_UART1();
Init_ADC();
//打开中断
_EINT();
// TC35初始化
nTX0_Len = tc35_init(UART0_TX_BUF);
// 设置中断标志,进入发送中断程序
IFG1 |= UTXIFG0;
Delay_ms(100);
csca[0] = '+';
csca[1] = '8';
csca[2] = '6';
csca[3] = '1';
csca[4] = '3';
csca[5] = '8';
csca[6] = '0';
csca[7] = '0';
csca[8] = '2';
csca[9] = '3';
csca[10] = '0';
csca[11] = '5';
csca[12] = '0';
csca[13] = '0';
nTX0_Len = setCsca(UART0_TX_BUF,csca);
// 设置中断标志,进入发送中断程序
IFG1 |= UTXIFG0;
Delay_ms(500);
nTX0_Len = setCmgf(UART0_TX_BUF,0);
// 设置中断标志,进入发送中断程序
IFG1 |= UTXIFG0;
Delay_ms(500);
//首先从FLASH里面读出电话号码数据
nPhone = isPhoneSet(PhoneNumber);
if(nPhone == 1)
{
//电话号码没有配置的情况下
//等待配置
for(;;)
{
if(nRev_UART1 == 1)
{
nRev_UART1 = 0;
for(i = 0;i < nRX1_Len;i++)
{
UART1_RX_Temp[i] = UART1_RX_BUF[i];
PhoneNumber[i] = UART1_RX_BUF[i];
}
nPhone = setPhone(UART1_RX_Temp);
//设置成功
if(nPhone == 1)
{
nTX1_Len = SetOK(UART1_TX_BUF);
// 设置中断标志,进入发送中断程序
IFG2 |= UTXIFG1;
break;
}
else
{
nTX1_Len = SetError(UART1_TX_BUF);
// 设置中断标志,进入发送中断程序
IFG2 |= UTXIFG1;
}
}//if(nPhone == 1)
}//if(nRev_UART1 == 1)
}//for(;;)
//短消息处理循环
count = 0;
for(;;)
{
//采集数据
if(nADC_Flag)
{
//清除标志
nADC_Flag = 1;
count += 1;
if(count >= 6500)
{
//取采集得到的数据
//将采集得到的数据转换为8位
//由于这里是测试程序,没有考虑采集的精度
//用户需要根据系统的需要来决定
for(i = 0;i < 80;i++)
{
pBuf[i] = (char)((ADC_BUF_Temp[i] >> 4) & 0xff);
}
count = 0;
nLen = PhoneNumber[0];
for(i = 0;i < nLen;i++)
{
//去掉长度信息
PhoneNumber[i] = PhoneNumber[i + 1];
}
//发送短消息
sendSms(PhoneNumber,nLen,pBuf,80,1);
}//if(count >= 65000)
}//if(nADC_Flag)
}//for(;;)
}
////////////////////////////////////////
// 处理来自串口 0 的接收中断
#if __VER__ < 200
interrupt [UART0RX_VECTOR] void UART0_RX_ISR(void)
#else
#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX_ISR(void)
#endif
{
char chrTemp;
//接收来自的数据
UART0_RX_BUF[nRX0_Len_temp] = RXBUF0;
nRX0_Len_temp += 1;
chrTemp = UART0_RX_BUF[nRX0_Len_temp - 1];
if((chrTemp == 13) || (chrTemp == 10))
{
//接收到一帧信号
nRX0_Len = nRX0_Len_temp;
nRev_UART0 = 1;
nRX0_Len_temp = 0;
}
}
////////////////////////////////////////
// 处理来自串口 0 的发送中断
#if __VER__ < 200
interrupt [UART0TX_VECTOR] void UART0_TX_ISR(void)
#else
#pragma vector=UART0TX_VECTOR
__interrupt void UART0_TX_ISR(void)
#endif
{
if(nTX0_Len != 0)
{
// 表示缓冲区里的数据没有发送完
nTX0_Flag = 0;
TXBUF0 = UART0_TX_BUF[nSend_TX0];
nSend_TX0 += 1;
Delay_us(5);
if(nSend_TX0 >= nTX0_Len)
{
//数据发送完毕
nSend_TX0 = 0;
nTX0_Len = 0;
nTX0_Flag = 1;
}
}
}
///////////////////////////////////////
// 处理来自串口 1 的接收中断
#if __VER__ < 200
interrupt [UART1RX_VECTOR] void UART1_RX_ISR(void)
#else
#pragma vector=UART1RX_VECTOR
__interrupt void UART1_RX_ISR(void)
#endif
{
//接收来自的数据
UART1_RX_BUF[nRX1_Len_temp] = RXBUF1;
nRX1_Len_temp += 1;
if(UART1_RX_BUF[nRX1_Len_temp - 1] == 13)
{
//接收到一帧信号
nRX1_Len = nRX1_Len_temp;
nRev_UART1 = 1;
nRX1_Len_temp = 0;
}
}
///////////////////////////////////////
// 处理来自串口 1 的发送中断
#if __VER__ < 200
interrupt [UART1TX_VECTOR] void UART1_TX_ISR(void)
#else
#pragma vector=UART1TX_VECTOR
__interrupt void UART1_TX_ISR(void)
#endif
{
if(nTX1_Len != 0)
{
// 表示缓冲区里的数据没有发送完
nTX1_Flag = 0;
TXBUF1 = UART1_TX_BUF[nSend_TX1];
nSend_TX1 += 1;
if(nSend_TX1 >= nTX1_Len)
{
//发送完毕
nSend_TX1 = 0;
nTX1_Len = 0;
nTX1_Flag = 1;
}
}
}
void sendSms(char pPhone[],int phonelen,char pData[],int nLen,int mode)
{
int i;
int len1;
int len2;
char buf1[100];
char buf2[200];
int res;
if(mode == 1)
{
//TEXT模式
packSms_text(pPhone,phonelen,pData,nLen,
&len1,&len2,buf1,buf2);
}
else
{
//PDU模式
packSms_pdu(pPhone,phonelen,pData,nLen,
&len1,&len2,buf1,buf2);
}
//发送头信息
for(i = 0;i < len1;i++)
{
UART0_TX_BUF[i] = buf1[1];
}
//设置发送数据的长度
nTX0_Len = len1;
//设置中断标志,进入发送中断程序
IFG1 |= UTXIFG0;
//等待 > 响应
while(1)
{
//接收到数据
if(nRev_UART0 == 1)
{
for(i = 0;i < nRX0_Len;i++)
{
buf1[i] = UART0_RX_BUF[i];
}
len1 = nRX0_Len;
nRX0_Len = 0;
nRev_UART0 = 0;
break;
}
}
//判断是否是 > 响应
res = getSendResponse(buf1,len1);
if(res == 1)
{
//发送数据信息
for(i = 0;i < len2;i++)
{
UART0_TX_BUF[i] = buf2[1];
}
//设置发送数据的长度
nTX0_Len = len2;
//设置中断标志,进入发送中断程序
IFG1 |= UTXIFG0;
}
//等待响应
//接收到数据
while(1)
{
if(nRev_UART0 == 1)
{
for(i = 0;i < nRX0_Len;i++)
{
buf1[i] = UART0_RX_BUF[i];
}
len1 = nRX0_Len;
nRX0_Len = 0;
nRev_UART0 = 0;
break;
}
}
isSuccessSend(buf1,len1);
}
void Init_TimerA(void)
{
// 选择SMCLK,清除TAR
TACTL = TASSEL1 + TACLR;
//时间间隔
CCR0 = 40000;
// 增记数模式
TACTL |= MC0;
}
//////////////////////////////////////////////
// 定时器中断,完成 ADC 转换
#if __VER__ < 200
interrupt [TIMERA0_VECTOR] void TimerA_ISR(void)
#else
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA_ISR(void)
#endif
{
int i;
// 关闭转换
ADC12CTL0 &= ~ENC;
// 读出转换结果
ADC_BUF[10 * 0 + nADC_Count] = ADC12MEM0;
ADC_BUF[10 * 1 + nADC_Count] = ADC12MEM1;
ADC_BUF[10 * 2 + nADC_Count] = ADC12MEM2;
ADC_BUF[10 * 3 + nADC_Count] = ADC12MEM3;
ADC_BUF[10 * 4 + nADC_Count] = ADC12MEM4;
ADC_BUF[10 * 5 + nADC_Count] = ADC12MEM5;
ADC_BUF[10 * 6 + nADC_Count] = ADC12MEM6;
ADC_BUF[10 * 7 + nADC_Count] = ADC12MEM7;
nADC_Count += 1;
if(nADC_Count >= 10)
{
for(i = 0; i < 10 * 8;i++)
{
ADC_BUF_Temp[i] = ADC_BUF[i];
}
nADC_Count = 0;
nADC_Flag = 1;
}
// 开启转换
ADC12CTL0 |= ENC + ADC12SC;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -