在STC89C52单片机上实现串口通信,需全面考虑硬件连接与软件编程细节。
下面从硬件连接原理、软件编程中的各功能模块、寄存器配置等方面进行详细阐述。
硬件连接
STC89C52自带一个UART用于串口通信,由于其输出的是TTL电平,而计算机串口通常是RS - 232电平,两者电气特性不同,所以需要一个MAX232芯片来实现电平转换。具体连接方式如下:
TXD连接:STC89C52的TXD(P3.1)引脚负责发送数据,连接到MAX232的T1IN引脚。MAX232会将TTL电平的发送数据转换为RS - 232电平,以便传输到计算机串口的接收端。RXD连接:STC89C52的RXD(P3.0)引脚用于接收数据,连接到MAX232的R1OUT引脚。MAX232会把从计算机串口接收的RS - 232电平数据转换为TTL电平,供单片机接收。
计算机串口连接:MAX232的T1OUT引脚连接到计算机串口的RXD引脚,将转换后的RS - 232电平发送数据传输给计算机;MAX232的R1IN引脚连接到计算机串口的TXD引脚,接收计算机发送的RS - 232电平数据。
外围电路:MAX232需要连接电源,通常使用 +5V电源。还需连接一些电容,一般会在VCC和GND之间连接0.1μF的去耦电容,以减少电源噪声。另外,C1、C2、C3、C4通常选用1μF的电解电容与0.1μF的陶瓷电容并联,用于配合MAX232内部的电荷泵工作,实现电平转换。
软件编程
软件部分使用C语言对串口通信的相关寄存器进行配置,实现数据的发送和接收。下面是详细代码及解释:
#include <reg52.h>
// 定义串口接收和发送缓冲区
unsigned char receive_buffer;
unsigned char send_buffer[] = "Hello, Serial Communication!\n";
// 串口初始化函数
void UART_Init(void) {
// 设置波特率为9600,晶振为11.0592MHz
SCON = 0x50; // 设置为工作方式1,允许接收
// SCON是串口控制寄存器,D7位SM0和D6位SM1组合设置工作方式,0x50表示SM0=0,SM1=1,即工作方式1,D4位REN=1允许接收
TMOD = 0x20; // 设置定时器1为工作方式2,自动重装
// TMOD是定时器/计数器方式控制寄存器,高4位控制定时器1,0x20表示GATE=0,C/T'=0,M1=1,M0=0,即工作方式2,自动重装初值
TH1 = 0xFD; // 波特率9600的初值,晶振11.0592MHz
// 定时器1工作在方式2时,TH1为自动重装值,根据波特率计算公式可得9600波特率对应的初值为0xFD
TL1 = 0xFD;
// TL1为定时器1的计数初值,与TH1相同
TR1 = 1; // 启动定时器1
// TR1是定时器1的运行控制位,置1启动定时器1
EA = 1; // 开总中断
// EA是总中断允许位,置1允许CPU响应中断
ES = 1; // 开串口中断
// ES是串口中断允许位,置1允许串口中断
}
// 串口发送一个字符的函数
void UART_SendByte(unsigned char byte) {
SBUF = byte;
// SBUF是串口数据缓冲寄存器,将待发送的字节数据写入SBUF,启动发送
while (TI == 0); // 等待发送完成
// TI是发送中断标志位,当一帧数据发送完成后,硬件自动置1,通过循环等待其置1
TI = 0; // 清除发送完成标志
// 手动将TI清0,以便下一次发送
}
// 串口发送字符串的函数
void UART_SendString(unsigned char *str) {
while (*str!= '\0') {
UART_SendByte(*str++);
}
// 遍历字符串,逐个字符调用UART_SendByte函数发送,直到遇到字符串结束符'\0'
}
// 串口中断服务函数
void UART_ISR(void) interrupt 4 {
if (RI) { // 接收中断标志
receive_buffer = SBUF; // 读取接收到的数据
// 当接收到一帧数据时,硬件自动将RI置1,从SBUF读取接收到的数据存入receive_buffer
RI = 0; // 清除接收中断标志
// 手动将RI清0,以便下一次接收
// 这里可以添加对接收到数据的处理代码
UART_SendByte(receive_buffer); // 回显接收到的数据
// 调用UART_SendByte函数将接收到的数据回显
}
}
void main(void) {
UART_Init(); // 初始化串口
UART_SendString(send_buffer); // 发送欢迎信息
while (1) {
// 主循环可以添加其他任务
}
}
代码说明
UART_Init函数:配置串口工作方式、定时器1工作方式、波特率初值,并开启总中断和串口中断。通过对SCON、TMOD等寄存器的设置,使串口和定时器1处于合适的工作状态,为串口通信做好准备。
UART_SendByte函数:负责向串口发送一个字节的数据,通过SBUF寄存器写入数据启动发送,并等待发送完成标志TI置1后,清除标志为下一次发送做准备。
UART_SendString函数:通过循环调用UART_SendByte函数,实现字符串的逐字符发送。
UART_ISR函数:串口中断服务函数,当接收到数据时,中断触发,读取接收到的数据并存入缓冲区,清除接收中断标志,还可以在其中添加对接收数据的处理逻辑,示例中是简单的回显操作。
main函数:程序入口,先调用UART_Init函数初始化串口,再发送欢迎信息,之后进入主循环,可在主循环中添加其他功能代码。
相关电路连接方式:
STC89C52单片机部分:
电源引脚:VCC接 +5V电源,GND接地。
晶振电路:XTAL1和XTAL2引脚之间连接一个11.0592MHz的晶振,并且在XTAL1和GND、XTAL2和GND之间分别连接一个30pF左右的电容(常见取值为22pF到33pF),构成晶振振荡电路,为单片机提供时钟信号。
复位电路:RST引脚通过一个10kΩ左右的电阻连接到 +5V电源,同时通过一个10μF的电解电容接地,形成上电复位电路。此外,还可以并联一个按键开关,当按下按键时,将RST引脚拉低,实现手动复位。
串口引脚:TXD(P3.1)引脚连接到MAX232芯片的T1IN引脚,用于发送数据;RXD(P3.0)引脚连接到MAX232芯片的R1OUT引脚,用于接收数据。
MAX232芯片部分:
电源引脚:VCC接 +5V电源,GND接地。
电容连接:在VCC和GND之间连接一个0.1μF的陶瓷电容用于去耦。此外,通常还需要连接4个电容(C1、C2、C3、C4),一般取值为1μF的电解电容与0.1μF的陶瓷电容并联,具体连接方式如下:
C1的正极连接VCC,负极连接CAP+引脚。
C2的正极连接CAP+引脚,负极连接CAP-引脚。
C3的正极连接CAP-引脚,负极连接GND。
C4的正极连接VCC,负极连接V-引脚。
串口连接引脚:T1IN引脚连接STC89C52单片机的TXD引脚;T1OUT引脚连接计算机串口(DB9接口)的RXD引脚(通常为第2引脚);R1IN引脚连接计算机串口的TXD引脚(通常为第3引脚);R1OUT引脚连接STC89C52单片机的RXD引脚。
计算机串口(DB9接口)部分:
通常只需要连接第2引脚(RXD)、第3引脚(TXD)和第5引脚(GND)。RXD引脚连接MAX232的T1OUT引脚,TXD引脚连接MAX232的R1IN引脚,GND引脚连接电路的公共地。
按照上述连接方式,你就可以使用电路设计软件绘制出STC89C52单片机实现串口通信的电路图了。在绘制过程中,注意元件的封装和引脚编号要与实际使用的元件一致,以确保电路的正确性和可实现性。