×
单片机 > 单片机程序设计 > 详情

SIM900A简易报警器程序(51单片机远程控制LED)

发布时间:2021-11-11 发布时间:
|

1.上电后,进入等待接收短信模式,如果接收到的数据中包含 ledon 字符串就会点亮LED7,熄灭LE6
如果不包含 ledon 字符串,就点亮LED6,熄灭LED7。

2.按键和LED对应的端口,请参考程序。

单片机源程序如下:

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


51 单片机例程


本例程使用11.0592MHZ时钟---->必须为11.0592M


串口设置为:9600,8,n,1.



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

#include

#include "string.h"

#include "GA6_module_errors.h"



typedef unsigned char u8;

typedef unsigned int u16;

typedef unsigned long u32;



/************* 本地常量声明 **************/


#define Buf_Max 70 //串口1缓存长度

#define STABLE_TIMES 10 //等待上电后稳定


/************* 本地变量声明 **************/


//串口1发送回车换行

#define UART1_SendLR() UART1_SendData(0X0D);UART1_SendData(0X0A)


/*LED端口定义*/


sbit LED0 = P1^0;

sbit LED1 = P1^1;

sbit LED2 = P1^2;

sbit LED3 = P1^3;

sbit LED4 = P1^4;

sbit LED5 = P1^5;

sbit LED6 = P1^6;

sbit LED7 = P1^7;


/*KEY端口定义*/


sbit KEY0 = P2^0;

sbit KEY1 = P2^1;

sbit KEY2 = P2^2;

sbit KEY3 = P2^3;


/************* 本地变量声明 **************/

xdata u8 Uart1_Buf[Buf_Max];

u8 First_Int = 0;


u16 count_20ms;

u8 receive_mode = 0;

u8 find_string_flag = 0;

idata char num_message[4];//暂时假设最多只能存999条短信

idata char AT_CMGR[15];


/************* 本地函数声明 **************/

void delay_ms(u16 ms); //延时ms个20ms ms*20ms

void CLR_Buf(void); //清串口接收缓存

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

void UART1_SendData(u8 dat); //串口1发送 1字节

void UART1_SendString(char *s);//串口1发送 字符串

void UART1_Send_Command(char *s); //发送命令

u8 UART1_Send_AT_Command(u8 *b,u8 *a,u8 wait_time,u16 interval_time);//发送AT指令集


u8 Wait_CREG(u8 query_times);


void Timer0Init(void) //20毫秒@115200

{

TMOD &= 0xF0;

TMOD |= 0x01; //

TL0 = (65536-20000)%256; //

TH0 = (65536-20000)/256; //

TF0 = 0; //

ET0 = 1; //

TR0 = 1; //开始计时

}


void Uart1Init(void) //9600bps@11.05926MHz

{

PCON &= 0x7F; //

SCON = 0x50; //

TMOD &= 0x0F; //

TMOD |= 0x20; //

TL1 = 0xFD; //

TH1 = 0xFD; //

ET1 = 0; //

TR1 = 1; //

ES = 1; //

}


int check_status(void)//检查状态

{

int ret;

ret = UART1_Send_AT_Command("AT","OK",3,50);//测试通信是否成功

if(ret == 0)

{

return COMMUNITE_ERROR;

}

ret = UART1_Send_AT_Command("AT+CPIN?","READY",2,50);//查询卡是否插上

if(ret == 0)

{

return NO_SIM_CARD_ERROR;

}

ret = Wait_CREG(3);//查询卡是否注册到网络

if(ret == 0)

{

return SIM_CARD_NO_REG_ERROR;

}

return 1;

}


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

注:当然你可以返回其他值,来确定到底是哪一步发送指令出现失败了。

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

int config_format(void)//配置格式

{

u8 ret;

//设置存储位置

ret = UART1_Send_AT_Command("AT+CPMS="SM","ME","SM"","OK",3,100);

if(ret == 0)

{

return AT_CPMS_ERROR;

}

ret = UART1_Send_AT_Command("AT+CMGF=1","OK",3,50);//配置为TEXT模式

if(ret == 0)

{

return AT_CMGF_ERROR;

}

ret = UART1_Send_AT_Command("AT+CSCS="GSM"","OK",3,50);//设置字符格式

if(ret == 0)

{

return AT_CSCS_ERROR;

}

return 1;

}


int read_message(void)//读取消息

{

char *buffer_ptr;

u8 i,len;

u8 ret;

memset(num_message,'


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向