用51单片机读取sim900里的短信程序怎么写

如题所述

买模块商家送资料, 串口配置程序略,主程序如下:
/**********************************************************************************
* 工程名 :短信控制LED
* 描述 :通过短信控制开发板的LED
* 实验平台:C51
* 库版本 :
* 作者 :泥人通信模块开发平台团队
* 博客 :http://nirenelec.blog.163.com
* 淘宝 :http://shop105683814.taobao.com

* 硬件连接说明
使用单片串口与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;
}
}
}
}
}
温馨提示:内容为网友见解,仅供参考
无其他回答

用51单片机读取sim900里的短信程序怎么写
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* 描述 : 检查是否有新信息...

怎么用51单片机读取sim900a接收的短信
void Uart2InterruptReceive(void) interrupt 8 { unsigned char tmp2;\/\/char i;\/\/num2=0;IE2 &= (~ES2);\/\/关闭串口2断\/\/ES2 = 0;if(S2CON & S2RI)\/\/if(S2RI == 1){ S2CON &= (~S2RI);\/\/S2RI = 0;tmp2 = S2BUF;\/\/Uart1Send(tmp2);rev_buf2[num2++]=tmp2;if(num...

51单片机控制sim900a收发短信,到了删短信那里卡住了(灯不亮),求大神指 ...
可以查看是不是while(!Hand("OK"));这句语句没有通过,你可以把LED4=0; 放while(!Hand("OK"));前面,看看灯会不会亮,如果两,则说明while(!Hand("OK"));没有满足跳转条件,你得进一步查找 sim900a的手册。

51单片机与sim900a相连接的最简单的程序是什么?
1.将自己的51单片机的串口1连接到GSM的tx rx gnd 2.找到程序中前面的#define处,根据说明修改好自己的单片机配置,编译程序 2.下载程序 3.按下模块复位键,启动模块,等待信号灯闪烁变慢,复位单片机 4.等待发送成功 \/ include <REGX52.H> define uchar unsigned char define uint unsigned int \/\/...

怎么用51单片机读取sim900a接收的短信,sim900a接收的短信到哪里了,要怎...
没用过这个模块不过帮你找到了一些资料。把发送端由PC改成51单片机应该是一样的效果 http:\/\/wenku.baidu.com\/link?url=1LV69Z6dKOTgtkWRlCrws-gwOLAuALPzn37CGmTRd_Or4Q9PGsWW6641klwzpabxOUBDqL-WQ76CmfItierUp3oBf8uZKGN8KinANY4v1s3 ...

如何利用51单片机读取sim900a收到的短信并且利用收到的短信控制其他引脚...
买模块时,商家会给你例程的,短信控制LED灯亮灭。我这都有51单片机短信控制LED的程序

gsm短信发送模块,求用过的大佬解答,请问sim900a和sim800c控制程序一样...
各位大佬们,作为一个单片机小白,我想做一个以51单片机为核心,用DS18B20温度传感器测温度,LCD1602显示,最终通过SIM900A或SIM800C的短信收发功能将温度传输到手机上,手机也可以实时像SIM发短信来查询相关温度的一个小装置。现在我已经能够将温度通过SIM模块发到手机上了,但是手机向SIM发短信查询温度这...

sim900跟电脑通讯很正常但是和51单片机通讯就不行了,51发出去的AT指令...
答方方朋友:sim900与pc电脑是通信用的是RS232(或RS系列其它版本)标准,而51单片机的通信口非RS系列异步通信标准。若与51单片机串行通信,须用MAX232之类的芯片作电平转换。如下图所示,经电平转换,MAX232 的TXD、RXD引脚与51单片机的RXD、TXD引脚连接。

sim900a和sim800c的51单片机程序一样吗
sim900a和sim800c的51单片机程序一样。根据查询相关资料信息显示,sim900a和sim800c的51单片机都是利用串口通信,附件是51单片机控制SIM800的例程,因此他们的程序是一样的。计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。

51单片机和sim900a模块连接,为什么一直AT握手指令不成功
首先确认单片机发AT指令了,再确认模块处于开机状态,能接收指令(可以直接连电脑串口试试),二者都好的,就没有理由握手不成功

相似回答