【51单片机】【protues仿真】基于51单片机自动售货机系统

目录

一、主要功能

二、使用步骤

三、硬件资源

四、软件设计

五、实验现象

一、主要功能

1、LCD1602液晶显示

2、矩阵按键​选择货物和数量已经模拟投币

3、投币价格大于货物总价,继电器出货和蜂鸣器警报提示和找零

4、若投币数小于货物总价,则LCD显示继续投币

二、使用步骤

系统运行后,LCD1602显示系统初始界面,可通过矩阵按键选择货物,LCD液晶显示商品价格,共有8种价格货物可供选择,且选择的货物对应LED会有指示。可通过按键选择货物数量,当需要

返回时可按下返回键,选择好商品和数量后可按下确认键,此时LCD显示累计货物总价,此时可通过键盘输入投币数,LCD显示投币值,若投币数值大于等于货物累计总价,则驱动继电器出货,且蜂鸣器报警提示,LCD显示找零数。若投币数小于货物累计总价,则LCD显示继续投币。

三、硬件资源

1、51单片机核心模块

2、矩阵按键模块

3、LED灯模块

4、蜂鸣器模块

5、继电器模块

6、LCD1602显示模块

四、软件设计

#include<reg51.h>

#define WAIT_SALE 0 //定义1602显示状态

#define NO_WATER 1

#define INPUT_MONEY 2

#define SALING 3

#define CHANGE 4

#define CANCLE 5

#define NO_DATA 0

#define water_change(x, y) ((x) & (~(0x01 << y)))

#define uint unsigned int

#define uchar unsigned char

unsigned char water_total[] = {10, 10, 10, 10, 10, 10, 10, 10};

unsigned char water_price[] = {1, 2, 3, 4, 5, 6, 7, 8};

uchar code wait_sale[]="for sale";

uchar code no_water[] = "no water!";

uchar code price[] = "price:";

uchar code number[] = "num:";

uchar code sum[] = "SUM:";

uchar code input[] = "INPUT:";

uchar code change[] = "change:";

uchar code put_water[] = "put water...";

uchar code cancle[] = "cancle...";

unsigned char e=0x00;

sbit P2_0=P2^0;

sbit P2_1=P2^1;

sbit P2_2=P2^2;

sbit P2_3=P2^3;

sbit lcd_en=P3^4;

sbit rs=P3^2;

sbit rw = P3^3;

sbit beep=P3^6;

sbit rly = P3^7;

void lcd_1602_delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void lcd_1602_write_com(uchar com) //写命令

{

rs=0;

rw=0;

P2=com;

lcd_1602_delay(5);

lcd_en=1;

lcd_1602_delay(5);

lcd_en=0;

}

void lcd_1602_write_data(uchar date) //写数据

{

rs=1;

rw=0;

P2=date;

lcd_1602_delay(5);

lcd_en=1;

lcd_1602_delay(5);

lcd_en=0;

}

void lcd_1602_init() //LCD1602初始化函数

{

lcd_en=0;

lcd_1602_write_com(0x38);

lcd_1602_write_com(0x0e);

lcd_1602_write_com(0x06);

lcd_1602_write_com(0x01);

}

void lcd_1602_saling(uint type, uint num)

{

lcd1602_info_display(SALING, type, num);

lcd_1602_wait_sure();

}

/*************************************************/

void delay1(unsigned int t) // 延时函数

{

unsigned int i,j;

for(i=0;i<t;i++)

for(j=0;j<10;j++);

}

void main()

{

unsigned char ok = 0, water_type = -1, water_is_choose = 0;

char water_count = 0;

unsigned int flag = 0, money = 0, need_money;

lcd_1602_init();

again:

ok = 0; water_type = -1; water_count = 0; water_is_choose = 0;

flag = 0; money = 0; need_money = 0;

lcd1602_info_display(WAIT_SALE, 0, 0);

while(!ok)

{

flag=key();

if(flag)

{

switch(e)

{

case(0x00):

water_type++;

water_is_choose = 1;

if(water_type == 8)

{

water_type = 0;

}

P0 = water_change(0xff, water_type);

break;

case(0x01):

water_type--;

water_is_choose = 1;

if(water_type == -1 || water_type == -2)

{

water_type = 7;

}

P0 = water_change(0xff, water_type);

break;

case(0x02):

if(water_is_choose == 1)

{

water_count++;

if(water_count > water_total[water_type])

{

water_count = water_total[water_type];

}

}

break;

case(0x03):

if(water_is_choose == 1)

{

water_count--;

if(water_count < 0)

{

water_count = 0;

}

}

break;

case(0x0e): // 返回

goto again;

break;

case(0x0f): // 确认

if(water_is_choose == 1)

{

ok=1;

}

break;

default:

break;

}

lcd_1602_saling(water_type, water_count);

}

}

}

五、实验现象

演示视频:

相关推荐
cat_milk2 分钟前
【潘多拉 STM32L475 IOT开发指南】【基础】1.LED
stm32·单片机·物联网
AAAAA92405 分钟前
泰国物联网模组市场发展态势与前景分析
物联网
TEC_INO16 分钟前
Stm32_2:蜂鸣器、按键、继电器
stm32·单片机·嵌入式硬件
yugi98783817 分钟前
实现STM32读取INA226电流值并通过串口发送给HMI串口屏显示
stm32·单片机·嵌入式硬件
_codemonster21 分钟前
自然语言处理容易混淆知识点(一)c-TF-IDF和TF-IDF的区别
c语言·自然语言处理·tf-idf
云数据构建师32 分钟前
TB67S579FTG(O,EL)这是一款非常经典和流行的 “双极步进电机驱动器IC”,主要用于控制步进电机。
单片机·嵌入式硬件
deng-c-f33 分钟前
C/C++内置库函数(2):智能指针
java·c语言·c++
yuhaiqun198933 分钟前
新手练 C++ HTTP 服务实操:从 “拆请求头” 到 “发 HTML 响应”
c语言·c++·程序人生·http·html·学习方法·改行学it
野生风长36 分钟前
从零开始的C语言: 指针深入理解从入门到实践(中)指针与数组的结合
c语言·数据结构·算法
jumu20236 分钟前
模型预测控制(MPC):混动汽车能量管理的革新之道
嵌入式硬件