⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 單片機實現短信收發程序
💻 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 + -