OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13155|回复: 21

基于51和SIM900A田园灌溉系统。

[复制链接]

13

主题

206

帖子

1

精华

高级会员

Rank: 4

积分
613
金钱
613
注册时间
2014-10-26
在线时间
32 小时
发表于 2015-4-24 19:02:56 | 显示全部楼层 |阅读模式

昨晚发的帖子刚好遇上论坛被攻击,现在重新发一次, 

要求:第一,通过GSM模块实现无线远程控制水阀的开关。

第二,能够设置灌溉的起始时间。

第三,能够自动检测温度与湿度,定时发送给用户。
以上功能已经全部实现。是帮一个学长做得毕设,第二部,短信设置起始时间是难点,后来去请教老师才出来。
strpos 是精华啊!
一下为用到的模块 :(还有一个可控水阀没贴出来,继电器控制,所以只需控制51IO口就可以控制水开关了)

[mw_shl_code=c,true]#include <reg52.h> #include <intrins.h> #include <string.h> #include <stdio.h> #define uint unsigned int #define uchar unsigned char sbit JIDIANQI=P2^7;//继电器。0开始浇水,1停止浇水 uchar str1[]={" "}; uchar str2[]={" "}; uchar code str3[]={".0%RH"}; uchar code str4[]={".0'C"}; //用户发来的短信格式,x01590259。其中x引导,01点59分开,02点59分关 uchar shi_open,fen_open,shi_close,fen_close;//从mingling[]获取的时间,工作的时分,例如关闭、打开 uchar flag_mingling=0;//0无命令,1有命令没启动电机,2有命令已启动电机 uchar j,aa[54],g_timeout=0;//j是aa数组的指针,g_timeout判断是否超时 #include "delay.h" #include "1602.h" #include "dht11.h" #include "gsm.h" #include "ds1302.h" void ini_UART()//串口初始化、定时器初始化 { SCON = 0x50 ;//UART为模式1,8位数据,允许接收 TMOD |= 0x20 ;//定时器1为模式2,8位自动重装 PCON |= 0x80 ; //SMOD=1; TH1 = 0xFA ;TL1=0xFA;//Baud:19200 fosc="11".0592MHz IE |= 0x90 ; //EA=1;ES=1; TR1 = 1 ; // timer 1 run TI=1; P1=0x5a;//说明已经启动,后面可以删除 } void new_mingling() { uchar i; int k; k=strpos(aa,'x'); if(k>0)//如果短信含有x,表示用户发来的短信是时间 { JIDIANQI=1;//收到新命令,可能覆盖上次没完成的任务,所以要先关闭继电器 flag_mingling=1;//用户有新命令,系统准备启动电机 //更新启动的时间 i=aa[k+1]-'0';shi_open=i*10; i=aa[k+2]-'0';shi_open+=i; i=aa[k+3]-'0';fen_open=i*10; i=aa[k+4]-'0';fen_open+=i; //更新停止的时间 i=aa[k+5]-'0';shi_close=i*10; i=aa[k+6]-'0';shi_close+=i; i=aa[k+7]-'0';fen_close=i*10; i=aa[k+8]-'0';fen_close+=i; } } void ser() interrupt 4 { if(RI==1) { aa[j]=SBUF;//命令存到命令数组 RI=0; //软件清除接收中断 j++; } } void main() { init_1602();//初始化LCD,准备显示,测试LCD是否正常 write_str(2,0,str3);//2列,第0行 write_str(2,1,str4);//2列,第1行 write_str(0,0,str1);//0列、0行 write_str(0,1,str2);//0列,1行 delay1ms(2000);//延时2秒 get_time();//获取时、分 show_time();//显示时、分。只显示一次,后面也没必要再显示了 delay1ms(5000);//延时5秒 ini_UART();//初始化串口 get_wendu();//获取温湿度 show_wendu();//显示温湿度 ini_gsm();//初始化GSM模块 while(1) { if(strstr(aa,"+CMTI")!=NULL) //缓存中有+CMTI字符 { read_gsm();//读取1号位置的短信,存入aa[] new_mingling();//判断短信中是否含有时间 clear_gsm();//不知道干嘛用的,在什么情况下才用? } if(flag_mingling>0)//如果有任务,你就得随时干活 { get_time();//获取时间,存入shi2、fen2 if(flag_mingling==1)//没启动 { if(shi2>=shi_open && fen2>=fen_open) { JIDIANQI=0;//启动继电器 flag_mingling=2;//更改命令状态 mcu_send_user(1);//发送信息给用户,已启动 } } else if(flag_mingling==2)//已启动 { if(shi2>=shi_close && fen2>=fen_close) { JIDIANQI=1;//关闭继电器 flag_mingling=0;//命令状态恢复为0 mcu_send_user(0);//发送信息给用户,已关闭 } } } } } [/mw_shl_code]
主要就是51控制sim900a收发短信,还有可以发去指定短信,返回温湿度数值的短信。
第一次发分享贴,原子哥给个COOL把!


GSM_2015-3-29-2下午(最终版).zip

38.17 KB, 下载次数: 1189

