码迷,mamicode.com
首页 > 移动开发 > 详细

GSM开发 手机发送短信控制LED,返回中文短信,C程序源代码【测试】

时间:2015-11-09 01:55:11      阅读:525      评论:0      收藏:0      [点我收藏+]

标签:物联网家居

【谢绝转载!】【谢绝转载!】【谢绝转载!】




【说明】

实物连接图如下:

技术分享


【短信控制】

发送短信到GSM模块,收到相应的指令对应板子上的灯亮灭。

然后模块会向手机发送一条中文短信

技术分享



【源代码】目前仍然处于开发中。。。。。

/******************************
工程名  :短信控制家电
1 先用USB转TTL模块测试模块好用,并修改波特率到9600(AT+IPR=9600)再用单片机调试
2 51单片机晶振 11.0592MHz,12M不可以用  
3 如果模块无开机自启动电路,需要先按接线图中说明进行开机
版本号:V1

手机发送“当前状态”到模块,控制LED灯;
模块并发送两条语句给手机

*******************************/
#include "string.h"
#include "STC12C2052AD.h"

#define cache_max 200 					           //串口接收缓存长度
xdata unsigned char uart_cache[cache_max]; // xdata 把变量存在flash中,而不存在RAM中
//code 定义的数据要放在ROM里面,写入后就不能再更改
bdata unsigned char Flag;     //定时器标志位   bdata 把变量定义为可拆成8位寻址
sbit Timer_start =Flag^0;	    //延时计数功能开关
sbit RUNING = P3^7;					  //运行指示灯
sbit LED1  	= P1^1;			      //控制电脑开机 关机
sbit LED2  	= P1^2;			      //控制电脑开机 关机
sbit LED3  	= P1^3;			      //控制电脑开机 关机
sbit LED4  	= P1^4;			      //控制电脑开机 关机
sbit LED5  	= P1^5;			      //控制电脑开机 关机



unsigned char code *status="5F53524D72B66001";  //当前状态
unsigned char code *computer_on="753581115F00673A";  //电脑开机
unsigned char code *computer_off="753581115173673A";  //电脑关机
unsigned char Times=0;        // 定时器中断次数累加
unsigned char First_Int = 0;  // 串口字符串
unsigned char delay=0;        //延时长度


void SendData(unsigned char dat){   // 发一个8位数据到串口SBUF
	ES=0;					
	SBUF=dat;			
	while(TI!=1);	
	TI=0;					
	ES=1;					
}

void SendString(unsigned char *s){  // 发多个8位数据到串口SBUF
	while(*s)
	SendData(*s++);
}
void SendLR(void) {      // 发回车换行
	SendString("\r\n");
}

void DELAY_MS (unsigned int a){   // 延时
    unsigned int i;
    while ( --a != 0 )    
    for (i=0;i<=600;i++);
}


void Uart1Init(void)	{	//9600bps@11.0592MHz
	PCON &= 0x7F;		//波特率不倍速
	SCON  = 0x50;		//8位数据,可变波特率
	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		  //设定定时初值
	TH1 = 0xFD;		  //设定定时器重装值
	ET1 = 0;		    //禁止定时器1中断
	TR1 = 1;		    //启动定时器1
  ES=1;					  //开串口中断
}

void Uart1() interrupt 4{
	uart_cache[First_Int] = SBUF;  	  //将接收到的字符串存到缓存中
	First_Int++;                			//缓存指针向后移动
	if(First_Int > cache_max)      		//如果缓存满,将缓存指针指向缓存的首地址
	First_Int = 0;
	RI = 0;                           //清除RI位
}

void Timer0Init(void)	{	//20毫秒@11.0592MHz
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//
	TMOD |= 0x01;		//设置定时器模式,16位定时器
	TL0 = 0x00;		  //设置定时器初值
	TH0 = 0xB8;		  //设置定时器初值
	TF0 = 0;		    //清TF0标志
	TR0 = 1;		    //定时器0开始计时
	ET0 = 1;    	  //使能定时器0中断
	EA=1;	          //开总中断
}

void Timer0_ISR() interrupt 1{
	static unsigned char Time_count=0;    // 定时器计数器 static全局生命周期
	TR0=0;                     //关定时器
	TL0 = 0x00;		             //重设定时器初值
	TH0 = 0xB8;		             //重设定时器初值
	Time_count++;             
	if(Time_count>=50)	{
		Time_count = 0;
		RUNING =~RUNING;
	}
	if(Timer_start) Times++;   //如果收到允许定时,开始计时
	if(Times > (50*delay)){  //如果Times 到达设定时间
		Timer_start = 0;
		Times = 0;        // 通知程序 计时时间已到
	}
	TR0=1;                     //开定时器
}

