基于单片机的双机串口通信与数字串存储系统设计
点击链接下载资料:https://download.csdn.net/download/m0_51061483/92081494
1. 系统功能介绍
本系统设计旨在实现基于单片机的双机串口通信与数字串存储功能,由两个独立的单片机系统(A端与B端)组成。A端主要负责数字串的输入与发送,B端负责接收、校验、显示及存储。系统的整体功能涵盖了人机交互、串口通信、数据校验与非易失性存储等多个方面,体现了单片机系统在通信与数据管理中的综合应用能力。
系统的主要功能如下:
-
数字串输入与发送(A端)
用户通过拨号键盘输入一串数字(2~16位),输入过程在LCD屏上实时显示。
- 按键
*
用于删除上一个输入的数字。 - 按键
#
用于启动数据发送。
当按下#
后,A端通过串口发送完整数字串到B端。
- 按键
-
数据接收与校验(B端)
B端通过串口实时监听A端发送的数据,当接收到完整的数字串后,系统会进行校验计算 。
校验规则为:最后一位数字应等于前面所有数字之和的个位数。
- 若校验通过,LCD屏显示接收到的数字串;
- 若校验不通过,则自动清空LCD显示,并丢弃该数据。
-
数据存储与查看(B端)
- 按键
1
:将当前校验通过的数字串存入AT24C02存储器中,并显示"存储成功"; - 按键
2
:从AT24C02中读取所有已存储的数据串并在LCD上循环显示; - 按键
3
:清除EEPROM中所有存储的数据并提示"数据清除完成"。
- 按键
-
系统交互性与可靠性
整个系统通过LCD1602实现清晰的界面交互,采用标准的UART串口通信协议,确保A、B两机之间的数据传输准确可靠。B端使用EEPROM非易失存储器保证断电后数据依然保留,提升系统的实用性与稳定性。
2. 系统电路设计
系统电路设计以STC89C52单片机为核心,分为输入端(A机)与接收端(B机)两部分。主要包括:单片机最小系统电路、键盘输入模块、LCD1602显示模块、串口通信模块、EEPROM存储模块及电源模块。
2.1 单片机最小系统设计
系统的核心控制器采用 STC89C52 单片机 ,具有丰富的I/O接口和UART通信模块。
最小系统包括:晶振电路、复位电路和电源滤波部分。
- 晶振采用12MHz晶体振荡器,确保系统运行稳定;
- 复位电路由电容与电阻构成上电复位电路,保证系统启动可靠;
- 电源采用+5V直流稳压供电,由7805稳压芯片提供稳定电压。
A机与B机各自独立供电,确保通信过程不受干扰。
2.2 键盘输入模块
A端的键盘采用 4×4矩阵键盘 ,通过8个I/O口实现扫描输入。
键盘布局如下:
键位 | 功能 |
---|---|
0~9 | 数字输入 |
* | 删除上一个数字 |
# | 发送数字串 |
A/B/C/D | 预留扩展功能键 |
矩阵键盘的行列扫描由单片机周期性输出信号完成,通过检测列线的电平变化判断按键状态。软件中采用去抖动算法,避免误触发。
2.3 LCD1602 显示模块
LCD1602模块用于显示系统状态、输入数字串和提示信息。
- 在A端显示输入的数字和发送状态;
- 在B端显示接收到的数字串、存储状态或错误提示。
LCD1602通过4位数据线模式 与单片机连接,以节省I/O资源。
主要显示内容包括:
- 当前输入/接收的数字串;
- "发送中..."、"接收成功"、"校验失败"提示;
- 存储、读取、清除状态信息。
2.4 串口通信模块
A端与B端之间通过UART异步串口通信实现数据传输。通信参数如下:
- 波特率:9600bps;
- 数据位:8位;
- 停止位:1位;
- 校验位:无。
物理层可采用TTL电平直连,也可通过MAX232芯片进行RS232电平转换以适应外部通信环境。
系统中采用定时器方式产生标准波特率,保证通信精度。通信中使用中断机制实现非阻塞式数据接收。
2.5 AT24C02 存储模块
AT24C02是一款容量为2Kb的I²C接口EEPROM,用于B端存储接收的数字串。
其优点包括:
- 非易失性存储,断电数据不丢失;
- 支持多字节连续写入;
- 可靠的擦写寿命(>100万次)。
通过SDA、SCL两根总线与单片机通信。系统通过编程实现写入、读取及清空操作。
2.6 电源模块
系统统一使用+5V电源供电。通过7805稳压芯片将外部直流9V或12V转换为稳定的5V。
在各模块供电端添加退耦电容(如100nF)以减少干扰,保障系统运行稳定。
3. 系统程序设计
系统程序包括主控程序、键盘输入程序、LCD显示程序、串口通信程序及EEPROM存储管理程序等部分。
A端与B端分别拥有独立的软件逻辑,整体结构清晰、模块划分明确。
3.1 A端程序设计
A端主要实现数字串输入、显示与发送功能。
(1) 主程序逻辑
主程序流程为:
- 系统初始化(LCD、键盘、串口等);
- 等待用户按键输入;
- 实时显示输入数字;
- 当按下
#
键时,触发发送函数; - 通过串口逐字节发送数字串。
核心代码如下:
void main() {
UART_Init();
LCD_Init();
Key_Init();
LCD_ShowString(0,0,"Input Num:");
while(1) {
key = Key_Scan();
if(key >= '0' && key <= '9') {
Add_Num(key);
LCD_ShowString(1,0,numberBuffer);
}
else if(key == '*') {
Delete_Num();
LCD_ShowString(1,0,numberBuffer);
}
else if(key == '#') {
UART_SendString(numberBuffer);
LCD_ShowString(1,0,"Sending...");
}
}
}
(2) 键盘扫描程序
键盘采用行列扫描方式,通过定时扫描和延时消抖处理。
unsigned char Key_Scan(void) {
unsigned char temp;
P1 = 0x0F;
if((P1 & 0x0F) != 0x0F) {
Delay_ms(10);
if((P1 & 0x0F) != 0x0F) {
temp = P1;
while((P1 & 0x0F) != 0x0F);
return DecodeKey(temp);
}
}
return 0;
}
(3) 串口发送函数
采用中断发送机制,提高效率与可靠性。
void UART_SendString(char *str) {
while(*str != '\0') {
SBUF = *str++;
while(!TI);
TI = 0;
}
}
3.2 B端程序设计
B端程序主要实现接收、校验、显示及存储管理。
(1) 串口接收与校验逻辑
系统通过串口中断方式接收A端数据,并在接收完成后进行校验。
校验规则:最后一位数字 = 前面所有数字之和的个位数。
void UART_Rx_ISR(void) interrupt 4 {
if(RI) {
char ch = SBUF;
RI = 0;
if(ch == '#') {
Check_Data();
} else {
buffer[index++] = ch;
}
}
}
校验函数:
void Check_Data(void) {
unsigned char sum = 0;
for(i=0;i<index-1;i++) sum += buffer[i]-'0';
if((sum%10) == (buffer[index-1]-'0')) {
LCD_ShowString(1,0,buffer);
validFlag = 1;
} else {
LCD_Clear();
LCD_ShowString(0,0,"Check Failed!");
validFlag = 0;
}
}
(2) EEPROM存储程序
通过I²C总线控制AT24C02的读写操作。
写入函数:
void EEPROM_Write(unsigned char addr, unsigned char dat) {
I2C_Start();
I2C_SendByte(0xA0);
I2C_SendByte(addr);
I2C_SendByte(dat);
I2C_Stop();
Delay_ms(10);
}
读取函数:
unsigned char EEPROM_Read(unsigned char addr) {
unsigned char dat;
I2C_Start();
I2C_SendByte(0xA0);
I2C_SendByte(addr);
I2C_Start();
I2C_SendByte(0xA1);
dat = I2C_ReceiveByte();
I2C_Stop();
return dat;
}
(3) 按键控制逻辑
B端设有三个功能按键:
-
按键1:存储当前数据;
-
按键2:读取显示;
-
按键3:清空数据。
void Key_Process() {
key = Key_Scan();
if(key == 1 && validFlag) Save_Data();
else if(key == 2) Show_StoredData();
else if(key == 3) Clear_All();
}
3.3 LCD 显示程序
LCD显示模块用于输出系统提示及操作结果:
void LCD_ShowString(unsigned char line, unsigned char pos, unsigned char *str) {
if(line == 0) LCD_SetCursor(0x80 + pos);
else LCD_SetCursor(0xC0 + pos);
while(*str) {
LCD_WriteData(*str++);
}
}
系统中通过调用不同的显示函数,实现状态提示与用户交互。
4. 系统总结
本系统实现了基于单片机的双机串口通信与数字串存储管理功能 ,具备输入、校验、存储、显示等多种功能模块。
系统采用模块化设计思想,软件结构清晰、可维护性强。
A、B两机的功能分工合理,A机注重人机交互,B机负责数据安全与存储。
通过UART串口实现了稳定可靠的通信机制,EEPROM模块保证数据的非易失性存储。
该设计不仅适用于单片机通信与存储实验教学,也可扩展应用于数据传输、身份校验、远程终端输入系统等领域,具有良好的应用前景与学习价值。