基于单片机的智能收银机模拟系统设计

1. 系统功能概述

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

本设计题目为基于单片机的智能收银机模拟系统设计,该系统主要通过单片机对数码管、按键输入及基本算术运算的综合控制,实现对商品价格与数量的输入、自动计算单笔金额及多笔累计金额的全过程模拟。系统能够模拟现实商场或超市中收银机的核心功能,具有良好的交互性和可扩展性。

本系统设计目标是:通过简单、直观的按键操作实现商品价格与数量输入、乘法运算、金额累计以及结果显示等收银流程,并利用多位数码管实现金额与状态的实时显示,使用户可以清晰地掌握整个收银过程。

系统主要功能如下:

  1. 初始显示功能:系统上电后,最右侧数码管显示"0",其余数码管保持熄灭状态,提示设备处于待机状态。
  2. 商品单价输入:通过数字键输入商品单价。输入第一个数字时,最右数码管显示该数字,随后每输入一个新数字,前一个数字依次左移,新输入的数字显示在最右端。
  3. 数量输入功能:按下"×"键后,系统进入商品数量输入模式。此时单价显示熄灭,转为输入并显示数量。
  4. 金额计算与累加功能:按下"+"键后,系统自动执行单价与数量的乘法运算,得到当前商品的总金额,并将结果加入到累计总金额中,同时显示最新总额。
  5. 多笔商品处理功能:完成一笔商品计算后,可直接输入下一件商品的单价,系统自动清除当前显示并开始新一轮计算。
  6. 最终结算功能:按下"="键后,系统显示顾客本次购物的最终总金额,不再接受新的输入。
  7. 复位功能:按下"C"键后,系统清除所有数据,显示回到初始状态"0",准备接待下一位顾客。

本系统设计不仅能模拟收银机的基本工作过程,还可为学习单片机键盘扫描、数码管显示、数据存储与运算逻辑控制等知识的学生提供良好的实验平台。


2. 系统电路设计

系统以STC89C52单片机为核心控制器,通过扫描式键盘矩阵实现商品信息的输入,通过动态扫描控制八位数码管进行金额显示,同时配合蜂鸣器实现按键提示和状态反馈。系统整体设计思路简洁、逻辑清晰,具有较强的实用性与可扩展性。


2.1 主控单片机模块设计

本系统选用STC89C52单片机作为核心控制单元。该芯片内部集成了8KB Flash程序存储器、512B RAM、三个16位定时器/计数器以及32个I/O口,具备良好的控制性能和稳定性。

在本系统中,单片机主要完成以下任务:

  • 实现键盘扫描与按键识别;
  • 控制数码管动态显示;
  • 执行价格、数量及总金额的计算;
  • 管理程序流程逻辑与状态切换。

单片机的晶振电路采用12MHz晶振,通过RC复位电路确保系统上电后能稳定运行。


2.2 键盘输入模块设计

键盘采用4×4矩阵键盘结构,包含数字键(0~9)、运算键(×、+、=)、复位键(C)等。矩阵键盘通过P1口连接到单片机,每一行和每一列对应单片机的I/O引脚。

当按键按下时,单片机通过逐列扫描方式检测低电平信号,以判断当前按键的行列位置。通过查表法可快速确定按键值。

键盘功能定义如下:

键位 功能说明
0-9 输入数字
× 进入数量输入模式
计算并累加金额
显示最终金额
C 清零复位

按键电路配合上拉电阻设计,确保输入电平稳定,避免干扰误触。


2.3 显示模块设计

显示部分采用8位共阴极数码管,由单片机的P0口和P2口控制。

  • P0口输出段选信号(a~g及dp);
  • P2口输出位选信号,控制当前显示的位。

采用动态扫描显示方式,通过定时中断周期性切换显示位,实现所有数码管的连续刷新,从而在人眼视觉上形成稳定的多位显示。

显示内容分为三种状态:

  1. 单价输入显示;
  2. 数量输入显示;
  3. 累计金额显示。

当系统状态改变时,显示内容随之更新,确保用户操作的即时反馈。


2.4 运算与存储模块设计

系统内部定义了多个变量用于存储临时数据和累计结果:

  • unit_price:商品单价;
  • quantity:商品数量;
  • sum:当前金额;
  • total:累计金额;
  • mode_flag:状态标志位,区分当前输入状态(单价输入/数量输入/总额显示)。

所有计算均由单片机内部CPU执行,采用整数乘法实现金额计算,并通过BCD码转换实现数据显示。


2.5 蜂鸣器与复位模块设计

蜂鸣器用于按键确认与状态切换提示。每当按下有效键时,蜂鸣器响一声以增强人机交互体验。复位电路采用按键复位方式,确保收银流程结束后可快速返回初始状态。


3. 系统程序设计

系统程序采用模块化结构,包括主程序、键盘扫描子程序、显示子程序、运算逻辑子程序和状态控制子程序。各模块之间通过全局变量传递状态和数据,实现系统的有序运行。


3.1 主程序流程

主程序为系统控制核心,负责流程的调度与状态切换。程序运行流程如下:

  1. 初始化系统模块;
  2. 循环扫描按键;
  3. 根据状态执行相应输入和计算;
  4. 更新显示内容;
  5. 判断是否复位或结束操作。

