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

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

点击链接下载资料: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模块保证数据的非易失性存储。

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

相关推荐
小陈工25 分钟前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
科技小花5 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸5 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain5 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希6 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神6 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员6 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java6 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿6 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴6 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存