久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1895|回復: 0
收起左側

stm32 sim808 彩信 驅動

[復制鏈接]
ID:154291 發表于 2016-12-12 23:14 | 顯示全部樓層 |閱讀模式
/***********************************************************


*************************************************************/
#include "systerm.h"

uchar GsmRcv[MAXRCV] = {0};
uchar DebugBuf_U2[MAXBUF] = {0};
uchar DebugBuf_U1[MAXBUF] = {0};
uchar GsmRcvCnt = 0;
uchar GsmAtFlag = 0;
uchar Debug2RcvCnt = 0;
uchar Debug1RcvCnt = 0;

/***************************串口2初始化函數函數*****************************/
/*函數原型:char Uart2Init(char smod,char brtx12,unsigned char reload)
/*函數功能:初始化用于連接gprs的串口2 ,串口2只能設置為獨立波特率提供波特率
                        并打開串口2中斷和全局中斷
/*輸入參數: smod        s2smod位                        0/1
                        brtx12        brtx12位                          0/1
                        reload        reload寄存器數值          0-255
/*輸出參數:        -1                s2smod位錯誤,沒有寫入0/1
                        -2                brtx12位錯誤,沒有寫入0/1
                        0
/********************************************************************/
char Uart2Init(char s2smod,char brtx12,unsigned char reload)
{
        S2CON = 0X50;//8位可變波特率,無奇偶位
        BRT        = reload;//設置獨立波特率發生器波特率

        if(s2smod == 1)
        {
                AUXR |= S2SMOD;   //S2SMOD = 1;//波特率倍速位
        }
        else if(s2smod == 0)
        {
                AUXR &= (~S2SMOD);   //S2SMOD = 0;//取消波特率倍速位
        }
        else
        {
                return -1;
        }
               
        if(brtx12 == 1)
        {
                AUXR |= BRTx12;//BRTx12 = 1;1T模式       
        }
        else if(brtx12 == 0)
        {
                AUXR &= (~BRTx12);//BRTx12 = 0;12T模式               
        }
        else
        {
                return -2;
        }               
        AUXR |= BRTR;//開啟波特率發生器

        //設置串口2中斷優先級       
        IP2H |= PS2H;                //設置串口2優先級為3(最高)
        IP2 |= PS2;

        if (UART2_PRIO & 0x02)
        {
                IP2H |= PS2H;
        }
        else
        {
                IP2H &= ~PS2H;
        }
        if (UART2_PRIO & 0x01)
        {
                IP2 |= PS2;
        }
        else
        {
                IP2 &= ~PS2;
        }       
       
                                                                                                                                                                       
        IE2 |= ES2;//        ES2 = 1;           //允許串口2中斷
        EA = 1;           //開總中斷
        return 0;       
}


/***************************串口2發送函數函數************************/
/*函數原型:void Serial_Init(void)
/*函數功能:串口2發送函數,發送單一數據
/*輸入參數:數據
/*輸出參數:無
/********************************************************************/
void Uart2SendHex(uchar i)
{
        S2BUF = i;//裝入數據
        while((S2CON & S2TI) == 0);
        S2CON &= (~S2TI);//S2TI = 0;               
}

/***************************串口2發送字符串函數**********************/
/*函數原型:void Uart2SendStr(char* data_at)
/*函數功能:串口2發送函數,發送字符串
/*輸入參數:字符串指針
/*輸出參數:無
/********************************************************************/
void Uart2SendStr(char* data_at)
{

        unsigned char cnt=0;
        ET0=0;//關閉定時器0                       
        while(*(data_at+cnt))        //判斷一串數據是否結束
        {
                S2BUF = *(data_at+cnt);//裝入數據
                while((S2CON & S2TI) == 0);
                S2CON &= (~S2TI);//S2TI = 0;
                cnt++;

        }
        ET0=1;//打開定時器0               
}

