基于51单片机的自动售货机系统设计

一、设计要求

  基本原理:通过矩阵键盘来选择货物的种类与数量过后自动售货机提示投币。自动售货机的货币识别器对所投货币进行识别,根据金额大小然后将商品选择权通过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 charunsigned 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://pricelcd_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(' ');//numberlcd_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);//inputlcd_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 waterlcd_1602_write_com(0x80+0x02);              //取消选择时写命令退币for(num = 0; num < 9; num++)   {       lcd_1602_write_data(cancle[num]);  }}//changelcd_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

 六、全套设计资料扫一扫关注公众号立即获取

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下饭的王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值