GSM模块使用起来很有趣,特别是当我们的项目需要远程访问时。这些模块可以执行我们普通手机可以执行的所有操作,例如拨打/接听电话,发送/接收短信,使用GPRS连接到互联网等。您还可以将普通麦克风和扬声器连接到此模块,并在移动通话中交谈。如果它可以与微控制器连接,这将为许多创意项目打开大门。因此,在本教程中,我们将学习如何将GSM模块(SIM900A)与AVR微控制器ATmega16连接,并通过使用GSM模块发送和接收消息来演示它。
所需材料
阿特梅加16
GSM 模块(SIM900 或任何其他)
液晶显示屏
按钮
10k 电阻器,电位计
连接线
12V 适配器
10 针 FRC 电缆
使用的软件
我们将使用CodeVisionAVR软件编写代码,并使用SinaProg软件使用USBASP编程器将代码上传到Atmega16。
在进入原理图和代码之前,我们了解GSM模块及其工作原理。
GSM 模块
即使没有任何微控制器,也可以通过使用AT命令模式使用GSM模块。如上所示,GSM模块带有USART适配器,可以使用MAX232模块直接连接到计算机,或者Tx和Rx引脚可用于将其连接到微控制器。您还可以注意到可以连接麦克风或扬声器的其他引脚,如MIC +,MIC-,SP+,SP-等。该模块可以通过普通的直流桶形插孔由 12V 适配器供电。
将SIM卡插入模块插槽并打开电源,您应该注意到电源指示灯亮起。现在等待一分钟左右,您应该会看到红色(或任何其他颜色)LED 每 3 秒闪烁一次。这意味着您的模块能够与您的SIM卡建立连接。现在,您可以继续将模块与手机或任何微控制器连接。
使用 AT 命令与 GSM 模块通信
正如您可能已经猜到的那样,GSM模块可以通过串行通信进行通信,并且只能理解一种语言,即“AT命令”。无论您想告诉或询问GSM模块什么,都只能通过AT命令进行。例如,如果您想知道模块是否处于活动状态。您应该询问(发送)像“AT”这样的命令,您的模块将回答“确定”。
这些AT命令在其数据手册中有很好的解释,可以在其官方数据手册中找到。好!好!这是一份 271 页的数据表,您可能需要几天时间才能通读它们。因此,我在下面给出了一些最重要的AT命令,以便您尽快启动并运行它。
在 | 回复“确定”进行确认 |
AT+CPIN? | 检查信号质量 |
AT+COPS? | 查找服务提供商名称 |
ATD96XXXXXXXX; | 拨打特定号码,以分号结尾 |
AT+CNUM | 查找SIM卡的数量(可能不适用于某些SIM卡) |
ATA | 接听来电 |
阿特 | 挂断当前来电 |
AT+COLP | 显示来电号码 |
AT+VTS=(数字) | 发送 DTMF 编号。您可以使用移动键盘上的任意数字(数字) |
AT+CMGR | AT+CMGR=1 在第一个位置读取消息 |
AT+CMGD=1 | 删除第一个位置的消息 |
AT+CMGDA=“DEL ALL” | 从SIM卡中删除所有邮件 |
AT+CMGL=“ALL” | 读取来自 SIM 卡的所有消息 |
AT+CMGF=1 | 设置短信配置。“1”表示纯文本模式 |
AT+CMGS = “+91 968837XXXX” >电路摘要文本 |
在此处向特定号码发送短信 968837XXXX。当您看到“>”时,请开始输入文本。按 Ctrl+Z 发送文本。 |
AT+CGATT? | 检查SIM卡上的互联网连接 |
AT+CIPSHUT | 关闭TCP连接,意味着断开互联网 |
AT+CSTT = “APN”,“用户名”,“通行证” | 使用您的 APN 和通行密钥连接到 GPRS。可以从网络提供商处获得。 |
AT+CIICR | 检查SIM卡是否有数据包 |
AT+CIFSR | 获取 SIM 卡网络的 IP |
AT+CIPSTART = “TCP”,“服务器 IP”,“端口” | 用于设置 TCP IP 连接 |
AT+CIPSEND | 此命令用于将数据发送到服务器 |
在这里,我们将使用 AT+CMGF 和 AT+CMGS命令来发送消息。
如果您已将GSM模块与Arduino一起使用,则在接收消息时可以使用+ CMT:命令在串行监视器上查看手机号码和短信。短信出现在第二行,如图所示。
我们将扫描此 +CMT: 命令以检查消息是否可用。
ATMega16 GSM 模块接口电路图
连接将如下所示
GSM模块的Tx和Rx分别到Atmega16的Rx(引脚14)和Tx(引脚15)。
将按钮按钮推至 PD5(引脚 19)和 PD6(引脚 20)。
液晶连接:
RS - PA 0
R/W - PA1
英文 - PA2
D4 - PA4
D5 - PA5
D6 - PA6
D7 - PA7
使用 CodeVision 为 ATmega16 创建项目
安装CodeVisionAVR和SinaProg软件后,请按照以下步骤创建项目并编写代码:
已上传
第 1 步。打开 CodeVision 单击“文件 -> 新建”-> 项目。将出现确认对话框。点击是
第 2 步。代码向导将打开。单击第一个选项,即 AT90,然后单击确定。
第 3 步:-选择您的微控制器芯片,在这里我们将采用Atmega16L,如图所示。
第 4 步:-点击 USART。选择 接收器 和 发射器 通过单击它。如下图所示:
第 5 步:-单击字母数字 LCD,然后选择启用字母数字 LCD 支持。
第 6 步:-单击程序 - >生成,保存并退出。现在,我们一半以上的工作已经完成
第 7 步:-在桌面上创建一个新文件夹,以便我们的文件保留在文件夹中,否则我们将分散在整个桌面窗口中。根据需要命名您的文件夹,我建议使用相同的名称来保存程序文件。
我们将有一个接一个的三个对话框来保存文件。
对保存第一个对话框后将出现的其他两个对话框执行相同的操作。
现在,您的工作区如下所示。
我们的大部分工作都是在向导的帮助下完成的。现在,我们只需要为 GSM 编写代码。
代码和说明
创建项目后,所有头文件都会自动附加,您只需包含 delay.h 头文件并声明所有变量。本教程末尾给出了完整的代码。
#include
// Alphanumeric LCD functions
#include
#include
// Standard Input/Output functions
#include
unsigned char received_value(void);
unsigned char received_data,a,b,c;
unsigned int z;
unsigned char msg[15];
unsigned char cmd_1[]={"AT"};
unsigned char cmd_2[]={"AT+CMGF=1"};
unsigned char cmd_3[]={"AT+CMGS="};
unsigned char cmd_4[]={"Call me"};
unsigned char cmd_5[]={"Receiver mobile number"};
创建一个函数以从 UDR 寄存器接收数据。此函数将返回接收到的数据。
unsigned char received_value(void)
{
while(!(UCSRA&(1<
{
received_data=UDR;
return received_data;
}
}
来到while循环,在其中我们创建两个if语句,一个用于发送消息,另一个用于接收。发送按钮与 ATmega 的 PIND6 连接,接收消息按钮与 PIND5 连接。
当首先按下 PIND6(发送按钮)时,如果语句将执行,并且所有发送消息的命令将逐个执行。
while(1){
// lcd_clear();
lcd_putsf("Send->bttn 1");
lcd_gotoxy(0,1);
lcd_putsf("Receive->buttn 2");
if(PIND.6 == 1){
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Sending Msg...");
for(z=0;cmd_1[z]!='';z++)
{
UDR = cmd_1[z];
delay_ms(100);
}
UDR = ('r');
delay_ms(500);
for(z=0;cmd_2[z]!='';z++)
{
UDR = cmd_2[z];
delay_ms(100);
}
… ..
如果按下接收消息按钮,而 (b!='+') 循环将检查 CMT 命令是否存在。如果存在,第二个while循环将执行并转到命令的第二行,并在LCD上逐个打印消息。
while(PIND.5 == 1){
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Receiving Msg...");
b= received_value ();
while (b!='+') {
b= received_value ();
}
b= received_value ();
if(b=='C')
{
b= received_value ();
…
..
此循环将程序带到第二行命令并将消息存储在数组中。
while (b!=0x0a)
{
b= received_value ();
}
for(b=0;b<3;b++) {
c=received_value();
msg[b]=c;
}
..
..
此 for 循环用于在 LCD 上显示消息。
for(z=0;z<3;z++)
{
a=msg[z];
lcd_putchar(a); // PRINT IN lcd
delay_ms(10);
}
下面给出了带有演示视频的完整代码,现在我们必须构建我们的项目。
构建项目
单击“构建项目”图标,如下所示。
生成项目后,将在调试> Exe文件夹中生成一个十六进制文件,该文件可以在您之前为保存项目而创建的文件夹中找到。我们将使用此十六进制文件通过Sinaprog软件上传到Atmega16中。
将代码上传到Atmega16
根据给定的图表连接电路以编程Atmega16。将FRC电缆的一端连接到USBASP编程器,另一端将连接到微控制器的SPI引脚,如下所述:
FRC 母连接器引脚 1 -> 引脚 6,Atmega16 的 MOSI
引脚 2 连接到 atmega16 的 Vcc,即引脚 10
引脚 5 连接到 atmega16 的复位,即引脚 9
引脚 7 连接到 atmega16 的 SCK,即引脚 8
引脚 9 连接到 atmega16 的 MISO,即引脚 7
引脚 8 连接到 atmega16 的 GND,即引脚 11
我们将使用 Sinaprog 上传上面生成的十六进制文件,因此打开它并从设备下拉菜单中选择 Atmega16。从调试> Exe 文件夹中选择十六进制文件,如下所示。
现在,单击程序,您的代码将在ATmega16微控制器中刻录。
您已完成,您的微控制器已编程。只需按下按钮即可从GSM和ATmega16微控制器发送和接收消息。
#include
// Alphanumeric LCD functions
#include
#include
// Standard Input/Output functions
#include
unsigned char received_value(void);
unsigned char received_data,a,b,c;
unsigned int z;
unsigned char msg[15];
unsigned char cmd_1[]={"AT"};
unsigned char cmd_2[]={"AT+CMGF=1"};
unsigned char cmd_3[]={"AT+CMGS="};
unsigned char cmd_4[]={"Call me"};
unsigned char cmd_5[]={"Receiver mobile number"};
void main(void)
{
// Port A initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRA=(0<
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTA=(0<
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(0<
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<
// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<
// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=(0<
UCSRB=(0<
UCSRC=(1<
UBRRH=0x00;
UBRRL=0x33;
lcd_init(16);
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Welcome...");
delay_ms(2000);
lcd_clear();
lcd_putsf("Initialising GSM");
delay_ms(4000);
lcd_clear();
while(1){
lcd_putsf("Send->bttn 1");
lcd_gotoxy(0,1);
lcd_putsf("Receive->buttn 2");
if(PIND.6 == 1){
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Sending Msg...");
for(z=0;cmd_1[z]!='';z++)
{
UDR = cmd_1[z];
delay_ms(100);
}
UDR = ('r');
delay_ms(500);
for(z=0;cmd_2[z]!='';z++)
{
UDR = cmd_2[z];
delay_ms(100);
}
UDR = ('r');
delay_ms(500);
for(z=0;cmd_3[z]!='';z++)
{
UDR = cmd_3[z];
delay_ms(100);
}
UDR = ('"');
delay_ms(100);
for(z=0;cmd_5[z]!='';z++)
{
UDR = cmd_5[z];
delay_ms(100);
}
UDR = ('"');
delay_ms(100);
UDR = ('r');
delay_ms(500);
for(z=0;cmd_4[z]!='';z++)
{
UDR = cmd_4[z];
delay_ms(100);
}
UDR = (26); // ctrlZ-> to send the message
delay_ms(500);
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Message Sent.");
delay_ms(1000);
lcd_clear();
}
while(PIND.5 == 1){
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Receiving Msg...");
b= received_value ();
while (b!='+') // infinite loop when + equal to +. otherwise until the loop infinite
{
b= received_value ();
}
b= received_value ();
if(b=='C')
{
b= received_value ();
if(b=='M')
{
b= received_value ();
if(b=='T')
{
b= received_value ();
if(b==':')
{
b= received_value ();
while (b!=0x0a) // waiting upto next line if no means till loop infinte
{
b= received_value ();
}
for(b=0;b<3;b++) {
c= received_value ();
msg[b]=c;
}
lcd_clear();
for(z=0;z<3;z++)
{
a=msg[z];
lcd_putchar(a); // PRINT IN lcd
delay_ms(10);
}
}
}
}
}
delay_ms(3000);
lcd_clear();
}
}
}
unsigned char received_value(void)
{
while(!(UCSRA&(1<
-
ATmega16
+关注
关注
5文章
154浏览量
45818 -
GSM
+关注
关注
9文章
835浏览量
122866 -
SIM900A
+关注
关注
3文章
54浏览量
35252
发布评论请先 登录
相关推荐
评论