void CLR_Buf1(void){
	unsigned int k;
	for(k=0;k<cache_max;k++)     //将缓存内容清零
	uart_cache[k] = 0x00;
	First_Int = 0;              //接收字符串的起始存储位置
}

unsigned char Find(unsigned char *a)   {             //查找字符串
  if(strstr(uart_cache,a)!=NULL)  return 1;
	else 	return 0;
}

void Send_Command(unsigned char *b,unsigned char *a,unsigned char wait_time)         
{
	unsigned char i;
	unsigned char *c;
	c = b;										//保存字符串地址到c
	CLR_Buf1(); 
  i = 0;
	while(i == 0) { 
		if(Find(a)==NULL)  {          //查找需要应答的字符
			if(Timer_start == 0){
				b = c;							//将字符串地址给b
				for (b; *b!=‘\0‘;b++)	
				SendData(*b);
				SendLR();	
				Times = 0;
				delay = wait_time;
				Timer_start = 1;   // 开启定时器,
		   }
    }
 	  else	{
			i = 1;LED2=!LED2;DELAY_MS(1000); 
			Timer_start = 0;
		}
	}
	CLR_Buf1();
}
void Set_Text_Mode(void) { //设置短信为TEXT文本模式
	Send_Command("ATE0","OK",3);										  //取消回显	
	Send_Command("AT+CNMI=3,2,0,0,0","OK",3);				//新短信直接输出
	Send_Command("AT+CMGF=1","OK",3);								//TEXT模式	
	Send_Command("AT+CPMS=\"SM\",\"SM\",\"SM\"","OK",3);	//所有操作都在SIM卡中进行	
}










void Check_New_Message(void)   { //检查是否有新信息,并执行信息内容指令
	unsigned char temp=0;


	if(strstr(uart_cache,"13429678754")!=NULL)  { 		//若缓存字符串中含有"13429678754"就表示有新的短信
   		DELAY_MS(300);    LED2=0;                      //等待数据全部接收完成
//    computer_ctrol=!computer_ctrol;
// 判断到【当前状态】字符
		if(strstr(uart_cache,status)!=NULL) { LED3=0; //读取【当前状态】并发送
			Send_Command("AT+CSMP=17,167,2,25","OK",3);			 //设置文本模式参数	
			Send_Command("AT+CSCS=\"UCS2\"","OK",3);				 //设置字符集	
			Send_Command("AT+CMGS=\"00310033003400320039003600370038003700350034\"",">",3);//手机号码13429678754 有回车
			Send_Command("662554E5FF0C4F60597DFF01000d000a726980547F51",">",3);//手机号码13429678754 有回车
			SendData(0x1a);// 开始发送 返回OK
		}

		CLR_Buf1();  // 清空SBUF缓存
	}
}









void Wait_CREG(void) { //等待模块注册成功
	unsigned char i;
	unsigned char k;
	i = 0;
	CLR_Buf1();
  while(i == 0) {  
		CLR_Buf1(); LED1=1;
		SendString("AT+CREG?");  //查询模块网络注册状态
		SendLR();
		DELAY_MS(1000);  					
		for(k=0;k<cache_max;k++) {
		if(uart_cache[k] == ‘:‘)  {
			if((uart_cache[k+4] == ‘1‘)||(uart_cache[k+4] == ‘5‘)){  //表明网络注册成功
				i = 1; LED1=0;DELAY_MS(1000);  
				break;
			}
		}
	 }
  }
}

void main(void){
	Timer0Init();         //初始化定时器0
	Uart1Init();          //初始化串口9600
	Send_Command("AT","OK",3);      
	Wait_CREG();          //查询等待模块注册成功
	Set_Text_Mode();      //设置短信为TEXT模式
  Send_Command("AT+CMGD=1,4","OK",3);//删除卡上所有短信

	
	while(1)	{ 
		Check_New_Message();
	}
}




字符串合并

技术分享

/******************************
工程名  :短信控制家电
1 先用USB转TTL模块测试模块好用,并修改波特率到9600(AT+IPR=9600)再用单片机调试
2 51单片机晶振 11.0592MHz,12M不可以用  
3 如果模块无开机自启动电路,需要先按接线图中说明进行开机
版本号:V1
 
手机发送“当前状态”到模块,控制LED灯;
模块并发送两条语句给手机
 
*******************************/
#include "STC12C2052AD.h"
 