/***************************串口1初始化函數**********************/
/*函數原型:char Uart1Init(char smod,char brtx12,unsigned char reload)
/*函數功能:串口1初始化
/*輸入參數:        smod        smod位        0/1
                        brtx12        brtx12位  0/1
                        reload        reload寄存器數值  0-255

/*輸出參數:        -1                smod位錯誤,沒有寫入0/1
                        -2                brtx12位錯誤,沒有寫入0/1
                        0
/*備注:串口設置位獨立波特率提供波特率,和串口2使用同一個波特率,也可以使用定時器1來提供波特率
/********************************************************************/
char Uart1Init(char smod,char brtx12,unsigned char reload)
{
        SCON =  0X50;//8位可變波特率,無奇偶位(SM0=0,SM1=1),使能串口接收模塊(REN=1)
        BRT        = reload;//設置獨立波特率發生器波特率

        if(smod == 1)
        {
                PCON |= SMOD;   //SMOD = 1;//波特率倍速位
        }
        else if(smod == 0)
        {
                PCON &= (~SMOD);   //SMOD = 0;//取消波特率倍速位
        }
        else
        {
                return -1;
        }
               
        if(brtx12 == 1)
        {
                AUXR |= BRTx12;//BRTx12 = 1;1T模式       
        }
        else if(brtx12 == 0)
        {
                AUXR &= (~BRTx12);//BRTx12 = 0;12T模式               
        }
        else
        {
                return -2;
        }
       
          AUXR |= S1BRS;//串口1設置為使用獨立波特率發生器                                                                               
        AUXR |= BRTR;//開啟波特率發生器
       
        //設置串口1中斷優先級
        if (UART1_PRIO & 0x02)
        {
                IPH |= PSH;
        }
        else
        {
                IPH &= ~PSH;
        }
        if (UART1_PRIO & 0x01)
        {
                PS = 1;                       
        }
        else
        {
                PS = 0;
        }                                                                       
                                                                                       
        ES = 1;           //開串口中斷
        EA = 1;           //開總中斷
        return 0;       
}

/***************************串口1發送函數**********************/
/*函數原型:void Uart1SendHex(char i)
/*函數功能:串口1發送函數
/*函數功能:串口1發送函數,發送單一數據
/*輸入參數:數據
/*輸出參數:無
/**************************************************************/
void Uart1SendHex(char i)
{
        TI = 0; //清空發送完中斷請求標志位
        SBUF = i;  //將數據放入寄存器發送
        while(TI == 0);//等待發送完畢,發送完畢 TI == 1
        TI = 0;        //清空發送完中斷請求標志位
}

/***************************串口1發送字符串函數**********************/
/*函數原型:void Uart1SendStr(char* data_at)
/*函數功能:串口1發送函數,發送字符串
/*輸入參數:字符串指針
/*輸出參數:無
/********************************************************************/
void Uart1SendStr(char* at)
{
        unsigned char cnt=0;
        ET0=0;//關閉定時器0
        while(*(at+cnt))        //判斷一串數據是否結束
        {
                SBUF=*(at+cnt);        //發送數據
                while(TI==0);        //查詢發送是否結束
                TI=0;        //清除發送一標志位
                cnt++;        //準備發送一個數據
        }
        ET0=1;//打開定時器0               
}

/***************************串口1發送接收中斷函數********************/
/*函數原型:void Uart1InterruptReceive(void) interrupt 4
/*函數功能:串口2發送接收中斷函數
/*輸入參數:無
/*輸出參數:無
/*備注:接收函數內部不可以放入其他的中斷或者發送函數,否則影響接收數據
/********************************************************************/
void Uart1InterruptReceive(void) interrupt 4
{
        char tmp = 0;
        if(RI)
        {

                ES=0;//關串行口中斷
                RI=0;//接收中斷信號清零,表示將繼續接收
                tmp = SBUF;//接收數據

#ifdef UART1_DEBUG
                //將接收到的數據放入DebugBuf_U1,在定時器內,DebugBuf_U1會被串口2發送給GSM模塊。
                //這樣通過串口1發送到單片機的數據GSM模塊就可以收到了,主要為了調試的方便。
                DebugBuf_U1[Debug1RcvCnt] = tmp;
                Debug1RcvCnt++;
                if(Debug1RcvCnt>=MAXBUF-1)
                {
                        Debug1RcvCnt = 0;       
                }
#endif

                ES=1;//開串行口中斷       
        }       
}

