完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
2个回答
|
|
#include
#include #define uchar unsigned char #define uint unsigned int #define RxIn 90 //定义 接收的 数组长 度为90 /********************************** 宏定义*******************************************/ uchar code AT[]="AT"; //握 手信 号 uchar code ATE[]="ATE"; // 关回 显 uchar code AT_CNMI[]="AT+CNMI=2,1";//设置这组参数是来了新信息奖直接显示到串口,不作存储 uchar code AT_CSCA[]="AT+CSCA="+8615816497476""; //设置 服务中心 号码 uchar code AT_CMGF[]="AT+CMGF=1";//设置短信的格 式为 text格式 uchar code AT_CMGR[]="AT+CMGR=";//读取 短信指令 uchar code AT_CMGS[]="AT+CMGS=";//发送 短信指令 uchar code AT_CMGD[]="AT+CMGD=";//发送 短信指令 uchar code successfully[]="Operate Successfully!"; //发送操作成功信息到 目标号码 uchar code fail[]="Operate failed,try again!"; //发送操作失败 信息到目标号码 uchar AT_delete[12]; uchar AT_Read[12]; //用来存储发送读取短信指令 uchar AT_SendNumber[25]; //用来存储发送短信号码指令 uchar numberbuf[3]; //用来保存短信条数 uchar idata SystemBuf[RxIn]; //储存出口接收数据 uchar CommandBuf[6]; //用来储存指令 uchar idata state[17]; //用来存 储IO口状态 uchar idata state1[17]; //用来存储IO口状态 uchar Rx=0; uint temp; //记录状 态 uchar temp1; // 用于 记录P0口状态 uchar temp2; // 用于记录P2口状态 bit check=0; //查询标志位 bit receiveready=0; //接收短信标志位 bit sendready=0; //发送短信准备标志位 bit send=0; //发送短信标志位 bit flag=0; //指令标志位 /*****************************位定义******************************************/ ***it P3_7=P2^5; //启动GSM的启动线连IGT ***it LED0=P0^0; //LED1 ***it LED1=P0^1; //LED2 ***it LED2=P0^2; //LED3 ***it LED3=P0^3; //继电器1 ***it MOTOR1=P0^7; //继电器5 /*********************************函数声明*************************************/ void Delay_ms(uint i); void Start_GSM(void); void UART_init (void); void sendchar(uchar ch); void sendstring(uchar *p); void GSM_INIT(void); void receive_ready(void); void message_read(void); void read_message(void); void sendmessage(void); /*************************************************************************************/ ////////////////////////////////函数void Delay_ms(uint i); 实现功能:进行毫秒延时////////////////////////////// /*************************************************************************************/ void Delay_ms(uint i) { unsigned int j; for(;i>0;i--){ for(j=0;j<125;j++) {;} } } /*************************************************************************************/ //////////////////////函数void UART_init; 实现功能:对串口进行初始化////////////////////////////////////////////// /*************************************************************************************/ void UART_init (void) { TMOD=0x20; //选择定时器1 PCON=0x00; ///波特率不加倍 SCON=0x50; //串行工作方式1允许串行接收 TH1=0xFD; //实验板上晶振位11.0592MHZ,选择波特率为9600 TL1=0xFD; //在相应计数器上赋值 EA=1; //总中断开启 ES=1; //串行中断开启 TR1=1; //开启定时器1 } /************************************************************************************/ //////////////////////函数void sendchar(uchar ch);实现功能:发送一字节数据/////////////////////////////////////// /************************************************************************************/ void sendchar(uchar ch) { SBUF=ch; while(TI==0); TI=0; } /***********************************************************************************/ //////////////////////函数void sendstring(uchar *p);实现功能:通过串口发送字符串/////////////////// /***********************************************************************************/ void sendstring(uchar *p) { while(*p) { sendchar(*p); p++; } sendchar(0x0D); sendchar(0x0A); } /************************************************************************************/ ///////////////////函数void receive(void) interrupt 4 using 1;实现功能:通过串口接收数据///////////////////////// /************************************************************************************/ void receive(void) interrupt 4 using 1 { if(RI) { if(Rx SystemBuf[Rx]=SBUF; Rx++; } RI=0; } } /*************************************************************************************/ ///////////////////函数void GSM_INIT(void);实现功能:初始化TC35模块/////////////////////////////////////////////// /*************************************************************************************/ void GSM_INIT(void) { LOOP: Delay_ms(1000); sendstring(AT); Delay_ms(1000); sendstring(ATE); Delay_ms(1000); sendstring(AT_CNMI); Delay_ms(1000); //sendstring(AT_CSCA); Delay_ms(1000); for(Rx=0;Rx SystemBuf[Rx]=0x00; } Rx=0; sendstring(AT_CMGF); Delay_ms(1000); if((SystemBuf[2]=='O')&&(SystemBuf[3]=='K')) //判断是否模块初始化成功,成功的话模块会回复"OK"给单片机 { //如果单片机没有收到OK,就继续发送初始化指令/ for(Rx=0;Rx SystemBuf[Rx]=0x00; } Rx=0; } else { for(Rx=0;Rx SystemBuf[Rx]=0x00; } Rx=0; goto LOOP; } } /*************************************************************************************/ ///////////////////函数void receive_ready(void);实现功能:接收短信准备/////////////////////////////////////////// /*************************************************************************************/ void receive_ready(void) { uchar i; if((SystemBuf[5]==0x54)&&SystemBuf[6]==0x49) //如果有新短信来,模块会通过串口向单片机发送字符串,TI { //此函数的功能是判断是否有新短信来,如果来的话就置位准备接受位标志为1 receiveready=1; //如果不是新短信的指令,就舍弃,并将接收数组清零/ } else{ for(i=0;i SystemBuf[i]=0x00; } Rx=0; } } /*************************************************************************************/ /////////////函数 void message_read(void);实现功能:判断短信,准备是否回复短信给目标号码//////// /*************************************************************************************/ void message_read(void) { if((sendready==1)&&(SystemBuf[5]==0x47)&&(SystemBuf[6]==0x52)) //GR send=1; } /*************************************************************************************/ ///////////////////函数 void read_message(void);实现功能:发送读取短信指令,///////////////////////////////////// /*************************************************************************************/ void read_message(void) { uchar i; Delay_ms(1000); for(i=0;i<3;i++) { numberbuf[i]=SystemBuf[14+i]; } for(i=0;i<8;i++) { AT_Read[i]=AT_CMGR[i]; } for(i=8;i<11;i++) { AT_Read[i]=numberbuf[i-8]; } for(Rx=0;Rx SystemBuf[Rx]=0x00; } Rx=0; sendstring(AT_Read); //发送AT+CMGR=?,?代表短信储存所在位置 } /*************************************************************************/ ///////////////////函数void readcommend(void);实现功能:读取短信内容,判断相应指令是否正确/////////////////// /********************************************************************************/ void readcommend(void) { uchar i; for(i=0;i<5;i++) //将短信内容中的指令部分截取出来放到 { //CommandBuf数组中 CommandBuf[i]=SystemBuf[64+i]; } if((CommandBuf[0]=='o')&&(CommandBuf[1]=='p')&&(CommandBuf[2]=='e')&&(CommandBuf[3]=='n')) //判断指令是否为开继电器指令 { switch(CommandBuf[4]) { case 0x31: LED0=0; //LED1开启 break; case 0x32: LED1=0; //LED 2开启 break; case 0x33: LED2=0; //LED 3开启 break; case 0x34: LED3=0; //继电器1开启 break; case 0x35: MOTOR1=0; //继电器 2开启 break; /*case 0x36: realy5=0; //继电器 6开启 break; case 0x37: realy6=0; //继电器 7开启 break; case 0x38: realy7=0; //继电器 8开启 break; case 0x41: key1=0; //开关1开启 break; case 0x42: key2=0; //开关2开启 break; case 0x43: key3=0; //开关3开启 break; case 0x44: key4=0; //开关4开启 break; case 0x45: key5=0; //开关5开启 break; case 0x46: key6=0; //开关6开启 break; case 0x47: key7=0; //开关7开启 break; case 0x48: key8=0; //开关8开启 break; case 0x4f: P0=0;P2=0; break; case 0x3f: temp1=P0; temp2=P2; temp=temp2; temp<<=8; temp=temp|temp1; check=1; break;*/ default:flag=1; //其他指令定义为错误操作 break; //置位错误操作位为1 } } else { if((CommandBuf[0]=='s')&&(CommandBuf[1]=='h')&&(CommandBuf[2]=='u')&&(CommandBuf[3]=='t')) //判断指令是否为关闭电器指令 { switch(CommandBuf[4]) { case 0x31: LED0=1; //关闭LED1 break; case 0x32: LED1=1; //关闭LED2 break; case 0x33: LED2=1; //关闭LED3 break; case 0x34: LED3=1; //关闭继电器1 break; case 0x35: MOTOR1=1; //关闭继电器2 break; /*case 0x36: realy5=1; //关闭继电器6 break; case 0x37: realy6=1; //关闭继电器7 break; case 0x38: realy7=1; //关闭继电器8 break; case 0x41: key1=1; //开关1关闭 break; case 0x42: key2=1; //开关2关闭 break; case 0x43: key3=1; //开关3关闭 break; case 0x44: key4=1; //开关4关闭 break; case 0x45: key5=1; //开关5关闭 break; case 0x46: key6=1; //开关6关闭 break; case 0x47: key7=1; //开关7关闭 break; case 0x48: key8=1; //开关8关闭 break; case 0x53:P0=0xff;P2=0xff; break;*/ default:flag=1; //其他指令定义为错误操作 break; //置位错误操作位为1 } } else {flag=1;} //如果发送的指令既不是open也不是shut就定义为错误操作 } } /***********************************************************************************/ ///////////////////函数void readstate;实现功能:将P0,P2口的状态转化为数组,/////////////////// /**********************************************************************************/ void readstate(void) { uint bitcnt,i,j; for(bitcnt=0,i=0;bitcnt<16,i<16;bitcnt++,i++) { if((temp< else state1[i]=0x31; } for(j=15,i=0;j>=0,i<16;j--,i++) { state[j]=state1[i]; } } /***********************************************************************************/ ///////////////////函数 void delete_message;实现功能:删除读短信指令,//////////////// /********************************************************************************/ void delete_message(void) { uchar i; Delay_ms(1000); Delay_ms(1000); Delay_ms(5000); for(i=0;i<8;i++) { AT_delete[i]=AT_CMGD[i]; } for(i=8;i<11;i++) { AT_delete[i]=numberbuf[i-8]; } for(Rx=0;Rx SystemBuf[Rx]=0x00; } Rx=0; sendstring(AT_delete); //发送AT+CMGR=?,?代表短信储存所在位置 } /******************************************************************************/ ///////////////////函数 void sendmessage(void);实现功能:发送回复短信指令,/////////////////////////////////////// /*********************************************************************************/ void sendmessage(void) { uchar i; for(i=0;i<8;i++) { AT_SendNumber[i]=AT_CMGS[i]; } for(i=8;i<24;i++) { AT_SendNumber[i]=SystemBuf[14+i]; //将对方号码提取用来回复给对方 } sendstring(AT_SendNumber); Delay_ms(400); if(flag==0){ if(check==1){sendstring(state);} //如果查询位置1时,发送状态信息 sendstring(successfully); check=0; } else { sendstring(fail); } Delay_ms(30); sendchar(0X1A); } /*****************************************************************************//////////函数void main();实现功能:主函数,////////////////// /************************************************************************/ void main() { Delay_ms(10000); //延时大约10秒 ,等待模块联网/ UART_init(); //串口初始化/ GSM_INIT(); P0=0XFF; while(1) { receive_ready(); if(receiveready==1) { read_message(); receiveready=0; sendready=1; } Delay_ms(300); message_read(); if(send==1) { Delay_ms(2000); readcommend(); readstate(); sendmessage(); Delay_ms(1000); delete_message(); flag=0; for(Rx=0;Rx SystemBuf[Rx]=0x00; } Rx=0; send=0; } LED3=1; Delay_ms(1000); LED3=0; Delay_ms(1000); } } |
|
|
|
直接找厂家呀!心疼楼主1秒钟!需要资料的话留个邮箱,给您发过去
|
|
|
|
只有小组成员才能发言,加入小组>>
物联网工程师必备:怎么选择不同的无线连接技术,本指南帮你忙!
3257 浏览 1 评论
【DFRobot TinkerNode NB-IoT 物联网开发板试用连载】WIFI功能测试
3903 浏览 0 评论
【DFRobot TinkerNode NB-IoT 物联网开发板试用连载】Arduino的替代SublimeText3+STino
3411 浏览 0 评论
使用端口扩展器轻松高效地向IIoT端点添加具有成本效益的子节点
3964 浏览 1 评论
20603 浏览 11 评论
模组有时候复位重启后输出日志为“REBOOT_CAUSE_SECURITY_PMU_POWER_ON_RESET”的原因?
737浏览 2评论
923浏览 2评论
953浏览 1评论
1078浏览 1评论
359浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 05:43 , Processed in 0.847401 second(s), Total 75, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号