#define cache_max 200        //串口接收缓存长度,不宜太大,k=0;k<cache_max;k++会死机
 
//xdata 把变量存在flash中,而不存在RAM中,写入后可以更改
//code 定义的数据要放在ROM里面,写入后就不能再更改
xdata unsigned char uart_cache[cache_max]; // 缓存长度
xdata unsigned char send_cache[190]=""; // 缓存长度
bdata unsigned char Flag;     //定时器标志位   bdata 把变量定义为可拆成8位寻址
sbit Timer_start =Flag^0;     //延时计数功能开关
char NULL=0;
 
sbit RUNING = P3^7;                    //运行指示灯
sbit LED1    = P1^7;                  //控制电脑开机 关机
sbit LED2    = P1^2;                  //控制电脑开机 关机
sbit LED3    = P1^3;                  //控制电脑开机 关机
sbit LED4    = P1^4;                  //控制电脑开机 关机
sbit LED5    = P1^5;                  //控制电脑开机 关机
 
 
 
unsigned char code status[]="5F53524D72B66001";       //当前状态
unsigned char code computer_on[]="753581115F00673A";  //电脑开机
unsigned char code computer_off[]="753581115173673A"; //电脑关机
unsigned char Times=0;        // 定时器中断次数累加
unsigned char First_Int = 0;  // 串口字符串
unsigned char delay=0;        //延时长度
 
 
 
char * search(const char *str1, const char *str2){
 int n;
 if (*str2)  {
  while(*str1)  {
   for(n = 0; *(str1+n) == *(str2+n); n++ ) {
    if (!*(str2+n+1))    {
     return (char *)str1;
    }
   }
   str1++;
  }
  return NULL;
 }
 return NULL;
}
 
 
char* strcat ( char * dst , const char * src ){  
    char * cp = dst;  
    while( *cp )  
    cp++;                        /* find end of dst */  
    while( *cp++ = *src++ ) ;       /* Copy src to end of dst */  
    return(dst);                  /* return dst */  
}
 
 
void SendData(unsigned char dat){   // 发一个8位数据到串口SBUF
    ES=0;                  
    SBUF=dat;          
    while(TI!=1);  
    TI=0;                  
    ES=1;                  
}
 
void SendString(unsigned char *s){  // 发多个8位数据到串口SBUF
    while(*s)
    SendData(*s++);
}
void SendLR(void) {      // 发回车换行
    SendString("\r\n");
}
 
void DELAY_MS (unsigned int a){   // 延时
    unsigned int i;LED1=~LED1;
    while ( --a != 0 )    
    for (i=0;i<=600;i++);
}
 
 
void Uart1Init(void)   {   //9600bps@11.0592MHz
    PCON &= 0x7F;     //波特率不倍速
    SCON  = 0x50;        //8位数据,可变波特率
    AUXR &= 0xBF;     //定时器1时钟为Fosc/12,即12T
    AUXR &= 0xFE;     //串口1选择定时器1为波特率发生器
    TMOD &= 0x0F;     //清除定时器1模式位
    TMOD |= 0x20;     //设定定时器1为8位自动重装方式
    TL1 = 0xFD;         //设定定时初值
    TH1 = 0xFD;         //设定定时器重装值
    ET1 = 0;          //禁止定时器1中断
    TR1 = 1;          //启动定时器1
  ES=1;                     //开串口中断
}
 
void Uart1() interrupt 4{
    uart_cache[First_Int] = SBUF;     //将接收到的字符串存到缓存中
    First_Int++;                            //缓存指针向后移动
    if(First_Int > cache_max)            //如果缓存满,将缓存指针指向缓存的首地址
    First_Int = 0;
    RI = 0;                           //清除RI位
}
 
void Timer0Init(void)  {   //20毫秒@11.0592MHz
    AUXR &= 0x7F;     //定时器时钟12T模式
    TMOD &= 0xF0;     //
    TMOD |= 0x01;     //设置定时器模式,16位定时器
    TL0 = 0x00;         //设置定时器初值
    TH0 = 0xB8;         //设置定时器初值
    TF0 = 0;          //清TF0标志
    TR0 = 1;          //定时器0开始计时
    ET0 = 1;        //使能定时器0中断
    EA=1;             //开总中断
}
 
