如何将GSM模与ATmega16连接实现发送和接收消息

描述

GSM模块使用起来很有趣,特别是当我们的项目需要远程访问时。这些模块可以执行我们普通手机可以执行的所有操作,例如拨打/接听电话,发送/接收短信,使用GPRS连接到互联网等。您还可以将普通麦克风和扬声器连接到此模块,并在移动通话中交谈。如果它可以与微控制器连接,这将为许多创意项目打开大门。因此,在本教程中,我们将学习如何将GSM模块(SIM900A)与AVR微控制器ATmega16连接,并通过使用GSM模块发送和接收消息来演示它。

所需材料

阿特梅加16

GSM 模块(SIM900 或任何其他)

液晶显示屏

按钮

10k 电阻器,电位计

连接线

12V 适配器

USBasp 编程器

10 针 FRC 电缆

使用的软件

我们将使用CodeVisionAVR软件编写代码,并使用SinaProg软件使用USBASP编程器将代码上传到Atmega16。

在进入原理图和代码之前,我们了解GSM模块及其工作原理。

GSM 模块

ATmega16

即使没有任何微控制器,也可以通过使用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:命令在串行监视器上查看手机号码和短信。短信出现在第二行,如图所示。

ATmega16

我们将扫描此 +CMT: 命令以检查消息是否可用。

ATMega16 GSM 模块接口电路图

ATmega16

连接将如下所示

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

ATmega16

使用 CodeVision 为 ATmega16 创建项目

安装CodeVisionAVR和SinaProg软件后,请按照以下步骤创建项目并编写代码:

已上传

第 1 步。打开 CodeVision 单击“文件 -> 新建”-> 项目。将出现确认对话框。点击是

ATmega16

第 2 步。代码向导将打开。单击第一个选项,即 AT90,然后单击确定。

ATmega16

第 3 步:-选择您的微控制器芯片,在这里我们将采用Atmega16L,如图所示。

ATmega16

第 4 步:-点击 USART。选择 接收器 和 发射器 通过单击它。如下图所示:

ATmega16

第 5 步:-单击字母数字 LCD,然后选择启用字母数字 LCD 支持。

ATmega16

第 6 步:-单击程序 - >生成,保存并退出。现在,我们一半以上的工作已经完成

ATmega16

第 7 步:-在桌面上创建一个新文件夹,以便我们的文件保留在文件夹中,否则我们将分散在整个桌面窗口中。根据需要命名您的文件夹,我建议使用相同的名称来保存程序文件。

我们将有一个接一个的三个对话框来保存文件。

ATmega16

对保存第一个对话框后将出现的其他两个对话框执行相同的操作。

现在,您的工作区如下所示。

ATmega16

我们的大部分工作都是在向导的帮助下完成的。现在,我们只需要为 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);

}

下面给出了带有演示视频的完整代码,现在我们必须构建我们的项目。

构建项目

单击“构建项目”图标,如下所示。

ATmega16

生成项目后,将在调试> Exe文件夹中生成一个十六进制文件,该文件可以在您之前为保存项目而创建的文件夹中找到。我们将使用此十六进制文件通过Sinaprog软件上传到Atmega16中。

将代码上传到Atmega16

根据给定的图表连接电路以编程Atmega16。将FRC电缆的一端连接到USBASP编程器,另一端将连接到微控制器的SPI引脚,如下所述:

ATmega16

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

现在,单击程序,您的代码将在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<

 


 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分