當前位置:名人名言大全網 - 短信平臺 - 用51單片機讀取sim900裏的短信程序怎麽寫

用51單片機讀取sim900裏的短信程序怎麽寫

買模塊商家送資料, 串口配置程序略,主程序如下:

/**********************************************************************************

* 工程名 :短信控制LED

* 描述 :通過短信控制開發板的LED

* 實驗平臺:C51

* 庫版本 :

* 作者 :泥人通信模塊開發平臺團隊

* 博客 :

* 淘寶 :

* 硬件連接說明

使用單片串口與GPRS模塊通信

C51 GPRS模塊

P30 (RXD)->RXD

P31 (TXD)->TXD

GND ->GND

* 軟件功能說明

板子上電後運行指示燈RUNING_LED會以壹秒的頻率閃爍

手機發送“onled”點亮LED;

手機發送“offled”熄滅LED;

**********************************************************************************/

#include "config.h"

#include "string.h"

#include "delay.h"

#include "uart.h"

#define Automatic_Startup 1 //定義自啟動 V1.2版本起有自啟動功能

#define Buf1_Max 200 //串口1緩存長度

/************* 本地常量聲明 **************/

sbit RUNING_LED = P1^2; //運行指示燈

sbit LED = P1^3; //控制指示燈

/************* 本地變量聲明 **************/

xdata u8 Uart1_Buf[Buf1_Max];

u8 Times=0,First_Int = 0,shijian=0;

bdata u8 Flag;//定時器標誌位

sbit Timer0_start =Flag^0; //定時器0延時啟動計數器

/************* 本地函數聲明 **************/

void GPIO_config(void); //引腳初始化

void Timer0Init(void); //定時器0初始化

void CLR_Buf1(void); //清串口接收緩存

u8 Find(u8 *a); //查找字符串

void Second_AT_Command(u8 *b,u8 *a,u8 wait_time);//發送指令

void Wait_CREG(void); //查詢等待模塊註冊成功

void Set_Text_Mode(void); //設置短信為TEXT模式

void Check_New_Message(void); //查詢新短信

/************* 外部函數和變量聲明*****************/

/*******************************************************************************

* 函數名 : main

* 描述 : 主函數

* 輸入 :

* 輸出 :

* 返回 :

* 註意 : 串口波特率是9600,GPRS模塊默認波特率是115200,需要自己通過串口助手修改

為9600方可使用。

程序會刪除手機卡上的短信,請註意

*******************************************************************************/

void main(void)

{

Timer0Init(); //初始化定時器0

GPIO_config();

EA=1; //開總中斷

Uart1Init(); //初始化串口9600

Wait_CREG(); //查詢等待模塊註冊成功

Set_Text_Mode();//設置短信為TEXT模式

//Second_AT_Command("AT+CMGD=1,4","OK",3);//刪除卡上所有短信

while(1)

{

Check_New_Message();

}

}

/*******************************************************************************

* 函數名 : Uart1

* 描述 : 串口1中斷服務入口函數

* 輸入 :

* 輸出 :

* 返回 :

* 註意 :

*******************************************************************************/

void Uart1() interrupt 4

{

if (RI)

{

RI = 0; //清除RI位

Uart1_Buf[First_Int] = SBUF; //將接收到的字符串存到緩存中

First_Int++; //緩存指針向後移動

if(First_Int > Buf1_Max) //如果緩存滿,將緩存指針指向緩存的首地址

{

First_Int = 0;

}

}

if (TI)

{

TI = 0; //清除TI位

}

}

/*******************************************************************************

* 函數名 : Timer0_ISR

* 描述 : 定時器0中斷服務入口函數,20ms中斷壹次

* 輸入 :

* 輸出 :

* 返回 :

* 註意 :

*******************************************************************************/

void Timer0_ISR() interrupt 1

{

static u8 Time_count=0;

TR0=0;//關定時器

TL0 = 0x00; //重設定時器初值

TH0 = 0xB8; //重設定時器初值

Time_count++;

if(Time_count>=50)

{

Time_count = 0;

RUNING_LED =~RUNING_LED;

}

if(count_20ms) //20ms延時計數器

count_20ms--;

if(Timer0_start)

Times++;

if(Times > (50*shijian))

{

Timer0_start = 0;

Times = 0;

}

TR0=1;//開定時器

}

/*******************************************************************************

* 函數名 : GPIO_config

* 描述 : IO口配置函數

* 輸入 :

* 輸出 :

* 返回 :

* 註意 :

*******************************************************************************/

void GPIO_config(void)

{

LED=1;

RUNING_LED=1;

}