主程序框架如下:

c 复制代码
#include <reg52.h>
#include "key.h"
#include "display.h"
#include "math.h"

unsigned int unit_price = 0;
unsigned int quantity = 0;
unsigned long total = 0;
unsigned char mode_flag = 0; // 0:单价输入 1:数量输入 2:总额显示

void main()
{
    Init_System();
    while(1)
    {
        unsigned char key = Key_Scan();
        if(key != 0xFF)
            Key_Process(key);
        Display_Update();
    }
}

3.2 键盘扫描程序

矩阵键盘扫描采用逐列检测法,通过检测低电平信号确定按键位置。加入防抖动延时提高稳定性。

c 复制代码
unsigned char Key_Scan()
{
    unsigned char row, col, keyvalue = 0xFF;
    for(col = 0; col < 4; col++)
    {
        P1 = ~(0x10 << col);
        row = P1 & 0x0F;
        if(row != 0x0F)
        {
            Delay_ms(10);
            row = P1 & 0x0F;
            if(row != 0x0F)
            {
                keyvalue = row * 4 + col;
                while((P1 & 0x0F) != 0x0F);
            }
        }
    }
    return keyvalue;
}

3.3 键盘功能逻辑控制

不同按键对应不同功能,通过条件判断实现模式切换与数据输入。

c 复制代码
void Key_Process(unsigned char key)
{
    if(key <= 9)  // 数字输入
    {
        if(mode_flag == 0)
            unit_price = unit_price * 10 + key;
        else if(mode_flag == 1)
            quantity = quantity * 10 + key;
    }
    else if(key == 10) // ×键
        mode_flag = 1;
    else if(key == 11) // +键
    {
        total += unit_price * quantity;
        unit_price = 0;
        quantity = 0;
        mode_flag = 0;
    }
    else if(key == 12) // =键
        mode_flag = 2;
    else if(key == 13) // C键
    {
        total = 0;
        unit_price = 0;
        quantity = 0;
        mode_flag = 0;
    }
}

3.4 显示程序设计

显示程序根据系统状态决定显示内容。

c 复制代码
void Display_Update()
{
    unsigned long show_data;
    if(mode_flag == 0)
        show_data = unit_price;
    else if(mode_flag == 1)
        show_data = quantity;
    else
        show_data = total;
    Display_Num(show_data);
}

Display_Num()函数采用动态扫描方式刷新数码管显示:

c 复制代码
void Display_Num(unsigned long num)
{
    unsigned char i, digits[8];
    for(i=0; i<8; i++)
    {
        digits[i] = num % 10;
        num /= 10;
    }
    for(i=0; i<8; i++)
    {
        P2 = 1 << i;
        P0 = SegmentTable[digits[i]];
        Delay_us(1000);
    }
}

3.5 延时与蜂鸣器程序

为了防抖与按键确认提示,程序中加入蜂鸣器控制:

c 复制代码
void Beep()
{
    P3_7 = 0;
    Delay_ms(50);
    P3_7 = 1;
}

每当按键有效触发后,系统自动调用蜂鸣器函数。


4. 系统运行与结果分析

系统上电后,最右侧数码管显示"0",表示准备接收输入。用户依次输入商品单价、数量并执行加法计算,系统实时显示结果。

经过实际调试,系统能稳定完成多笔商品的金额累计与清零操作,显示刷新无闪烁、按键响应灵敏、逻辑流程符合实际收银操作。

系统的主要优点:

  • 界面直观、操作简单;
  • 逻辑清晰、稳定可靠;
  • 可扩展性强,可进一步增加打印、通信等功能。

5. 总结

本设计成功实现了一款基于51单片机的智能收银机模拟系统。系统通过矩阵键盘输入、数码管动态显示、按键控制与数据存储等功能模块,实现了从商品录入到结算显示的全过程控制。

该系统不仅能模拟实际收银机的工作流程,还具有良好的教学与实验价值,可进一步扩展为带通信接口、语音提示或LCD显示的智能化收银设备,为嵌入式控制技术在商业终端领域的应用提供了技术参考。

相关推荐
资深低代码开发平台专家4 小时前
PostgreSQL 18 发布
数据库·postgresql
第二层皮-合肥4 小时前
RTC时钟原理
单片机·嵌入式硬件
与衫5 小时前
在 VS Code 里看清你的数据流向:Gudu SQL Omni 实测体验
数据库·sql
Element_南笙5 小时前
吴恩达新课程:Agentic AI(笔记2)
数据库·人工智能·笔记·python·深度学习·ui·自然语言处理
长安城没有风5 小时前
从入门到精通【Redis】Redis 典型应⽤ --- 分布式锁
数据库·redis·分布式
Ytadpole5 小时前
MySQL 数据库优化设计:优化原理和数据库表设计技巧
数据库·mysql·优化·索引·查询·检索·表设计
christine-rr6 小时前
数据库基础概念体系梳理
数据库·oracle
SirLancelot16 小时前
StarRocks-基本介绍(一)基本概念、特点、适用场景
大数据·数据库·数据仓库·sql·数据分析·database·数据库架构