• 方案介绍
  • 相关推荐
申请入驻 产业图谱

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

04/10 13:05
182
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

1. 系统总体设计

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

1.1 设计背景

随着现代商业的发展,收银机已经成为零售行业中不可或缺的重要设备。从传统机械式收银机到如今的智能电子收银系统,其核心目标始终是提高结算效率与准确性。在嵌入式系统教学与开发实践中,设计一个基于单片机的智能收银机模拟系统,不仅可以帮助掌握键盘输入处理、数码管显示控制以及数据运算等关键技术,还能够深入理解状态机控制思想及人机交互流程。

本系统基于单片机实现收银机的基本工作流程,包括商品单价输入、数量输入、金额计算、累计显示以及最终结算等功能,通过数码管实现动态显示,模拟真实收银机的操作逻辑,具有较高的实用性和教学意义。


1.2 系统功能设计

本系统主要实现以下功能:

  1. 上电初始化功能:系统通电后数码管显示初始状态;
  2. 单价输入功能:支持逐位输入商品单价,并实现左移显示;
  3. 数量输入功能:通过“×”键进入数量输入模式;
  4. 单笔金额计算:通过“+”键计算单价与数量乘积;
  5. 累计金额功能:将每笔金额累加至总金额;
  6. 结算功能:通过“=”键显示最终总金额;
  7. 复位功能:通过复位键清零并返回初始状态;
  8. 动态显示功能:通过多位数码管实现实时数据展示;
  9. 状态切换功能:通过状态机控制不同操作阶段。

2. 系统电路设计

2.1 单片机最小系统电路设计

本系统采用STC89C52单片机作为核心控制器

最小系统主要包括:

  1. 晶振电路:采用11.0592MHz晶振,为单片机提供稳定时钟信号
  2. 复位电路:通过RC电路实现上电自动复位;
  3. 电源电路:采用稳压芯片输出5V电压,保证系统稳定运行。

2.2 矩阵键盘输入电路设计

系统采用4×4矩阵键盘实现输入操作。

按键分布包括:

  1. 数字键(0~9);
  2. 功能键(×、+、=、复位)。

设计要点:

  1. 行列扫描方式读取按键;
  2. 节省IO口资源;
  3. 软件实现按键消抖;
  4. 支持多功能输入识别。

2.3 LED数码管显示电路设计

系统采用多位LED数码管进行数据显示。

显示内容包括:

  1. 商品单价;
  2. 商品数量;
  3. 当前计算金额;
  4. 累计总金额。

设计方式:

  1. 采用动态扫描技术;
  2. 段选控制数字显示;
  3. 位选控制显示位置;
  4. 实现数据滚动显示效果。

2.4 运算处理模块设计

所有计算由单片机内部完成。

主要实现:

  1. 单价与数量的乘法运算;
  2. 每笔金额的累加;
  3. 数据缓存与更新;
  4. 防止数据溢出处理。

2.5 状态指示与逻辑控制电路设计

系统通过状态变量控制不同工作阶段:

  1. 单价输入状态;
  2. 数量输入状态;
  3. 金额计算状态;
  4. 结算状态。

可通过LED指示灯辅助显示当前状态。


2.6 电源与抗干扰设计

为保证系统稳定运行:

  1. 使用稳压芯片提供稳定5V电源;
  2. 添加滤波电容减少电源波动;
  3. 合理布线降低干扰;
  4. 增强系统抗干扰能力。

3. 系统程序设计

3.1 程序总体结构设计

系统采用状态机设计思想,通过状态变量控制不同操作流程。

主程序如下:

void main()
{
    System_Init();
    while(1)
    {
        key = Key_Scan();
        Data_Process(key);
        Display_Update();
    }
}

3.2 状态定义与变量设计

#define STATE_PRICE   0
#define STATE_NUMBER  1
#define STATE_TOTAL   2
#define STATE_FINISH  3

unsigned long price = 0;
unsigned long number = 0;
unsigned long total = 0;
unsigned long temp = 0;
unsigned char state = STATE_PRICE;

用于控制系统运行逻辑。


3.3 按键扫描程序设计

unsigned char Key_Scan()
{
    unsigned char key = 0;

    if(KEY_1 == 0) key = 1;
    if(KEY_2 == 0) key = 2;
    if(KEY_MUL == 0) key = 10;
    if(KEY_ADD == 0) key = 11;
    if(KEY_EQ == 0) key = 12;
    if(KEY_RST == 0) key = 13;

    return key;
}

实现键值识别。


3.4 单价输入处理程序设计

void Input_Price(unsigned char key)
{
    if(key <= 9)
    {
        price = price * 10 + key;
    }
}

实现数字逐位左移输入。


3.5 数量输入处理程序设计

void Input_Number(unsigned char key)
{
    if(key <= 9)
    {
        number = number * 10 + key;
    }
}

实现数量输入。


3.6 金额计算程序设计

void Calculate()
{
    temp = price * number;
    total += temp;
}

实现单笔金额计算与累计。


3.7 状态机处理程序设计

void Data_Process(unsigned char key)
{
    switch(state)
    {
        case STATE_PRICE:
            if(key <= 9)
                Input_Price(key);
            else if(key == 10)
                state = STATE_NUMBER;
            break;

        case STATE_NUMBER:
            if(key <= 9)
                Input_Number(key);
            else if(key == 11)
            {
                Calculate();
                price = 0;
                number = 0;
                state = STATE_PRICE;
            }
            break;

        case STATE_TOTAL:
            if(key == 12)
                state = STATE_FINISH;
            break;

        case STATE_FINISH:
            break;
    }

    if(key == 13)
        Reset_System();
}

实现完整流程控制。


3.8 显示更新程序设计

void Display_Update()
{
    if(state == STATE_PRICE)
        Display_Num(price);
    else if(state == STATE_NUMBER)
        Display_Num(number);
    else
        Display_Num(total);
}

根据状态显示不同数据。


3.9 复位程序设计

void Reset_System()
{
    price = 0;
    number = 0;
    total = 0;
    state = STATE_PRICE;
}

恢复初始状态。


3.10 系统初始化程序设计

void System_Init()
{
    Key_Init();
    LED_Init();
    Display_Init();
}

完成系统初始化。


4. 系统总结

本系统基于单片机实现了智能收银机的完整模拟功能,通过矩阵键盘输入与数码管显示,实现了商品单价输入、数量输入、金额计算及累计结算等功能。

电路设计方面,系统结构简洁、模块划分清晰;在程序设计方面,采用状态机控制方式,使系统逻辑严谨、运行稳定。

该系统不仅具有较强的实用性,还具有良好的教学与实验价值,是单片机应用设计中的典型案例。

相关推荐