基于单片机的双机串口通信与数字串存储系统设计

基于单片机的双机串口通信与数字串存储系统设计

点击链接下载资料:https://download.csdn.net/download/m0_51061483/92081494


1. 系统功能介绍

本系统设计旨在实现基于单片机的双机串口通信与数字串存储功能,由两个独立的单片机系统(A端与B端)组成。A端主要负责数字串的输入与发送,B端负责接收、校验、显示及存储。系统的整体功能涵盖了人机交互、串口通信、数据校验与非易失性存储等多个方面,体现了单片机系统在通信与数据管理中的综合应用能力。

系统的主要功能如下:

  1. 数字串输入与发送(A端)

    用户通过拨号键盘输入一串数字(2~16位),输入过程在LCD屏上实时显示。

    • 按键 * 用于删除上一个输入的数字。
    • 按键 # 用于启动数据发送。
      当按下 # 后,A端通过串口发送完整数字串到B端。
  2. 数据接收与校验(B端)

    B端通过串口实时监听A端发送的数据,当接收到完整的数字串后,系统会进行校验计算

    校验规则为:最后一位数字应等于前面所有数字之和的个位数。

    • 若校验通过,LCD屏显示接收到的数字串;
    • 若校验不通过,则自动清空LCD显示,并丢弃该数据。
  3. 数据存储与查看(B端)

    • 按键 1:将当前校验通过的数字串存入AT24C02存储器中,并显示"存储成功";
    • 按键 2:从AT24C02中读取所有已存储的数据串并在LCD上循环显示;
    • 按键 3:清除EEPROM中所有存储的数据并提示"数据清除完成"。
  4. 系统交互性与可靠性

    整个系统通过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) 主程序逻辑

主程序流程为:

  1. 系统初始化(LCD、键盘、串口等);
  2. 等待用户按键输入;
  3. 实时显示输入数字;
  4. 当按下 # 键时,触发发送函数;
  5. 通过串口逐字节发送数字串。

核心代码如下:

复制代码
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模块保证数据的非易失性存储。

该设计不仅适用于单片机通信与存储实验教学,也可扩展应用于数据传输、身份校验、远程终端输入系统等领域,具有良好的应用前景与学习价值。

相关推荐
数据库知识分享者小北3 小时前
AI Agent越用越笨?阿里云AnalyticDB「AI上下文工程」一招破解!
数据库
一匹电信狗4 小时前
【MySQL】数据库表的操作
linux·运维·服务器·数据库·mysql·ubuntu·小程序
api_180079054604 小时前
性能优化揭秘:将淘宝商品 API 响应时间从 500ms 优化到 50ms 的技术实践
大数据·数据库·性能优化·数据挖掘
白衣鸽子4 小时前
MySQL 时间类型深度解析:精度、时区陷阱与版本兼容
数据库·后端·mysql
冲上云霄的Jayden4 小时前
MySQL InnoDB 状态(SHOW ENGINE INNODB STATUS)深度分析与性能优化建议
数据库·mysql·性能优化·innodb
三佛科技-134163842125 小时前
智能窗帘方案开发,基于国产单片机电动窗帘方案设计
单片机·嵌入式硬件·智能家居·pcb工艺
元闰子5 小时前
怎么让程序更高效地连起来?
数据库·redis·mysql
洲覆5 小时前
Redis 内存淘汰策略
开发语言·数据库·redis·缓存
胖头鱼的鱼缸(尹海文)6 小时前
数据库管理-第376期 Oracle AI DB 23.26新特性一览(20251016)
数据库·人工智能·oracle