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

}

}

}

五、实验现象

演示视频:

相关推荐
钰珠AIOT4 小时前
在同一块电路板上同时存在 0805 0603 不同的封装有什么利弊?
嵌入式硬件
代码游侠4 小时前
复习——Linux设备驱动开发笔记
linux·arm开发·驱动开发·笔记·嵌入式硬件·架构
二年级程序员4 小时前
一篇文章掌握“顺序表”
c语言·数据结构
傻乐u兔5 小时前
C语言进阶————指针4
c语言·开发语言
历程里程碑5 小时前
Linux22 文件系统
linux·运维·c语言·开发语言·数据结构·c++·算法
2601_9491465312 小时前
C语言语音通知接口接入教程:如何使用C语言直接调用语音预警API
c语言·开发语言
知南x14 小时前
【Ascend C系列课程(高级)】(1) 算子调试+调优
c语言·开发语言
代码游侠15 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
2的n次方_16 小时前
Runtime 执行提交机制:NPU 硬件队列的管理与任务原子化下发
c语言·开发语言
凡人叶枫17 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发