一、设计要求
基本原理:通过矩阵键盘来选择货物的种类与数量过后自动售货机提示投币。自动售货机的货币识别器对所投货币进行识别,根据金额大小然后将商品选择权通过LCD液晶显示给客户,客户按键选择后,CPU控制芯片发出指令将所选择商品从储备料道中送达取物口。
功能描述:货物种类一共设有8种,这8种商品通过选择按键进行选择确认,通过数量选择按键确定购买数量,价格规定为1-8元不等;货币识别器能够识别1元硬币、1元纸币、5元纸币、10元纸币、20元纸币50元纸币以及100元纸币。在规定的时间内,投了几次货币后,货币能够实现自动累加功能,这样设计会把投入的所有货币总额数目数据传递到中央控制元器件进行处理;在超过规定时间后投币口自动关闭,数据处理单元按照投币总数和购买的数量和价格乘积来进行加减运算累,实现购买和找币功能。当投入的货币总值小于商品总金额时,则不能进行购货,投入的钱将全部退还。
本设计中有一共有16个按键选择,其中有两个是货物选择键,有两个是数量选择键,此外还有6个货币投入键1个确认键和1个取消键。
二、设计资料
三、部分程序代码
#include<reg51.h>
/*******************define*************************/
#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[]="saling!"; //定义所显示的内容
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;
/****************************************************/
/***********************function**********************************/
/************lcd 1602*************************/
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_wait_sure() //显示'OK'&'NO'界面
{
lcd_1602_write_com(0x80+0x40);
lcd_1602_write_data('O');
lcd_1602_write_data('K');
lcd_1602_write_com(0x80+0x4e);
lcd_1602_write_data('N');
lcd_1602_write_data('O');
}
void lcd_1602_show_num(uint num) // 1602显示数字的函数
{
if(num <= 9)
{
lcd_1602_write_data('0'+num);
lcd_1602_write_data(' ');
}else if(num >= 10 )
{
lcd_1602_write_data('0'+num/10);
lcd_1602_write_data('0'+num%10);
}
}
void lcd1602_info_display(uint choose, uint num_type, uint num_count) //1602显示函数
{
int num;
lcd_1602_write_com(0x01);
switch(choose)
{
case WAIT_SALE:
lcd_1602_write_com(0x80+0x03); //
for(num = 0; num < 7; num++)
{
lcd_1602_write_data(wait_sale[num]);
}
break;
case NO_WATER:
lcd_1602_write_com(0x80+0x03);
for(num = 0; num < 9; num++)
{
lcd_1602_write_data(no_water[num]);
}
break;
case SALING:
//price
lcd_1602_write_com(0x80+0x00);
for(num = 0; num < 6; num++)
{
lcd_1602_write_data(price[num]);
}
lcd_1602_write_data('0'+(num_type+1));
lcd_1602_write_data(' ');
//number
lcd_1602_write_data(' ');
for(num = 0; num < 4; num++)
{
lcd_1602_write_data(number[num]);
}
lcd_1602_show_num(num_count);
break;
case INPUT_MONEY:
//need money
lcd_1602_write_com(0x80+0x00);
for(num = 0; num < 4; num++)
{
lcd_1602_write_data(sum[num]);
}
lcd_1602_show_num(num_type);
//input
lcd_1602_write_data(' ');
lcd_1602_write_data(' ');
for(num = 0; num < 6; num++)
{
lcd_1602_write_data(input[num]);
}
lcd_1602_show_num(num_count);
break;
case CHANGE:
if(!num_count)
{
//put water
lcd_1602_write_com(0x80+0x02);
for(num = 0; num < 13; num++)
{
lcd_1602_write_data(put_water[num]);
}
}
else
{
//cancle water
lcd_1602_write_com(0x80+0x02); //取消选择时写命令退币
for(num = 0; num < 9; num++)
{
lcd_1602_write_data(cancle[num]);
}
}
//change
lcd_1602_write_com(0x80+0x43);
for(num = 0; num < 7; num++)
{
lcd_1602_write_data(change[num]);
}
lcd_1602_show_num(num_type);
break;
default:
break;
}
lcd_1602_write_com(0x0c);
}
void lcd_1602_saling(uint type, uint num)
{
lcd1602_info_display(SALING, type, num);
lcd_1602_wait_sure();
}
void lcd_1602_inputing(uint need, uint input)
{
lcd1602_info_display(INPUT_MONEY, need, input);
lcd_1602_wait_sure();
}
四、protues仿真
五、AD原理图
六、PCB
六、全套设计资料扫一扫关注公众号立即获取