昨晚发的帖子刚好遇上
william hill官网
被攻击,现在重新发一次,
要求:第一,通过GSM模块实现无线远程控制水阀的开关。
第二,能够设置灌溉的起始时间。
第三,能够自动检测温度与湿度,定时发送给用户。
以上功能已经全部实现。是帮一个学长做得毕设,第二部,短信设置起始时间是难点,后来去请教老师才出来。
strpos 是精华啊!
一下为用到的模块 :(还有一个可控水阀没贴出来,继电器控制,所以只需控制51IO口就可以控制水开关了)
[C]
纯文本查看 复制代码
#include
#include #include #include #define uint unsigned int#define uchar unsigned char***it 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、fen2if(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;//命令状态恢复为0mcu_send_user(0);//发送信息给用户,已关闭}}} }}主要就是51控制sim900a收发短信,还有可以发去指定短信,返回温湿度数值的短信。
第一次发分享贴,原子哥给个COOL把!
GSM_2015-3-29-2下午(最终版).zip (38.17 KB )