51单片机通信模块(8051单片机实现与GSM通讯)

51单片机通信模块(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)。

51单片机通信模块(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。

51单片机通信模块(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; } }

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页