1. 系统总体设计
点击链接下载protues仿真资料:https://download.csdn.net/download/m0_51061483/92081484
1.1 设计背景
随着现代商业的发展,收银机已经成为零售行业中不可或缺的重要设备。从传统机械式收银机到如今的智能电子收银系统,其核心目标始终是提高结算效率与准确性。在嵌入式系统教学与开发实践中,设计一个基于单片机的智能收银机模拟系统,不仅可以帮助掌握键盘输入处理、数码管显示控制以及数据运算等关键技术,还能够深入理解状态机控制思想及人机交互流程。
本系统基于单片机实现收银机的基本工作流程,包括商品单价输入、数量输入、金额计算、累计显示以及最终结算等功能,通过数码管实现动态显示,模拟真实收银机的操作逻辑,具有较高的实用性和教学意义。
1.2 系统功能设计
本系统主要实现以下功能:
- 上电初始化功能:系统通电后数码管显示初始状态;
- 单价输入功能:支持逐位输入商品单价,并实现左移显示;
- 数量输入功能:通过“×”键进入数量输入模式;
- 单笔金额计算:通过“+”键计算单价与数量乘积;
- 累计金额功能:将每笔金额累加至总金额;
- 结算功能:通过“=”键显示最终总金额;
- 复位功能:通过复位键清零并返回初始状态;
- 动态显示功能:通过多位数码管实现实时数据展示;
- 状态切换功能:通过状态机控制不同操作阶段。
2. 系统电路设计
2.1 单片机最小系统电路设计
最小系统主要包括:
2.2 矩阵键盘输入电路设计
系统采用4×4矩阵键盘实现输入操作。
按键分布包括:
- 数字键(0~9);
- 功能键(×、+、=、复位)。
设计要点:
- 行列扫描方式读取按键;
- 节省IO口资源;
- 软件实现按键消抖;
- 支持多功能输入识别。
2.3 LED数码管显示电路设计
系统采用多位LED数码管进行数据显示。
显示内容包括:
- 商品单价;
- 商品数量;
- 当前计算金额;
- 累计总金额。
设计方式:
- 采用动态扫描技术;
- 段选控制数字显示;
- 位选控制显示位置;
- 实现数据滚动显示效果。
2.4 运算处理模块设计
所有计算由单片机内部完成。
主要实现:
- 单价与数量的乘法运算;
- 每笔金额的累加;
- 数据缓存与更新;
- 防止数据溢出处理。
2.5 状态指示与逻辑控制电路设计
系统通过状态变量控制不同工作阶段:
- 单价输入状态;
- 数量输入状态;
- 金额计算状态;
- 结算状态。
可通过LED指示灯辅助显示当前状态。
2.6 电源与抗干扰设计
为保证系统稳定运行:
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. 系统总结
本系统基于单片机实现了智能收银机的完整模拟功能,通过矩阵键盘输入与数码管显示,实现了商品单价输入、数量输入、金额计算及累计结算等功能。
在电路设计方面,系统结构简洁、模块划分清晰;在程序设计方面,采用状态机控制方式,使系统逻辑严谨、运行稳定。
该系统不仅具有较强的实用性,还具有良好的教学与实验价值,是单片机应用设计中的典型案例。
182