/*******************************************************************************

* 函數名 : Timer0Init

* 描述 : 定時器0初始化,20ms定時

* 輸入 :

* 輸出 :

* 返回 :

* 註意 :

*******************************************************************************/

void Timer0Init(void) //20毫秒@11.0592MHz

{

AUXR &= 0x7F; //定時器時鐘12T模式

TMOD &= 0xF0; //

TMOD |= 0x01; //設置定時器模式,16位定時器

TL0 = 0x00; //設置定時器初值

TH0 = 0xB8; //設置定時器初值

TF0 = 0; //清TF0標誌

TR0 = 1; //定時器0開始計時

ET0 = 1; //使能定時器0中斷

}

/*******************************************************************************

* 函數名 : CLR_Buf1

* 描述 : 清除串口2緩存數據

* 輸入 :

* 輸出 :

* 返回 :

* 註意 :

*******************************************************************************/

void CLR_Buf1(void)

{

u16 k;

for(k=0;k<Buf1_Max;k++) //將緩存內容清零

{

Uart1_Buf[k] = 0x00;

}

First_Int = 0; //接收字符串的起始存儲位置

}

/*******************************************************************************

* 函數名 : Find

* 描述 : 判斷緩存中是否含有指定的字符串

* 輸入 :

* 輸出 :

* 返回 : unsigned char:1 找到指定字符,0 未找到指定字符

* 註意 :

*******************************************************************************/

u8 Find(u8 *a)

{

if(strstr(Uart1_Buf,a)!=NULL)

return 1;

else

return 0;

}

/*******************************************************************************

* 函數名 : Second_AT_Command

* 描述 : 發送AT指令函數

* 輸入 : 發送數據的指針、希望收到的應答、發送等待時間(單位:S)

* 輸出 :

* 返回 :

* 註意 :

*******************************************************************************/

void Second_AT_Command(u8 *b,u8 *a,u8 wait_time)

{

u8 i;

u8 *c;

c = b; //保存字符串地址到c

CLR_Buf1();

i = 0;

while(i == 0)

{

if(!Find(a)) //查找需要應答的字符

{

if(Timer0_start == 0)

{

b = c; //將字符串地址給b

for (b; *b!='\0';b++)

{

UART1_SendData(*b);

}

UART1_SendLR();

Times = 0;

shijian = wait_time;

Timer0_start = 1;

}

}

else

{

i = 1;

Timer0_start = 0;

}

}

CLR_Buf1();

}

/*******************************************************************************

* 函數名 : Set_Text_Mode

* 描述 : 設置短信為TEXT文本模式

* 輸入 :

* 輸出 :

* 返回 :

* 註意 :

*******************************************************************************/

void Set_Text_Mode(void)

{

Second_AT_Command("ATE0","OK",3); //取消回顯

Second_AT_Command("AT+CNMI=3,2,0,0,0","OK",3); //新短信直接輸出

Second_AT_Command("AT+CMGF=1","OK",3); //TEXT模式

Second_AT_Command("AT+CPMS=\"SM\",\"SM\",\"SM\"","OK",3);//所有操作都在SIM卡中進行

}

/*******************************************************************************

* 函數名 : Check_Message_rec

* 描述 : 檢查是否有新信息,並執行信息內容指令

* 輸入 :

* 輸出 :

* 返回 :

* 註意 :

*******************************************************************************/

void Check_New_Message(void)

{

u8 temp=0;

if(strstr(Uart1_Buf,"+CMT")!=NULL) //若緩存字符串中含有"+CMT"就表示有新的短信

{

delay_ms(3);//等待數據全部接收完成

if(strstr(Uart1_Buf,"onled")!=NULL)

{

LED = 0;

}

if(strstr(Uart1_Buf,"offled")!=NULL)

{

LED = 1;

}

CLR_Buf1();

//Second_AT_Command("AT+CMGD=1,4","OK",3);//刪除短信

}

}

/*******************************************************************************

* 函數名 : Wait_CREG

* 描述 : 等待模塊註冊成功

* 輸入 :

* 輸出 :

* 返回 :

* 註意 :

*******************************************************************************/

void Wait_CREG(void)

{

u8 i;

u8 k;

i = 0;

CLR_Buf1();

while(i == 0)

{

CLR_Buf1();

UART1_SendString("AT+CREG?");//查詢模塊網絡註冊狀態

UART1_SendLR();

delay_ms(250);

for(k=0;k<Buf1_Max;k++)

{

if(Uart1_Buf[k] == ':')

{

if((Uart1_Buf[k+4] == '1')||(Uart1_Buf[k+4] == '5')) //表明網絡註冊成功

{

i = 1;

break;

}

}

}

}

}