0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

科技观察员 来源:circuitdigest 作者:里沙布·耆那教 2022-11-10 15:57 次阅读

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

所需材料

阿特梅加16

GSM 模块(SIM900 或任何其他)

液晶显示屏

按钮

10k 电阻器,电位计

连接线

12V 适配器

USBasp 编程

10 针 FRC 电缆

使用的软件

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

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

GSM 模块

poYBAGNsrvyAI7JoAAD9m9py3ck983.JPG

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

pYYBAGNsrv6AOhN6AABdEJ8Vowg444.png

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

ATMega16 GSM 模块接口电路图

pYYBAGNsrwCAYSBvAADMzX0IwC0024.png

连接将如下所示

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

poYBAGNsrwKAOo_uAAF9-x-Dl28242.jpg

使用 CodeVision 为 ATmega16 创建项目

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

已上传

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

pYYBAGNsrwOAWYYmAACSmU93eSM309.png

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

poYBAGNsrwWAMrP8AAC8vZSNJSE599.png

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

poYBAGNsrwuAHwELAACn3AGlTK4886.png

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

poYBAGNsrwyABNKAAACQQjvlETg957.png

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

pYYBAGNsrw2ASAeNAACCgPtnOKs284.png

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

poYBAGNsrw-AKrSUAACKBkwvfRU197.png

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

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

poYBAGNsrxCAL9wcAACOz4VNrzg473.png

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

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

poYBAGNsrxOABtS1AADie_Din-E288.png

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

}

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

构建项目

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

poYBAGNsrxWAPvo4AACrYuMM7gU615.png

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

将代码上传到Atmega16

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

poYBAGNsrxiAIFI2AABxP4nGW2o992.png

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 文件夹中选择十六进制文件,如下所示。

pYYBAGNsrxmATcjDAABJuWZ3p6s729.png

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

    关注

    9

    文章

    835

    浏览量

    122866
  • SIM900A
    +关注

    关注

    3

    文章

    54

    浏览量

    35252
收藏 人收藏

    评论

    相关推荐

    如何将16x2 LCD与Atmega16 AVR连接并显示简单的欢迎消息

    在本教程中,我们将了解如何将 16x2 LCD 与 Atmega16 AVR 微控制器连接并显示简单的欢迎消息。
    的头像 发表于 11-11 17:29 3154次阅读
    <b class='flag-5'>如何将</b><b class='flag-5'>16</b>x2 LCD与<b class='flag-5'>Atmega16</b> AVR<b class='flag-5'>连接</b>并显示简单的欢迎消息

    想在atmega16单片机上加一个GSM模块,请问需要选择哪种GSM模块???

    `想在atmega16单片机上加一个GSM模块,请问需要选择哪种GSM模块???如果可以请具体到型号什么的,跪谢大家!!!`
    发表于 04-07 22:27

    如何使用AVR微控制器Atmega16连接伺服电机的方法

    文章中,我们将使用Atmel Studio 7.0Micro Servo Motor伺服电机与Atmega16 AVR微控制器连接起来。伺服电机的额定工作电压为4.8-6V。我们可以通过应用脉冲或P...
    发表于 06-28 06:28

    使用ATMega16单片机实现数码管00-99显示 精选资料分享

    使用ATMega16单片机实现数码管00-99显示最近学习了ATMega16单片机的中断系统,要求完成单片机外部中断的实践。利用Mega16单片机的外部中断控制数码管计数显示。要求:1
    发表于 07-14 06:46

    如何利用ATmega16实现KEY点灯?

    如何利用ATmega16实现KEY点灯?
    发表于 10-29 07:22

    如何利用atmega16实现电子闹钟的设计?

    如何利用atmega16实现电子闹钟的设计?
    发表于 01-24 06:13

    关于ATmega16知识教程教程分享

    ATmega16教程11-4
    的头像 发表于 07-04 09:47 4681次阅读

    ATmega16教程:键盘原理与应用(1)

    ATmega16教程5-1
    的头像 发表于 07-11 00:21 3211次阅读

    ATmega16教程:键盘原理与应用(2)

    ATmega16教程5-2
    的头像 发表于 07-11 00:18 3310次阅读

    ATmega16教程视频讲解(6)

    ATmega16教程第6讲
    的头像 发表于 07-11 00:25 3047次阅读

    ATmega16教程:DA,AD (1)

    ATmega16教程8-1
    的头像 发表于 07-11 00:46 4616次阅读

    ATmega16教程:DA,AD (2)

    ATmega16教程8-2
    的头像 发表于 07-11 00:49 3981次阅读

    ATmega16教程:UART(2)

    ATmega16教程10-2
    的头像 发表于 07-11 00:29 4046次阅读

    ATmega16教程:UART (1)

    ATmega16教程10-1
    的头像 发表于 07-11 00:22 4177次阅读

    如何将16x2 LCD与Raspberry pi4连接

    电子发烧友网站提供《如何将16x2 LCD与Raspberry pi4连接.zip》资料免费下载
    发表于 06-19 11:45 0次下载
    <b class='flag-5'>如何将</b><b class='flag-5'>16</b>x2 LCD与Raspberry pi4<b class='flag-5'>连接</b>