昨晚发的帖子刚好遇上论坛被攻击,现在重新发一次,
要求:第一,通过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把!
|