目录

一、主要功能

二、使用步骤

三、硬件资源

四、软件设计

五、实验现象

一、主要功能

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

五、实验现象

演示视频:

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