GSM Module Interfacing with 8051 Microcontroller
Mô-đun GSM được sử dụng trong nhiều thiết bị truyền thông dựa trên công nghệ GSM (Hệ thống toàn cầu cho truyền thông di động). Nó được sử dụng để tương tác với mạng GSM bằng máy tính. Mô-đun GSM chỉ hiểu các lệnh AT và có thể đáp ứng tương ứng. Lệnh cơ bản nhất là “AT”, nếu GSM phản hồi OK thì nó hoạt động tốt, ngược lại nó phản hồi với “ERROR”. Có nhiều lệnh AT khác nhau như ATA để trả lời cuộc gọi, ATD để quay số cuộc gọi, AT + CMGR để đọc tin nhắn, AT + CMGS để gửi tin nhắn, v.v. Các lệnh AT phải được theo sau bởi Carriage return tức là \ r (0D trong hex ), như “AT + CMGS \ r”. Chúng ta có thể sử dụng mô-đun GSM bằng các lệnh này.
GSM Interfacing with 8051
Thay vì sử dụng PC, chúng ta có thể sử dụng vi điều khiển để tương tác với mô-đun GSM và màn hình LCD để nhận phản hồi từ mô-đun GSM. Vì vậy, chúng ta sẽ giao tiếp GSM với vi điều khiển 8051 (AT89S52). Rất dễ dàng giao tiếp GSM với 8051, chúng tôi chỉ cần gửi lệnh AT từ bộ vi điều khiển và nhận phản hồi từ GSM và hiển thị nó trên màn hình LCD. Chúng tôi có thể sử dụng cổng nối tiếp của vi điều khiển để giao tiếp với GSM, nghĩa là sử dụng mã PIN 10 (RXD) và 11 (TXD).
Sơ đồ mạch cho giao tiếp GSM với vi điều khiển AT89S52 được trình bày trong hình trên. Bây giờ sau khi kết nối, chúng ta chỉ cần viết chương trình để gửi lệnh AT đến GSM và nhận phản hồi của nó trên LCD. Có nhiều lệnh AT như đã mô tả ở trên, nhưng phạm vi của bài viết này chỉ là giao tiếp GSM với 8051, vì vậy chúng ta chỉ gửi lệnh “AT” theo sau là “\ r” (0D trong hệ lục phân). Điều này sẽ cho chúng tôi một phản hồi “OK”. Nhưng bạn có thể mở rộng chương trình này để sử dụng tất cả các tiện ích của GSM.
Giải thích mã
Bên cạnh tất cả các chức năng liên quan đến LCD, ở đây chúng tôi đã sử dụng cổng Nối tiếp và thanh ghi chế độ hẹn giờ (TMOD). Bạn có thể tìm hiểu về các hàm LCD và các mã khác bằng cách xem qua phần dự án 8051 của chúng tôi, ở đây tôi giải thích về các hàm mã liên quan đến giao tiếp nối tiếp:
GSM_init() function:
Chức năng này được sử dụng để đặt Baudrate cho vi điều khiển. Tốc độ truyền không là gì ngoài Bits / giây được truyền hoặc nhận. Và chúng tôi cần phải khớp tốc độ truyền của 8051 với tốc độ truyền của mô-đun GSM tức là 9600. Chúng tôi đã sử dụng Bộ định thời 1 ở Chế độ 2 (chế độ tự động tải lại 8 bit) bằng cách đặt thanh ghi TMOD thành 0X20 và byte cao hơn của Bộ định thời 1 (TH1) thành 0XFD để có tốc độ truyền là 9600. Ngoài ra thanh ghi SCON được sử dụng để đặt chế độ giao tiếp nối tiếp, chúng tôi đã sử dụng Mode1 (8-bit UART) với tính năng nhận được kích hoạt.
GSM_write Function:
SBUF (thanh ghi chức năng đặc biệt của bộ đệm nối tiếp) được sử dụng cho giao tiếp nối tiếp, bất cứ khi nào chúng ta muốn gửi byte nào đến thiết bị nối tiếp chúng ta đưa byte đó vào thanh ghi SBUF, khi byte hoàn chỉnh đã được gửi đi thì bit TI được thiết lập bởi phần cứng. Chúng ta cần đặt lại nó để gửi byte tiếp theo. Đó là cờ cho biết byte đó đã được gửi thành công. TI là bit thứ hai của thanh ghi SCON. Chúng tôi đã gửi “AT” bằng cách sử dụng chức năng này.
GSM_read function:
Tương tự như gửi, bất cứ khi nào chúng ta nhận được bất kỳ byte nào từ thiết bị bên ngoài mà byte đó được đưa vào thanh ghi SBUF, chúng ta chỉ cần đọc nó. Và bất cứ khi nào nhận được byte hoàn chỉnh, bit RI được thiết lập bởi phần cứng. Chúng ta cần đặt lại nó để nhận byte tiếp theo. RI là bit đầu tiên của thanh ghi SCON. Chúng tôi đã đọc phản hồi “OK” bằng cách sử dụng chức năng này.
#include<reg52.h>
#define display_port P2 //Data pins connected to port 2 on microcontroller
sbit rs = P3^2; //RS pin connected to pin 2 of port 3
sbit rw = P3^3; // RW pin connected to pin 3 of port 3
sbit e = P3^4; //E pin connected to pin 4 of port 3
int k;
unsigned char str[26];
void GSM_init() // serial port initialization
{
TMOD=0x20; // Timer 1 selected, Mode 2(8-bit auto-reload mode)
TH1=0xfd; // 9600 baudrate
SCON=0x50; // Mode 1(8-bit UART), receiving enabled
TR1=1; // Start timer
}
void msdelay(unsigned int time) // Function for creating delay in milliseconds.
{
unsigned m,n ;
for(m=0;m<time;m++)
for(n=0;n<1275;n++);
}
void lcd_cmd(unsigned char command) //Function to send command instruction to LCD
{
display_port = command;
rs= 0;
rw=0;
e=1;
msdelay(1);
e=0;
}
void lcd_data(unsigned char disp_data) //Function to send display data to LCD
{
display_port = disp_data;
rs= 1;
rw=0;
e=1;
msdelay(1);
e=0;
}
void lcd_init() //Function to prepare the LCD and get it ready
{
lcd_cmd(0x38); // for using 2 lines and 5X7 matrix of LCD
msdelay(10);
lcd_cmd(0x0F); // turn display ON, cursor blinking
msdelay(10);
lcd_cmd(0x01); //clear screen
msdelay(10);
lcd_cmd(0x80); // bring cursor to beginning of first line
msdelay(10);
}
void lcd_string(unsigned char *str) // Function to display string on LCD
{
int i=0;
while(str[i]!='\0')
{
lcd_data(str[i]);
i++;
msdelay(10);
if(i==15) lcd_cmd(0xc2);
}
return;
}
void GSM_write(unsigned char ch) // Function to send commands to GSM
{
SBUF=ch; // Put byte in SBUF to send to GSM
while(TI==0); //wait until the byte trasmission
TI=0; //clear TI to send next byte.
}
void GSM_read() // Function to read the response from GSM
{
while(RI==0); // Wait until the byte received
str[k]=SBUF; //storing byte in str array
RI=0; //clear RI to receive next byte
}
void main()
{
k=0;
lcd_init();
GSM_init();
msdelay(200);
lcd_string("Interfacing GSM with 8051");
msdelay(200);
lcd_cmd(0x01); // Clear LCD screen
msdelay(10);
GSM_write('A'); // Sending 'A' to GSM module
lcd_data('A');
msdelay(1);
GSM_write('T'); // Sending 'T' to GSM module
lcd_data('T');
msdelay(1);
GSM_write(0x0d); // Sending carriage return to GSM module
msdelay(50);
while(1)
{
GSM_read();
if(str[k-1]=='O' && str[k]=='K'){
lcd_data(0x20); // Write 'Space'
lcd_data(str[k-1]);
lcd_data(str[k]);
break;
}
k=k+1;
}
}