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瀏覽量
45890 -
GSM
+關注
關注
9文章
835瀏覽量
123026 -
SIM900A
+關注
關注
3文章
54瀏覽量
35313
發布評論請先 登錄
相關推薦
評論