GSM模塊使用起來很有趣,特別是當(dāng)我們的項(xiàng)目需要遠(yuǎn)程訪問時。這些模塊可以執(zhí)行我們普通手機(jī)可以執(zhí)行的所有操作,例如撥打/接聽電話,發(fā)送/接收短信,使用GPRS連接到互聯(lián)網(wǎng)等。您還可以將普通麥克風(fēng)和揚(yáng)聲器連接到此模塊,并在移動通話中交談。如果它可以與微控制器連接,這將為許多創(chuàng)意項(xiàng)目打開大門。因此,在本教程中,我們將學(xué)習(xí)如何將GSM模塊(SIM900A)與AVR微控制器ATmega16連接,并通過使用GSM模塊發(fā)送和接收消息來演示它。
所需材料
阿特梅加16
GSM 模塊(SIM900 或任何其他)
液晶顯示屏
按鈕
10k 電阻器,電位計(jì)
連接線
12V 適配器
10 針 FRC 電纜
使用的軟件
我們將使用CodeVisionAVR軟件編寫代碼,并使用SinaProg軟件使用USBASP編程器將代碼上傳到Atmega16。
在進(jìn)入原理圖和代碼之前,我們了解GSM模塊及其工作原理。
GSM 模塊
即使沒有任何微控制器,也可以通過使用AT命令模式使用GSM模塊。如上所示,GSM模塊帶有USART適配器,可以使用MAX232模塊直接連接到計(jì)算機(jī),或者Tx和Rx引腳可用于將其連接到微控制器。您還可以注意到可以連接麥克風(fēng)或揚(yáng)聲器的其他引腳,如MIC +,MIC-,SP+,SP-等。該模塊可以通過普通的直流桶形插孔由 12V 適配器供電。
將SIM卡插入模塊插槽并打開電源,您應(yīng)該注意到電源指示燈亮起?,F(xiàn)在等待一分鐘左右,您應(yīng)該會看到紅色(或任何其他顏色)LED 每 3 秒閃爍一次。這意味著您的模塊能夠與您的SIM卡建立連接。現(xiàn)在,您可以繼續(xù)將模塊與手機(jī)或任何微控制器連接。
使用 AT 命令與 GSM 模塊通信
正如您可能已經(jīng)猜到的那樣,GSM模塊可以通過串行通信進(jìn)行通信,并且只能理解一種語言,即“AT命令”。無論您想告訴或詢問GSM模塊什么,都只能通過AT命令進(jìn)行。例如,如果您想知道模塊是否處于活動狀態(tài)。您應(yīng)該詢問(發(fā)送)像“AT”這樣的命令,您的模塊將回答“確定”。
這些AT命令在其數(shù)據(jù)手冊中有很好的解釋,可以在其官方數(shù)據(jù)手冊中找到。好!好!這是一份 271 頁的數(shù)據(jù)表,您可能需要幾天時間才能通讀它們。因此,我在下面給出了一些最重要的AT命令,以便您盡快啟動并運(yùn)行它。
在 | 回復(fù)“確定”進(jìn)行確認(rèn) |
AT+CPIN? | 檢查信號質(zhì)量 |
AT+COPS? | 查找服務(wù)提供商名稱 |
ATD96XXXXXXXX; | 撥打特定號碼,以分號結(jié)尾 |
AT+CNUM | 查找SIM卡的數(shù)量(可能不適用于某些SIM卡) |
ATA | 接聽來電 |
阿特 | 掛斷當(dāng)前來電 |
AT+COLP | 顯示來電號碼 |
AT+VTS=(數(shù)字) | 發(fā)送 DTMF 編號。您可以使用移動鍵盤上的任意數(shù)字(數(shù)字) |
AT+CMGR | AT+CMGR=1 在第一個位置讀取消息 |
AT+CMGD=1 | 刪除第一個位置的消息 |
AT+CMGDA=“DEL ALL” | 從SIM卡中刪除所有郵件 |
AT+CMGL=“ALL” | 讀取來自 SIM 卡的所有消息 |
AT+CMGF=1 | 設(shè)置短信配置。“1”表示純文本模式 |
AT+CMGS = “+91 968837XXXX” >電路摘要文本 |
在此處向特定號碼發(fā)送短信 968837XXXX。當(dāng)您看到“>”時,請開始輸入文本。按 Ctrl+Z 發(fā)送文本。 |
AT+CGATT? | 檢查SIM卡上的互聯(lián)網(wǎng)連接 |
AT+CIPSHUT | 關(guān)閉TCP連接,意味著斷開互聯(lián)網(wǎng) |
AT+CSTT = “APN”,“用戶名”,“通行證” | 使用您的 APN 和通行密鑰連接到 GPRS??梢詮?a href="http://www.wenjunhu.com/v/tag/1722/" target="_blank">網(wǎng)絡(luò)提供商處獲得。 |
AT+CIICR | 檢查SIM卡是否有數(shù)據(jù)包 |
AT+CIFSR | 獲取 SIM 卡網(wǎng)絡(luò)的 IP |
AT+CIPSTART = “TCP”,“服務(wù)器 IP”,“端口” | 用于設(shè)置 TCP IP 連接 |
AT+CIPSEND | 此命令用于將數(shù)據(jù)發(fā)送到服務(wù)器 |
在這里,我們將使用 AT+CMGF 和 AT+CMGS命令來發(fā)送消息。
如果您已將GSM模塊與Arduino一起使用,則在接收消息時可以使用+ CMT:命令在串行監(jiān)視器上查看手機(jī)號碼和短信。短信出現(xiàn)在第二行,如圖所示。
我們將掃描此 +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 創(chuàng)建項(xiàng)目
安裝CodeVisionAVR和SinaProg軟件后,請按照以下步驟創(chuàng)建項(xiàng)目并編寫代碼:
已上傳
第 1 步。打開 CodeVision 單擊“文件 -> 新建”-> 項(xiàng)目。將出現(xiàn)確認(rèn)對話框。點(diǎn)擊是
第 2 步。代碼向?qū)⒋蜷_。單擊第一個選項(xiàng),即 AT90,然后單擊確定。
第 3 步:-選擇您的微控制器芯片,在這里我們將采用Atmega16L,如圖所示。
第 4 步:-點(diǎn)擊 USART。選擇 接收器 和 發(fā)射器 通過單擊它。如下圖所示:
第 5 步:-單擊字母數(shù)字 LCD,然后選擇啟用字母數(shù)字 LCD 支持。
第 6 步:-單擊程序 - >生成,保存并退出?,F(xiàn)在,我們一半以上的工作已經(jīng)完成
第 7 步:-在桌面上創(chuàng)建一個新文件夾,以便我們的文件保留在文件夾中,否則我們將分散在整個桌面窗口中。根據(jù)需要命名您的文件夾,我建議使用相同的名稱來保存程序文件。
我們將有一個接一個的三個對話框來保存文件。
對保存第一個對話框后將出現(xiàn)的其他兩個對話框執(zhí)行相同的操作。
現(xiàn)在,您的工作區(qū)如下所示。
我們的大部分工作都是在向?qū)У膸椭峦瓿傻摹,F(xiàn)在,我們只需要為 GSM 編寫代碼。
代碼和說明
創(chuàng)建項(xiàng)目后,所有頭文件都會自動附加,您只需包含 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"};
創(chuàng)建一個函數(shù)以從 UDR 寄存器接收數(shù)據(jù)。此函數(shù)將返回接收到的數(shù)據(jù)。
unsigned char received_value(void)
{
while(!(UCSRA&(1<
{
received_data=UDR;
return received_data;
}
}
來到while循環(huán),在其中我們創(chuàng)建兩個if語句,一個用于發(fā)送消息,另一個用于接收。發(fā)送按鈕與 ATmega 的 PIND6 連接,接收消息按鈕與 PIND5 連接。
當(dāng)首先按下 PIND6(發(fā)送按鈕)時,如果語句將執(zhí)行,并且所有發(fā)送消息的命令將逐個執(zhí)行。
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!='+') 循環(huán)將檢查 CMT 命令是否存在。如果存在,第二個while循環(huán)將執(zhí)行并轉(zhuǎn)到命令的第二行,并在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 ();
…
..
此循環(huán)將程序帶到第二行命令并將消息存儲在數(shù)組中。
while (b!=0x0a)
{
b= received_value ();
}
for(b=0;b<3;b++) ? {
c=received_value();
msg[b]=c;
}
..
..
此 for 循環(huán)用于在 LCD 上顯示消息。
for(z=0;z<3;z++)
{
a=msg[z];
lcd_putchar(a); // PRINT IN lcd
delay_ms(10);
}
下面給出了帶有演示視頻的完整代碼,現(xiàn)在我們必須構(gòu)建我們的項(xiàng)目。
構(gòu)建項(xiàng)目
單擊“構(gòu)建項(xiàng)目”圖標(biāo),如下所示。
生成項(xiàng)目后,將在調(diào)試> Exe文件夾中生成一個十六進(jìn)制文件,該文件可以在您之前為保存項(xiàng)目而創(chuàng)建的文件夾中找到。我們將使用此十六進(jìn)制文件通過Sinaprog軟件上傳到Atmega16中。
將代碼上傳到Atmega16
根據(jù)給定的圖表連接電路以編程Atmega16。將FRC電纜的一端連接到USBASP編程器,另一端將連接到微控制器的SPI引腳,如下所述:
FRC 母連接器引腳 1 -> 引腳 6,Atmega16 的 MOSI
引腳 2 連接到 atmega16 的 Vcc,即引腳 10
引腳 5 連接到 atmega16 的復(fù)位,即引腳 9
引腳 7 連接到 atmega16 的 SCK,即引腳 8
引腳 9 連接到 atmega16 的 MISO,即引腳 7
引腳 8 連接到 atmega16 的 GND,即引腳 11
我們將使用 Sinaprog 上傳上面生成的十六進(jìn)制文件,因此打開它并從設(shè)備下拉菜單中選擇 Atmega16。從調(diào)試> Exe 文件夾中選擇十六進(jìn)制文件,如下所示。
現(xiàn)在,單擊程序,您的代碼將在ATmega16微控制器中刻錄。
您已完成,您的微控制器已編程。只需按下按鈕即可從GSM和ATmega16微控制器發(fā)送和接收消息。
#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
+關(guān)注
關(guān)注
5文章
154瀏覽量
45840 -
GSM
+關(guān)注
關(guān)注
9文章
835瀏覽量
122934 -
SIM900A
+關(guān)注
關(guān)注
3文章
54瀏覽量
35276
發(fā)布評論請先 登錄
相關(guān)推薦
評論