衡阳派盒市场营销有限公司

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

    瀏覽量

    45890
  • GSM
    GSM
    +關注

    關注

    9

    文章

    835

    瀏覽量

    123026
  • SIM900A
    +關注

    關注

    3

    文章

    54

    瀏覽量

    35313
收藏 人收藏

    評論

    相關推薦

    如何將16x2 LCD與Atmega16 AVR連接并顯示簡單的歡迎消息

    在本教程中,我們將了解如何將 16x2 LCD 與 Atmega16 AVR 微控制器連接并顯示簡單的歡迎消息。
    的頭像 發表于 11-11 17:29 ?3229次閱讀
    <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 ?4734次閱讀

    ATmega16教程:鍵盤原理與應用(1)

    ATmega16教程5-1
    的頭像 發表于 07-11 00:21 ?3278次閱讀

    ATmega16教程:鍵盤原理與應用(2)

    ATmega16教程5-2
    的頭像 發表于 07-11 00:18 ?3355次閱讀

    ATmega16教程視頻講解(6)

    ATmega16教程第6講
    的頭像 發表于 07-11 00:25 ?3107次閱讀

    ATmega16教程:DA,AD (1)

    ATmega16教程8-1
    的頭像 發表于 07-11 00:46 ?4672次閱讀

    ATmega16教程:DA,AD (2)

    ATmega16教程8-2
    的頭像 發表于 07-11 00:49 ?4028次閱讀

    ATmega16教程:UART(2)

    ATmega16教程10-2
    的頭像 發表于 07-11 00:29 ?4111次閱讀

    ATmega16教程:UART (1)

    ATmega16教程10-1
    的頭像 發表于 07-11 00:22 ?4222次閱讀

    如何將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>
    网络赌博网站| 百家乐官网园云鼎赌场娱乐网规则| 澳门百家乐是怎样赌| 八大胜开户| 丽景湾百家乐官网的玩法技巧和规则| 威尼斯人娱乐城信誉怎样| 百家乐官网代理每周返佣| 澳门百家乐官网秘积| 百家乐官网赢家打法| 真人百家乐官网蓝盾| rmb百家乐官网的玩法技巧和规则 木星百家乐官网的玩法技巧和规则 | 拉萨市| 网上百家乐哪家最好| 博彩e族天上人间| 在线百家乐技巧| 永新县| 百家乐庄闲的分布| 同花順国际娱乐城| 百家乐网站那个好| 衢州市| 专业百家乐软件| 百家乐官网赢家公式| 金樽百家乐的玩法技巧和规则| 真人百家乐官网ea平台| 威尼斯人娱乐城排名| 盐城百家乐官网的玩法技巧和规则 | 百家乐德州桌| 网上百家乐官网看牌器| 老k百家乐的玩法技巧和规则| 真人百家乐官网攻略| 大发888娱乐城官| 做生意佩戴什么纳财| 汝城县| 赌场百家乐的玩法技巧和规则 | 康莱德百家乐官网的玩法技巧和规则 | 澳门网络游戏| 百家乐赌博机有鬼吗| 亚洲皇冠| 巴黎人百家乐的玩法技巧和规则 | 百家乐官网赌场合作| bet365合作计划|