GSM模块令人着迷,尤其是在我们的项目需要远程访问时。这些模块可以执行普通手机可以执行的所有操作,例如拨打/接听电话,发送/接收短信,使用GPRS连接到互联网等。您也可以将普通的麦克风和扬声器连接到此模块,然后在自己的设备上进行通话手机通话。如果可以与微控制器接口,这将为许多创意项目打开大门。因此,在本教程中,我们将学习如何将GSM模块(SIM900A)与PIC微控制器接口,并通过使用GSM模块拨打和接听电话进行演示。我们之前已将其与Arduino和Raspberry Pi进行接口以进行调用和消息传递:
- 使用Arduino和GSM模块进行呼叫和消息
- 使用Raspberry Pi和GSM模块进行通话和短信
所需材料:
- PIC单片机(PIC16F877A)
- GSM模块(SIM900或其他任何模块)
- 连接线
- 12V适配器
- PicKit 3
GSM模块:
通过使用AT命令模式,即使没有任何微控制器,也可以使用GSM模块。如上图所示,GSM模块带有USART适配器,可以通过使用MAX232模块直接将其连接到计算机,或者可以使用Tx和Rx引脚将其连接到微控制器。您还可以注意到可以连接麦克风或扬声器的其他引脚,例如MIC +,MIC-,SP +,SP-等。该模块可由12V适配器通过普通的DC桶式插座供电。
将SIM卡插入模块的插槽中并打开电源,您会注意到电源LED亮起。现在等待一分钟左右,您应该会看到红色(或任何其他颜色)的LED每3秒闪烁一次。这意味着您的模块能够与SIM卡建立连接。现在,您可以继续将模块与Phone或任何微控制器连接。
使用AT命令与GSM模块通信:
您可能已经猜到了,GSM模块可以通过串行通信进行通信,并且只能理解一种语言,即“ AT命令”。无论您想告诉或询问GSM模块什么,都只能通过AT命令进行。例如,如果您想知道模块是否处于活动状态。您应该询问(发送)“ AT”之类的命令,模块将回答“ OK”。
这些AT命令在其数据表中已作了很好的解释,可以在其官方数据表中找到。好的!好的!它是一个271页的数据表,您可能需要花费数天才能通读它们。因此,我在下面给出了一些最重要的AT命令,以帮助您快速启动并运行。
在 |
用OK进行确认答复 |
AT + CPIN? |
检查信号质量 |
AT + COPS? |
查找服务提供商名称 |
ATD96XXXXXXXX; |
呼叫特定号码,以分号结尾 |
AT + CNUM |
查找SIM卡的号码(对于某些SIM卡可能不起作用) |
ATA |
接听来电 |
ATH |
挂断当前的来电 |
电话+电话 |
显示来电号码 |
AT + VTS =(数字) |
发送DTMF号码。您可以在移动键盘上使用任何数字作为(数字) |
AT + CMGR |
AT + CMGR = 1在第一个位置读取消息 |
AT + CMGD = 1 |
删除第一个位置的消息 |
AT + CMGDA =“全部删除” |
删除SIM中的所有消息 |
AT + CMGL =“全部” |
阅读所有来自SIM卡的消息 |
AT + CMGF = 1 |
设置短信配置。“ 1”表示纯文本模式 |
AT + CMGS =“ + 91 968837XXXX” > CircuitDigest文字
|
将短信发送到此处的特定号码968837XXXX。当您看到“>”时,开始输入文本。按Ctrl + Z发送文本。 |
AT + CGATT? |
检查SIM卡上的互联网连接 |
AT + CIPSHUT |
关闭TCP连接,意味着断开与Internet的连接 |
AT + CSTT =“ APN”,“用户名”,“通过” |
使用APN和Pass键连接到GPRS。可以从网络提供商处获得。 |
AT + CIICR |
检查SIM卡是否有数据包 |
AT + CIFSR |
获取SIM网络的IP |
AT + CIPSTART =“ TCP”,“服务器IP”,“端口” |
用于设置TCP IP连接 |
AT + CIPSEND |
此命令用于将数据发送到服务器 |
电路原理图:
GSM模块与PIC微控制器接口的连接图如下所示。
我们仅将GSM模块的Tx和Rx引脚分别与PIC MCU PIC16F877A的Rx和Tx引脚相连。这将在两者之间建立串行连接。另外,请不要忘记将GSM和PIC模块共同接地。我们还使用LCD显示屏来了解GSM模块的状态。连接完成后,您的硬件将如下所示。
PIC Perf板是为我们的PIC教程系列制作的,在其中我们学习了如何使用PIC微控制器。如果您不知道如何使用Pickit 3刻录程序,则可能要回到使用MPLABX和XC8的PIC单片机教程,因为我将跳过所有这些基本信息。
为PIC单片机编程:
该项目的完整程序可以在本教程的底部找到。在这里,我将解释一些重要的功能和代码片段。该程序还有一个LCD代码,该代码来自LCD与PIC微控制器的接口,如果您想知道LCD如何与PIC微控制器一起使用,可以访问该教程。
如前所述,我们将通过串行通信模式使用AT命令在PIC和GSM之间进行通信。因此,首先我们必须使用Initialize _SIM900() 初始化PIC单片机中的USART通信模块 。 功能。在此函数中,我们声明Tx和RX引脚,并以9600波特率和8位模式初始化异步接收和发送。
// ***为SIM900初始化UART ** // void Initialize_SIM900(void){// ****设置UART的I / O引脚**** // TRISC6 = 0; // TX引脚设置为输出TRISC7 = 1; // //将RX引脚设置为输入// ________ I / O引脚设置__________ // / **初始化SPBRG寄存器以获得所需的波特率,并将BRGH设置为快速baud_rate ** / SPBRG = 129; // SIM900的波特率为9600,因此129 BRGH = 1; //用于高波特率// _________波特率设置结束_________ // // ****启用异步串行端口******* // SYNC = 0; //异步SPEN = 1; //使能串行端口引脚// _____使能异步串行端口_______ // // **让发送和接收做好准备** // TXEN = 1; //使能传输CREN = 1; //使能接收// __ UART模块已准备好进行发送和接收__ // // **选择8位模式** // TX9 = 0; //选择8位接收RX9 = 0;//选择8位接收模式// __选择8位模式__ //} // ________ UART模块已初始化__________ //
现在,我们需要从GSM模块读取信息或向其中写入信息。为此,我们使用函数_SIM900_putch(),_ SIM900_getch(),_ SIM900_send_string(),_ SIM900_print()。这些功能使用发送和接收缓冲寄存器(例如TXREG和RCREG)来串行读取或写入数据。
// **向UART发送日期的一个字节的功能** // void _SIM900_putch(char bt){while(!TXIF); //保持程序直到TX缓冲区可用TXREG = bt; //用接收到的值加载发送器缓冲区} // _____________函数结束__________________ // //函数从UART获取日期的一个字节** // char _SIM900_getch(){if(OERR)//检查错误{ CREN = 0; //如果出错-> Reset CREN = 1; //如果错误->重置} while(!RCIF); //保持程序直到RX缓冲区空闲为止返回RCREG; // //接收值并将其发送到主函数} // _____________函数结束________________ // // //将字符串转换为字节的函数** // void SIM900_send_string(char * st_pt){while(* st_pt)//如果存在是一个字符_SIM900_putch(* st_pt ++);// //将其作为字节数据处理} // __________函数结束______________ // // **修改后的代码结束** // void _SIM900_print(unsigned const char * ptr){while(* ptr!= 0){_SIM900_putch(* ptr ++); }
以上功能是通用的,无需针对任何应用程序进行更改。仅对它们进行了简要介绍。如果您想通过理解,可以深入了解它们。
现在在我们的主函数中,我们初始化USART连接,并使用下面的代码行发送“ AT”来检查是否能够接收“ OK”
做{Lcd_Set_Cursor(2,1); Lcd_Print_String(“找不到模块”); }同时(!SIM900_isStarted()); //等到GSM返回“ OK” Lcd_Set_Cursor(2,1); Lcd_Print_String(“检测到模块”); __delay_ms(1500);
函数SIM900_isStarted(); 会向GSM发送“ AT”并等待它的响应“ OK”。如果是,则返回1,否则返回0;否则返回0。
如果未检测到模块或存在任何连接问题,则液晶显示屏将显示“找不到模块”,否则将显示已检测到模块,然后继续执行下一步,我们将检查以下各项是否可以检测到SIM卡代码行。
/ *检查是否检测到SIM卡* /执行{Lcd_Set_Cursor(2,1); Lcd_Print_String(“找不到SIM卡”); }同时(!SIM900_isReady()); //等到GSM发送回“ + CPIN:READY” Lcd_Set_Cursor(2,1); Lcd_Print_String(“检测到SIM卡”); __delay_ms(1500);
函数SIM900_isReady()将发送“ AT + CPIN?” 到GSM并等待其响应“ + CPIN:READY”。如果是,则返回1,否则返回0;否则返回0。
如果找到SIM卡,我们将在LCD上显示检测到的SIM卡。然后,我们可以尝试使用命令“ ATD mobilenumber ; ”。此处以我的编号为ATD93643159XX;为例。您必须在那里替换您的手机号码。
/ *拨打电话* /做{_SIM900_print(“ ATD93643XXXXX; \ r \ n”); //这里我们要拨打号码93643XXXXX Lcd_Set_Cursor(1,1); Lcd_Print_String(“ Placing Call….”); }同时(_SIM900_waitResponse()!= SIM900_OK);//等到ESP发回“ OK” Lcd_Set_Cursor(1,1); Lcd_Print_String(“已放置呼叫…”); __delay_ms(1500);
拨打电话后,液晶显示屏将显示“已拨电话”,您应该会收到该指定号码的来电。
您还可以使用以下代码拨打连接至GSM模块的手机号码,并在LCD屏幕上获得有关该手机的通知。
while(1){if(_SIM900_waitResponse()== SIM900_RING)//检查是否有来电{Lcd_Set_Cursor(2,1); Lcd_Print_String(“来电!!”); }}
当GSM模块检测到来电时,它将在LCD模块的第二行显示来电。函数 _SIM900_waitResponse() 将检查GSM模块的传入数据。当它收到SIM900_RING时,由于 waitResponce()的 原因,它等效于“ RING” ,我们将显示状态“传入呼叫”。
您可以像这样创建自己的功能,以使用GSM模块执行几乎所有类型的激活。如果您想对内容进行硬编码,则可以简单地使用__SIM900_print()函数发送以下任何AT命令。
_SIM900_print(“ AT + CPIN?\ r \ n”);
请记住,所有命令后均应带有“ \ r \ n”,以指示该命令正在终止。
模拟:
了解了程序的工作原理后,您可以尝试模拟并进行更改以满足您的需求。仿真将为您节省大量时间。仿真是使用Proteus完成的,如下所示。
如您所见,我们在Proteus中使用了虚拟终端选项来检查程序是否按预期响应。我们可以通过弹出对话框输入值。例如,一旦我们点击运行,就会出现一个如上的黑色对话框并显示AT,这意味着它已经发送了GSM模块AT,现在我们可以通过在框中键入“确定”来回复PIC,然后按Enter PIC将对此作出回应。同样,我们可以尝试所有AT命令。
使用GSM和PIC拨打和接听电话:
了解代码和硬件的工作原理后,只需将以下程序上载到PIC并打开模块电源即可。如果一切正常,则LCD上应显示“检测到模块”,“检测到SIM卡”和“呼叫已放置”。看到“已拨电话”后,您将接到该程序中指定号码的来电。
您也可以尝试拨打GSM模块中存在的号码,并且LCD上将显示“ Incoming call”(正在通话),指示正在呼叫SIM。
以下视频显示了该项目的完整工作。希望您理解该项目并喜欢它。如果您在解决问题时遇到任何问题,请将您的问题发布在评论部分或我们的论坛上,我们将很乐意为您提供帮助。