sim900a发短信程序,单片机控制sim900a收发短信

sim900a发短信程序,单片机控制sim900a收发短信,第1张

  单片机接受指定短信内容,1602显示短信内容,单片机对短信内容作判断,若为所要求的内容,则返回一条短信。

       单片机控制sim900a收发短信

  #include 《reg52.h》 //单片机头文件

  #include 《string.h》

  #include “lcd1602_drv.h”

  #define uchar unsigned char

  #define uint unsigned int

  #define Rx_data_length 110

  uchar Admin_num[11]=“xxxxxxxxxxx”;

  //手机号码 uchar i,j;

  bit Response_receive_SMS_flag=0;

  sbit RS_1602=P2^6; //1602数据/命令选择引脚

  sbit LCD_RW=P2^5; //1602读写引脚

  sbit E_1602=P2^7; //1602使能引脚

  uchar Rx_bit,i;

  uchar xdata Rx_data[Rx_data_length];

  uchar w[]=“WaiTIng 。。。。。。 ”;

  void Response_receive_SMS(void);

  void Uart_SendChar(uchar ch);

  void Uart_SendString(uchar *String);

  void uart_init(void);

  void Clear_Rxdata(uchar length);

  void delay(uint xms)

  {

  uint i,j; for(i=xms;i》0;i--)

  for(j=100;j》0;j--);

  }

  void main(void)

  {

  uint aa=0; EA=1; //开总中断

  LCD_RW=0; //LCD RW 主程序接地一直等于0

  uart_init(); //串口初始化

  lcd_init(); //液晶屏显示初始化

  Rx_bit=0;

  Uart_SendString(“AT+CLIP=1\r\n”);

  delay(500);

  Uart_SendString(“AT+CMGF=1\r\n”); //设置sim900模块为英文方式发送短信

  delay(500);

  Uart_SendString(“AT+CMGD=1\r\n”); //清除所有短信

  delay(500);

  Uart_SendString(“AT+CSCS=\”GSM\“\r”); //设置sim900模块GSM字符

  delay(500);

  Uart_SendString(“AT+CMGF=1\r”); //设置sim900模块为英文方式发送短信

  delay(500);

  Clear_Rxdata(Rx_data_length);

  delay(500);

  memset(Rx_data,‘ ’,sizeof(Rx_data)); //Rx_data数组中元素都为空格

  write_1602com(one);

  for(i=0;i《16;i++)

  {

  while(1)

  {

  EA=1;

  EX0=1; //开外部中断0

  IT0=0; //脉冲触发方式

  Response_receive_SMS(); //循环检测是否收到短信,若收到短信则 Response_receive_SMS_flag==1

  delay(100);

  Rx_bit=0;

  if(Response_receive_SMS_flag==1)

  {

  Uart_SendString(“AT+CMGR=1\r\n”); //短信读取

  delay(2000);

  write_1602com(one);

  for(i=0;i《16;i++)

  {

  write_1602dat(Rx_data[69+i]);

  }

  if(Rx_data[69]==‘x’&&Rx_data[70]==‘x’&&Rx_data[71]==‘ax’&&Rx_data[72]==‘x’&&Rx_data[73]==‘x’) //判断的短信内容,可以不止5位

  {

  aa=1;

  }

  Response_receive_SMS_flag=0;

  Clear_Rxdata(Rx_data_length);

  delay(100);

  Uart_SendString(“AT+CMGD=1\r\n”); //清除所有短信

  delay(100);

  }

  delay(1000);

  if(aa==1)

  {

  delay(1000);

  Uart_SendString(“AT+CMGS=\”“);

  for(j=0;j《11;j++)

  {

  SBUF=Admin_num[j];

  while(TI==0);

  TI=0;

  }

  Uart_SendString(“\”\r“);

  delay(200);

  Uart_SendString(”xxx“); //返回的短信内容

  delay(300);

  Uart_SendChar(0x1a);

  delay(1000);

  aa=0;}

  }

  }

  void uart() interrupt 4

  {

  ES=0;

  if(RI==1) //当硬件接 收到一个数据时,RI会置位

  {

  if(SBUF!=0x0d&&SBUF!=0x0a&&SBUF!=‘ ’) //去除所有的空格

  {

  Rx_data[Rx_bit]=SBUF;

  Rx_bit++;

  }

  if(Rx_bit==Rx_data_length)

  {

  Rx_bit=0;

  }

  RI=0;

  }

  ES=1;

  }

  uchar i=0;

  for(i=0;i《=Rx_data_length;i++)

  {

  if(Rx_data[i] ==‘+’

  &&Rx_data[i+1]==‘C’

  &&Rx_data[i+2]==‘M’

  &&Rx_data[i+3]==‘T’

  &&Rx_data[i+4]==‘I’

  &&Rx_data[i+5]==‘:’)

  {

  Response_receive_SMS_flag=1;

  return;

  }

  }

  Response_receive_SMS_flag=0;

  }

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

  * 名称 : Uart_SendChar(uchar ch)

  * 功能 : 向串口发送一个字符

  * 输入 : 无

  * 输出 : 无

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

  void Uart_SendChar(uchar ch)

  {

  SBUF=ch;

  while(TI==0);

  TI=0;

  }

  void Response_receive_SMS(void)

  {

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

  * 名称 : Uart_SendChar(uchar ch)

  * 功能 : 向串口发送一个字符串

  * 输入 : 无

  * 输出 : 无

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

  void Uart_SendString(uchar *String)

  {

  while (*String !=‘\0’) //字符串结束标志 \0

  {

  Uart_SendChar(*String); String++;

  }

  }

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

  * 名称 : uart_init(void)

  * 功能 : 串口初始化程序

  * 输入 : 无

  * 输出 : 无

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

  void uart_init(void) //初始化uart

  {

  TMOD = 0x20; //定时器1工作模式2,8位可自动重载初值,常把定时1以模式2作为串行口波特率发生器

  SCON = 0x50; //串口选择工作模式1使能接收,允许发送,允许接收

  TH1 = 0xFD; //用11.0592 MHz波特率 9600

  TL1 = 0xFD;

  TR1 = 1; //打开中时器

  ES=1; //打开串口中断

  }

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

  * 名称 : Clear_Rxdata(uchar length)

  * 功能 : 清空接收缓存数组

  * 输入 : 无

  * 输出 : 无

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

  void Clear_Rxdata(uchar length) //清空接收缓存数组

  {

  uchar Bit;

  for(Bit=0;Bit《length;Bit++)

  {

  Rx_data[Bit]=0x30; // ascii码表中十进制48对应的字符为0

  delay(50);

  }

  Rx_bit=0;

  }

  1602.c程序

  #include《reg52.h》

  #include “lcd1602_drv.h”

  sbit RS_1602=P2^6;

  sbit LCD_RW=P2^5; //LCD RW 主程序接地一直等于0

  sbit E_1602=P2^7;

  uchar aa,jj;

  //①写命令子程序

  void write_1602com(uchar com) //液晶写入指令函数

  {

  RS_1602=0; //置为写入命令

  P0=com; //送入数据

  delay(1);

  E_1602=1;

  delay(1);

  E_1602=0;

  }

  //②写数据子程序

  void write_1602dat(uchar dat)

  {

  RS_1602=1; //置为写数据

  P0=dat; //送入数据

  delay(1);

  E_1602=1;

  delay(1);

  E_1602=0;

  }

  void lcd_init(void)

  {

  write_1602com(0x38); //16*2 5*7点阵 8位数据线

  delay(5);

  write_1602com(0x38);

  delay(5);

  write_1602com(0x38);

  delay(5);

  write_1602com(0x08);

  write_1602com(0x0c); //开显示 不显示光标 不闪烁

  write_1602com(0x06); //显示不移动 光标右移

  write_1602com(0x01); // 清屏

  }

  lcd1602_drv.h部分

  #ifndef __LCD1602_DRV_H__

  #define __LCD1602_DRV_H__

  #define uchar unsigned char

  #define uint unsigned int #define one 0x80 //第一行的初始位置

  #define two 0x80+0x40

  void write_1602com(uchar com);

  void write_1602dat(uchar dat);

  void lcd_init();

  #endif

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2717054.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存