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

}

}

}

五、实验现象

演示视频:

相关推荐
智者知已应修善业4 分钟前
【51单片机独立按键和定时器中断的疑惑验证】2023-11-2
c++·经验分享·笔记·算法·51单片机
老花眼猫13 分钟前
C语言矩形旋转算法介绍
c语言·经验分享·青少年编程·课程设计
消失的旧时光-194313 分钟前
C 语言如何实现“面向对象”?—— 从 struct + 函数指针,到 Linux 内核设计思想
linux·c语言·开发语言
handler0115 分钟前
滑动窗口(同向双指针)算法:模板与例题解析
c语言·c++·笔记·算法·蓝桥杯·双指针·滑动窗口
方山子哦1 小时前
软硬件uart、iic、spi、can,及蓝牙和usb的区别及应用场景
单片机·嵌入式硬件
薇茗1 小时前
【初阶数据结构】 升沉有序的平仄 排序
c语言·数据结构·算法·排序算法
yoyo_zzm1 小时前
五大编程语言对比:PHP、C、C++、C#、易语言
c语言·c++·php
czwxkn2 小时前
pcb设计-电路:IO口的灌电流与拉电流
单片机·嵌入式硬件
铅笔小新z2 小时前
【C语言】数组详解
c语言·开发语言
努力努力再努力wz2 小时前
【Redis入门系列】Redis基础命令详解:从客户端连接到数据读写、key 管理与过期机制
c语言·开发语言·数据结构·数据库·c++·redis·缓存