void Timer0_ISR() interrupt 1{
    static unsigned char Time_count=0;    // 定时器计数器 static全局生命周期
    TR0=0;                     //关定时器
    TL0 = 0x00;                    //重设定时器初值
    TH0 = 0xB8;                    //重设定时器初值
    Time_count++;             
    if(Time_count>=50)   {
        Time_count = 0;
        RUNING =~RUNING;
    }
    if(Timer_start) Times++;   //如果收到允许定时,开始计时
    if(Times > (50*delay)){  //如果Times 到达设定时间
        Timer_start = 0;
        Times = 0;        // 通知程序 计时时间已到
    }
    TR0=1;                     //开定时器
}
 
void CLR_Buf1(void){
    unsigned int k;
    for(k=0;k<cache_max;k++)     //将缓存内容清零
    uart_cache[k] = 0x00;
    First_Int = 0;              //接收字符串的起始存储位置
}
 
 
 
 
unsigned char Find(unsigned char *a)   {             //查找字符串
  if(search(uart_cache,a)!=NULL)  return 1;
    else   return 0;
}
 
void Send_Command(unsigned char *b,unsigned char *a,unsigned char wait_time)         
{
    unsigned char i;
    unsigned char *c;
    c = b;                                        //保存字符串地址到c
    CLR_Buf1(); 
  i = 0;
    while(i == 0) { 
        if(Find(a)==NULL)  {          //查找需要应答的字符
            if(Timer_start == 0){
                b = c;                            //将字符串地址给b
                for (b; *b!=‘\0‘;b++)
                SendData(*b);
                SendLR();  
                Times = 0;
                delay = wait_time;
                Timer_start = 1;   // 开启定时器,
           }
    }
     else    {
            i = 1;
            Timer_start = 0;
        }
    }
    CLR_Buf1();
}
void Set_Text_Mode(void) { //设置短信为TEXT文本模式
    Send_Command("ATE0","OK",3);                                          //取消回显 
    Send_Command("AT+CNMI=3,2,0,0,0","OK",3);               //新短信直接输出
    Send_Command("AT+CMGF=1","OK",3);                               //TEXT模式   
    Send_Command("AT+CPMS=\"SM\",\"SM\",\"SM\"","OK",3);    //所有操作都在SIM卡中进行
}
 
 
void Wait_CREG(void) { //等待模块注册成功
    unsigned char i;
    unsigned char k;
    i = 0;
    CLR_Buf1();
  while(i == 0) {  
        CLR_Buf1(); 
        SendString("AT+CREG?");  //查询模块网络注册状态
        SendLR();
        DELAY_MS(1000);                   
        for(k=0;k<cache_max;k++) {
        if(uart_cache[k] == ‘:‘)  {
            if((uart_cache[k+4] == ‘1‘)||(uart_cache[k+4] == ‘5‘)){  //表明网络注册成功
                i = 1;  
                break;
            }
        }
     }
  }
}
 
void Check_New_Message(void)   { //检查是否有新信息,并执行信息内容指令
    unsigned char temp=0;
    unsigned char d[39]="";
    unsigned char *s1=" View View View View";
    unsigned char *s2=" hahahahahaha";
 
strcat(d,s1);
strcat(d,s2);
     
   //若缓存字符串中含有"13429678754"就表示有新的短信
    if(search(uart_cache,"13429678754")!=NULL)  {       
         DELAY_MS(300);                       //等待数据全部接收完成
//    computer_ctrol=!computer_ctrol;
// 判断到【当前状态】字符
        if(search(uart_cache,status)!=NULL) {  //读取【当前状态】并发送
//          Send_Command("AT+CSMP=17,167,2,25","OK",3);          //设置文本模式参数   
//          Send_Command("AT+CSCS=\"UCS2\"","OK",3);                 //设置字符集  
//          //手机号码13429678754 有回车
            Send_Command("AT+CMGS=\"00310033003400320039003600370038003700350034\"",">",3);
 
 
            Send_Command(d,">",3);
//          Send_Command(computer_off,">",3);
             
            SendData(0x1a);// 开始发送 返回OK
        }
 
        CLR_Buf1();  // 清空SBUF缓存
    }
}
 
void main(void){
    Timer0Init();         //初始化定时器0
    Uart1Init();          //初始化串口9600
    Send_Command("AT","OK",3);      
    Wait_CREG();          //查询等待模块注册成功
    Set_Text_Mode();      //设置短信为TEXT模式
  Send_Command("AT+CMGD=1,4","OK",3);//删除卡上所有短信
 
 
 
    while(1)    { 
        Check_New_Message();
    }
}











本文出自 “生命不息,折腾不止。” 博客,谢绝转载!

GSM开发 手机发送短信控制LED,返回中文短信,C程序源代码【测试】

标签:物联网家居

原文地址:http://990487026.blog.51cto.com/10133282/1710772

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!