8051单片机实现与GSM通讯

8051单片机实现与GSM通讯_第1张图片

GSM模块用于许多基于GSM(全球移动通信系统)技术的通信设备。它用于使用计算机与 GSM 网络进行交互。GSM 模块只理解AT 指令,并能做出相应的响应。最基本的命令是“AT”,如果 GSM 响应 OK,那么它工作正常,否则它响应“ERROR”。AT 指令有很多种,例如 ATA 接听电话,ATD 拨打电话,AT+CMGR 读取信息,AT+CMGS 发送短信等。AT 指令后面应该有回车,即 \r(十六进制的 0D ),如“AT+CMGS\r”。我们可以使用这些命令来使用 GSM 模块。

GSM 与 8051 接口

我们可以不使用 PC,而是使用单片机与 GSM 模块进行交互,在LCD上显示 GSM 模块的响应。因此,我们将GSM 与 单片机(AT89S52) 连接。

GSM 与 8051 的连接非常简单,我们只需要从单片机发送 AT 命令并接收来自 GSM 的响应并显示在 LCD 上。我们可以使用单片机的串口与 GSM 通信,即使用 PIN 10(RXD)和 11(TXD)。

8051单片机实现与GSM通讯_第2张图片

首先,我们需要将 LCD 连接到单片机,然后我们需要将GSM模块连接单片机。现在我们需要注意一下。首先,您需要检查您的 GSM 模块是否能够在 TTL 逻辑下工作,或者它只能与 RS232 一起工作。基本上,如果您的模块板上有 RX 和 TX(带 GND)引脚,那么它可以在 TTL 逻辑上工作。如果它没有任何RX,TX引脚并且只有一个RS232端口(9针的串行端口),那么您需要使用MAX232 IC将串行端口连接到微控制器。基本上MAX232用于将串行数据转换为 TTL 逻辑,因为微控制器只能在 TTL 逻辑上工作。但如果GSM模块有RX、TX引脚,则不需要使用MAX232或任何串口转换器,可以直接将GSM的RX连接到8051的TX(PIN 11),将GSM的TX连接到8051的RX(PIN 10) 。在我们的例子中,使用了 SIM900A 模块,它有 RX、TX 引脚,所以我没有使用 MAX232。

8051单片机实现与GSM通讯_第3张图片

GSM 与 AT89S52单片机连接的电路图如上图所示。连接后,我们只需要编写程序将 AT 命令发送到 GSM 并在 LCD 上接收其响应。如上所述,AT 命令有很多,但本文的范围只是测试GSM 与 8051 连接,因此我们将发送命令“AT”,后跟“\r”(十六进制的 0D)。这会给我们一个“OK”的响应。但是您可以以此扩展此程序以使用 GSM 的其他功能。

代码说明

除了所有与 LCD 相关的功能外,这里我们还使用了串行端口和定时器模式寄存器 (TMOD)。关于这部分的知识不讨论,这里只解释串行通信相关的功能:

GSM_init() 函数:

void GSM_init() // 串口初始化
{

    TMOD=0x20; // 定时器1,模式2(8位自动装载)
    TH1=0xfd; // 9600 波特率
    SCON=0x50; //模式 1(8 位 UART),接收使能
    TR1=1; //启定时器
}

此功能用于设置单片机的波特率。波特率是传输或接收的速度“比特/秒”。需要将8051的波特率与GSM模块(即9600)的波特率相匹配。

我们使用定时器1,模式2(8位自动重新加载模式),

将TMOD寄存器设置为0X20,将定时器1的高位(TH1)设置为0XFD,以获得9600的波特率。

此外,SCON寄存器设置串行通信模式, Mode1(8位UART)启用接收模式。

GSM_write 函数:

void GSM_write(unsigned char ch) // 向 GSM 发送命令的函数
{
    SBUF=ch; // 将字节放入 SBUF 以发送到 GSM
    while(TI==0); //等到字节传输
    TI=0; //清除 TI 以发送下一个字节。
}

SBUF(串行缓冲区特殊功能寄存器)用于串行通信,每当我们想向串行设备发送任何字节时,我们将该字节放入 SBUF 寄存器中,当发送完完整字节后,TI 由硬件置1。这是一个标志,表示字节已成功发送。发送前需要我们清零TI。TI 是 SCON 寄存器的第二位。我们使用此函数发送“AT”。

GSM_read 函数:

void GSM_read() // 从 GSM 读取响应的函数
{
    while(RI==0); // 等到收到字节
    str[k]=SBUF; //将字节存储在str数组中
    RI=0; //清除RI以接收下一个字节
}

与发送一样,每当我们从外部设备接收到任何字节,该字节被放入 SBUF 寄存器中,我们只需要读取它。并且每当接收到完整的字节时,RI由硬件都置1。我们读取数据之后需要清零它以接收下一个字节。RI 是 SCON 寄存器的第一位。我们使用此函数读取响应“OK”。

//主函数
void main()
{
    k=0;
    lcd_init();
    GSM_init();
    msdelay(200);
    lcd_string("Interfacing GSM with 8051");
    msdelay(200);
    lcd_cmd(0x01); //清屏
    msdelay(10);
    GSM_write('A'); //发送 'A' 到 GSM 模块
    lcd_data('A');
    msdelay(1);
    GSM_write('T'); //发送 'T' 到 GSM 模块
    lcd_data('T');
    msdelay(1);
    GSM_write(0x0d); //发送回车到GSM模块
    msdelay(50);
    while(1)
    {        
        GSM_read();
        if(str[k-1]=='O' && str[k]=='K'){
            lcd_data(0x20); // 空格
            lcd_data(str[k-1]);
            lcd_data(str[k]);
            break;
        }
        k=k+1;
    }
}

你可能感兴趣的:(单片机,51单片机,网络)