学习!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-4-24 23:17:42 | 显示全部楼层
不错,谢谢分享。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

206

帖子

1

精华

高级会员

Rank: 4

积分
613
金钱
613
注册时间
2014-10-26
在线时间
32 小时
 楼主| 发表于 2015-4-26 21:42:14 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
说好的COOL呢
学习!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-4-26 22:36:29 | 显示全部楼层
cool...
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-4-28
在线时间
0 小时
发表于 2015-4-30 10:21:07 | 显示全部楼层
楼主  ,能不能说说你的东西  大概的工作流程?
大家共勉~
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-4-28
在线时间
0 小时
发表于 2015-4-30 16:02:52 | 显示全部楼层
有没有纯GSM的源程序啊,我用这个剔除掉检测温湿度和液晶显示的,在用GSM好像没什么反应啊     ,貌似一直停在GSM初始化函数里面,不知道为什么,楼主帮忙给我解释一下啊~~~
大家共勉~
回复 支持 反对

使用道具 举报

13

主题

206

帖子

1

精华

高级会员

Rank: 4

积分
613
金钱
613
注册时间
2014-10-26
在线时间
32 小时
 楼主| 发表于 2015-4-30 22:18:16 | 显示全部楼层
怀疑是你硬件问题
你开机启动GSM 打电话进去你放在GSM的电话卡
通-硬件没问题
不通(关机,不在服务区之类)-肯定是硬件问题了
对于硬件问题,
特别注意不要用4G卡和 电信卡

通了之后程序还是不行?
1.可能是接线问题,你看下下面那个pdf怎么接
2.强烈建议用 串口调试 再烧程序

ATK-SIM900A模块使用说明_AN1305.pdf

4.79 MB, 下载次数: 526

51控制GSM发英文短信(20s一次).zip

42.39 KB, 下载次数: 564

学习!
回复 支持 反对

使用道具 举报

11

主题

193

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2013-3-19
在线时间
20 小时
发表于 2015-6-1 09:17:37 | 显示全部楼层
楼主能不能发送、接收中文短信?
回复 支持 反对

使用道具 举报

13

主题

206

帖子

1

精华

高级会员

Rank: 4

积分
613
金钱
613
注册时间
2014-10-26
在线时间
32 小时
 楼主| 发表于 2015-6-3 22:36:33 | 显示全部楼层
回复【8楼】精神不死6530:
---------------------------------
实验没做到,不过应该不难,就是麻烦点
学习!
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2015-6-21
在线时间
0 小时
发表于 2015-6-21 16:02:32 | 显示全部楼层
大师。帮我SIM900控制灯泡的程序有点问题,本人qq:1804738504
回复 支持 反对

使用道具 举报

13

主题

206

帖子

1

精华

高级会员

Rank: 4

积分
613
金钱
613
注册时间
2014-10-26
在线时间
32 小时
 楼主| 发表于 2015-6-23 20:22:47 | 显示全部楼层
回复【10楼】hatar007:
---------------------------------
一步步调,不要急。
1. 注意看说明,要用移动,联通的非4G卡
2.用电脑串口调试 AT指令,看是哪里出问题,开机? 发短信?收短信?
3. 第二步都没问题, 那就用 单片机控制 收发,参考我上面程序,基本功能就实现了,
学习!
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2015-6-21
在线时间
0 小时
发表于 2015-7-3 19:53:03 | 显示全部楼层
回复【11楼】q27488:
大神:帮我看看我写的,没反应。不知道哪里的问题。
---------------------------------
/*===================================
 程序名:GPS模块实现短信控制灯泡
 开发者:MTMORI007
 开发时间:2015-7-1
 ===================================*/


#include <reg52.h>          //单片机头文件
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define Rx_data_length 110

uchar Admin_num[11]="1538495xxxx";  //手机号码
uchar i,j;
uchar aa,jj;

sbit C_LED1=P3^2; //继电器指示灯引脚定义
sbit C_JDQ1=P3^3; //继电器引脚定义
sbit C_LED2=P3^7; //继电器指示灯引脚定义
sbit C_JDQ2=P2^0; //继电器引脚定义

bit Response_receive_SMS_flag=0;
            
uchar Rx_bit,i;
uchar xdata Rx_data[Rx_data_length];
void Response_receive_SMS(void);
void Uart_SendChar(uchar ch);
void Uart_SendString(uchar *String);
void uart_init(uint p);
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; //开总中断
uart_init(1); //串口初始化
Rx_bit=0;
delay(3000);
// 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数组中元素都为空格
   
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);

