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

{

water_count = water_totalwater_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);

}

}

}

五、实验现象

演示视频:

相关推荐
2401_827501284 小时前
51单片机(二):GPIO、中断、定时器与PWM
单片机·嵌入式硬件·51单片机
MetrixAeroCore5 小时前
希腊物联网卡:适配海岛山地工况,解决南欧组网与合规难题
物联网
openKylin6 小时前
与全球技术演进同频,openKylin 3.0从C迈向Rust
c语言·开发语言·rust·开源·开放原子·openkylin
尼喃6 小时前
HDMI/DP高速差分接口ESD保护:0.3pF超低电容PWESD-5VSDF方案详解
嵌入式硬件
ACP广源盛139246256736 小时前
GSV6155@ACP# 搭配 AI 服务器、AI PC 完整适配方案
大数据·服务器·人工智能·分布式·单片机·嵌入式硬件
迷茫、Peanut6 小时前
C语言sizeof和strlen
c语言
Inhand陈工7 小时前
数据中心UPS无功补偿与智能化监控方案:基于IG502的Modbus RTU转IEC61850实战
运维·人工智能·物联网·信息与通信
Saniffer_SH7 小时前
NAND技术(二):从 Channel、Die/LUN、P/E Cycle 到 LDPC,一次讲透 NAND 里那些最容易误解的概念
人工智能·驱动开发·嵌入式硬件·测试工具·fpga开发·计算机外设·压力测试
MetrixAeroCore7 小时前
新西兰物联网卡:解决跨海切换、农牧弱网与本地合规难题
物联网
stonewl25997 小时前
2026化工行业 GHS/CLP 国产标签打印软件合规打印方案
大数据·人工智能·物联网