/***************************串口2發送接收中斷函數**********************/
/*函數原型:void Uart2InterruptReceive(void) interrupt 8
/*函數功能:串口2發送接收中斷函數
/*輸入參數:無
/*輸出參數:無
/*備注:接收函數內部不可以放入其他的中斷或者發送函數,否則影響接收數據
                用于接收GPRS模塊傳輸來的數據,將數據保存到GsmRcv[],在函數中使用strstr判斷數據。
/********************************************************************/
void Uart2InterruptReceive(void) interrupt 8
{
        unsigned char tmp = 0;
        uchar i = 0;

        IE2 &= (~ES2);//關閉串口2中斷//ES2 = 0;
        if(S2CON & S2RI)        //if(S2RI == 1)
        {

                S2CON &= (~S2RI);//S2RI = 0;
                tmp = S2BUF;

#ifdef UART1_DEBUG
                //將接收到的數據放入DebugBuf_U2,在定時器內,DebugBuf_U2會被串口1發送給PC機。
                //這樣GSM發送給單片機的數據也可以在電腦上觀察到了。
                DebugBuf_U2[Debug2RcvCnt] = tmp;
                Debug2RcvCnt++;
                if(Debug2RcvCnt>=MAXBUF-1)
                {
                        Debug2RcvCnt = 0;       
                }
#endif
                               
                GsmRcv[GsmRcvCnt] = tmp;
                GsmRcvCnt++;

                if(GsmRcvCnt > MAXRCV)
                {
                        GsmRcvCnt = 0;
                }
               
        }

        IE2 |= ES2;//ES2 = 1;
}


/***************************GPRS接收緩沖數據初始化函數***************/
/*函數原型:void CleanGsmRcv(void)
/*函數功能:將GsmRcv[]數據清除,并且使緩沖指針移到第一位。
/*輸入參數:無
/*輸出參數:無
/********************************************************************/
void CleanGsmRcv(void)
{
        uchar i = 0;
        for(i=0; i<=MAXRCV; i++)
        {
                GsmRcv[i] = 0;       
        }

        GsmRcvCnt = 0;       
}
/***************************GPRS緩沖數據握手函數***************/
/*函數原型:bit Hand(unsigned char *a)
/*函數功能:判斷收到的數據是否出現判斷的數據。
/*輸入參數:判斷出現的數據
/*輸出參數:        1:出現了判斷的數據
                        0:沒有出現判斷的數據
/********************************************************************/
bit Hand(unsigned char *a)
{
    if(strstr(GsmRcv,a)!=NULL)
            return 1;
        else
                return 0;
}



回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 毛片网站在线观看视频 | 81精品国产乱码久久久久久 | 狠狠狠色丁香婷婷综合久久五月 | 国产黄色av网站 | 欧美激情免费在线 | 999久久久免费精品国产 | 激情网站在线 | 伊人伊人| 欧美日韩一二三区 | 一区二区三区四区在线 | 欧美日韩在线观看视频 | 国产精品国产三级国产aⅴ中文 | 亚洲一区二区三区视频在线 | 国产精品免费在线 | 中文字幕在线三区 | 国产视频福利一区 | 欧美成年网站 | 国产精品日韩一区 | 亚洲免费一区二区 | 午夜看片网站 | 九九亚洲 | 亚洲精品91 | 亚洲成人中文字幕 | 97精品超碰一区二区三区 | 在线播放亚洲 | 91在线免费视频 | 欧美日韩在线精品 | 久优草 | 欧洲视频一区二区 | 国产欧美在线播放 | 成人在线中文字幕 | 91亚洲国产亚洲国产 | 日韩精品一区二区三区中文在线 | 日本一区二区不卡视频 | 福利av在线| 久久精品成人 | 国产粉嫩尤物极品99综合精品 | 狠狠亚洲| 国产精品久久久久久吹潮 | 国产激情视频网 | 中文字幕在线不卡 |