if(Rx_data[61]=='o'&&Rx_data[62]=='p'&&Rx_data[63]=='e'&&Rx_data[64]=='n'&&Rx_data[65]=='1')    //判断的短信内容,可以不止5位
{
aa=1;
PC_LED1=0;
PC_JDQ1=0;

}
else if(Rx_data[61]=='c'&&Rx_data[62]=='l'&&Rx_data[63]=='o'&&Rx_data[64]=='s'&&Rx_data[65]=='e'&&Rx_data[66]=='1')    //判断的短信内容,可以不止5位
{
aa=1;
PC_LED1=1;
PC_JDQ1=1;
}
else if(Rx_data[61]=='o'&&Rx_data[62]=='p'&&Rx_data[63]=='e'&&Rx_data[64]=='n'&&Rx_data[65]=='2')    //判断的短信内容,可以不止5位
{
aa=1;
PC_LED2=0;
PC_JDQ2=0;
}
else if(Rx_data[61]=='c'&&Rx_data[62]=='l'&&Rx_data[63]=='o'&&Rx_data[64]=='s'&&Rx_data[65]=='e'&&Rx_data[66]=='2')    //判断的短信内容,可以不止5位
{
aa=1;
PC_LED2=1;
PC_JDQ2=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("YES");   //返回的短信内容
// 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;
}
void Response_receive_SMS(void)
{
uchar i=0;
    for(i=0;i<=Rx_data_length;i++)
    {
     if(Rx_data =='+'
&&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; 
}

 /********************************************************************
* 名称: Uart_SendChar(uchar ch)
* 功能: 向串口发送一个字符串 
* 输入: 无
* 输出: 无
***********************************************************************/
void Uart_SendString(uchar *String)
{
while (*String !='\0')    //字符串结束标志 \0
{
Uart_SendChar(*String);
String++;
}
}
/********************************************************************
* 名称: uart_init(void)
* 功能: 串口初始化程序 
* 输入: 无
* 输出: 无
***********************************************************************/
void uart_init(uint p) //初始化uart

switch(p)
           {
   case 1:
    TMOD = 0x20;   //定时器1工作模式2,8位可自动重载初值,常把定时1以模式2作为串行口波特率发生器
    SCON = 0x50;   //串口选择工作模式1使能接收,允许发送,允许接收
    TH1 = 0xFD;   //用11.0592 MHz波特率 9600
    TL1 = 0xFD; 
    TR1 = 1;      //打开中时器
ES=1;       //打开串口中断
case 2:
SCON = 0x50 ;//UART为模式1,8位数据,允许接收
    TMOD |= 0x20 ;//定时器1为模式2,8位自动重装
    CON |= 0x80 ; //SMOD=1;
    TH1 = 0xFA ;TL1=0xFA;//Baud:19200 fosc="11".0592MHz   
    IE |= 0x90 ;     //EA=1;ES=1;
    TR1 = 1 ;       // timer 1 run
    TI=1;
P1=0x5a;//得饕丫?舳??竺婵梢陨君
}
}
/********************************************************************
* 名称: 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;
}>
回复 支持 反对

使用道具 举报

13

主题

206

帖子

1

精华

高级会员

Rank: 4

积分
613
金钱
613
注册时间
2014-10-26
在线时间
32 小时
 楼主| 发表于 2015-7-3 21:18:26 | 显示全部楼层
回复【12楼】hatar007:
---------------------------------
你能 用51控制发短信没有?
学习!
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2015-6-21
在线时间
0 小时
发表于 2015-7-3 22:32:51 | 显示全部楼层
回复【13楼】q27488:
---------------------------------
大师,我真不知道单片机控制的那过程,但是串口助手试过了,打电话,发短信,接受短信都成功了!希望单片机控制部分帮忙,本人qq:616505460
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2015-6-21
在线时间
0 小时
发表于 2015-7-3 22:33:41 | 显示全部楼层
回复【14楼】hatar007:
---------------------------------
如果成功了,这个模块万分感激不急。谢谢
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2015-7-27
在线时间
8 小时
发表于 2016-3-15 11:57:34 | 显示全部楼层
入门新手,大神可以发电路图给我吗?2279606542@qq.ccom
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-4-8
在线时间
0 小时
发表于 2016-4-8 16:29:37 | 显示全部楼层
请问下大神,这个程序适用于stm32吗
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-4-11
在线时间
6 小时
发表于 2016-4-11 16:05:10 | 显示全部楼层
先记号,后慢读,谢谢啦
回复 支持 反对

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2016-1-4
在线时间
26 小时
发表于 2016-4-12 19:36:07 | 显示全部楼层
好 mark
回复 支持 反对

使用道具 举报

13

主题

206

帖子

1

精华

高级会员

Rank: 4

积分
613
金钱
613
注册时间
2014-10-26
在线时间
32 小时
 楼主| 发表于 2016-4-14 09:36:44 | 显示全部楼层
rookie33 发表于 2016-4-8 16:29
请问下大神,这个程序适用于stm32吗

一样的,简单的串口控制SIM9001模块。IO控制继电器而已,
学习!
回复 支持 反对

使用道具 举报

32

主题

230

帖子

0

精华

高级会员

Rank: 4

积分
508
金钱
508
注册时间
2016-4-14
在线时间
113 小时
发表于 2016-5-27 09:15:23 | 显示全部楼层
SIM900A能跟单片机引脚直接连接吗
回复 支持 反对

使用道具 举报

5

主题

305

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1690
金钱
1690
注册时间
2018-11-28
在线时间
214 小时
发表于 2022-12-30 09:32:47 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 14:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表