【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);

}

}

}

五、实验现象

演示视频:

相关推荐
zhilin_tang3 小时前
Linux IPC 为什么要这么架构
linux·c语言·架构
TDengine (老段)4 小时前
杨凌美畅用 TDengine 时序数据库,支撑 500 条产线 2 年历史数据追溯
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
小叮当⇔7 小时前
IOT项目——电源入门系列-第一章
物联网
柒月玖.10 小时前
基于AT89C52单片机的温度检测报警设计
单片机·嵌入式硬件
m0_5557629010 小时前
GPIO配置详细解析
单片机·嵌入式硬件
盈创力和200710 小时前
构建未来工业感知层:以太网多参量传感器的融合架构与技术实践
嵌入式硬件·架构·以太网温湿度传感器·多参数传感器
Yupureki10 小时前
从零开始的C++学习生活 16:C++11新特性全解析
c语言·数据结构·c++·学习·visual studio
兆龙电子单片机设计10 小时前
【STM32项目开源】STM32单片机多功能饮水机系统
stm32·单片机·物联网·开源·毕业设计
ScilogyHunter11 小时前
C语言标准库完全指南
c语言·开发语言