QC

GSM Module Interfacing with 8051 Microcontroller

 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).


Đầu tiên chúng ta cần kết nối LCD với 8051, bạn có thể tìm hiểu điều này từ đây: Giao diện LCD với Vi điều khiển 8051. Sau đó, chúng ta cần kết nối mô-đun GSM với 8051, bây giờ ở đây chúng ta nên chú ý một số điều. Trước tiên, bạn cần kiểm tra xem mô-đun GSM của bạn có khả năng hoạt động ở logic TTL hay chỉ có thể hoạt động với RS232. Về cơ bản nếu mô-đun của bạn có các Ghim RX và TX (với GND) trên bo mạch thì nó có thể hoạt động trên logic TTL. Và nếu nó không có bất kỳ chân RX, TX nào và chỉ có cổng RS232 (cổng nối tiếp với 9) thì bạn cần sử dụng IC MAX232 để kết nối cổng nối tiếp với bộ vi điều khiển. Về cơ bản MAX232 dùng để chuyển dữ liệu nối tiếp thành logic TTL vì Vi điều khiển chỉ có thể hoạt động trên logic TTL. Nhưng nếu mô-đun GSM có chân RX, TX thì bạn không cần sử dụng MAX232 hoặc bất kỳ bộ chuyển đổi nối tiếp nào, bạn có thể kết nối trực tiếp RX của GSM với TX (PIN 11) của 8051 và TX của GSM với RX (PIN 10) của 8051 Trong trường hợp của chúng tôi, tôi đã sử dụng mô-đun SIM900A và nó có chân RX, TX nên tôi chưa sử dụng MAX232.



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;                                            
    }
}
 











Nap Code vào PY32F003 dùng Stlink

 Nap Code vào PY32F003 dùng Stlink Bước 1: Cài đặt  KeilC v5.39 theo link sau ( chú ý 5.39 keil c mới nạp ok). https://edge07.111.ir.cdn.ir/...