找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1882|回复: 2
收起左侧

用51单片机设计的自助售货机系统文档等

[复制链接]
ID:614205 发表于 2019-9-30 13:31 | 显示全部楼层 |阅读模式
本文设计了一款以AT89C51单片机为核心的自动售货机系统,并且着重详细地介绍了自动售货机的整体系统设计方案、硬件选择基础、软件使用方法及技巧。以AT89C51作为CPU处理单元连接各个功能模块;以4×4矩阵键盘作为输入控制模块对货物进行种类和数量的选择以及模拟货币的投入功能;以LCD1602液晶作为显示模块来显示当前的购物状态以及货币状态;以LED的显示来表示当前选择货物以及出货的状态。


自助售货机原理:
在初始化的界面等待顾客按键选择货物的种类和数量顾客投入货币,按下确定购买键后等待售货机自动计算所购商品的总价,然后提示顾客投入货币。所投的货币经过外部硬件检测传感器检测真假后累加计数。若顾客确认购买系统则跳转到下一步骤,反之取消购买即退出货币返回到主界面,等待顾客下一步操作。自动售货机通过货币的总价与和所购商品的总价的差值来进行出货找零。
自动售货机框图.jpg



仿真:
系统仿真图干净.jpg



操作说明:
操作说明干净.jpg



仿真分析为:
(1)加载Sale.hex文件到AT89C51单片机,点击运行,自动售货机系统进入初始化等待状态,LCD显示“Welcome Sale”,同时等待按键输入。
结果1.png

(2)通过按键“价格+”和“价格-”来选择货物的种类,然后通过“数量+”和“数量-”来选择所购买货物的数量,同时代表被选择货物的LED指示灯亮。
结果2.png

结果2.1.png

(3)当选择好货物后,按下“确认OK”键进入到投币系统,此时机器会自动计算出所购货物总金额。
结果3.png



(4)(4)当机器计算出总价等待顾客投入货币并按下“确认OK”键后,当投入货币货币值大于或等于总价时就出货并找零,若投入货币货币值小于总价则不能出货只能按下“取消NO”退出所投货币或继续增加投币。
结果4.png

结果4.1.png

(5)当完成以上步骤后则完成一次自动购物过程,机器自动复位回到初始化界面,同时在操作过程中的任一环节,都可通过按下“取消NO”键,是售货机系统复位到初始状态。


代码:
  1. #include<reg51.h>
  2. #define WAIT_SALE        0            
  3. #define NO_WATER         1                 
  4. #define INPUT_MONEY        2
  5. #define SALING                3
  6. #define CHANGE                4
  7. #define CANCLE                5
  8. #define NO_DATA                0
  9. #define water_change(x, y) ((x) & (~(0x01 << y)))
  10. #define uint unsigned int
  11. #define uchar unsigned char

  12. unsigned char water_total[] = {10, 10, 10, 10, 10, 10, 10, 10};   
  13. unsigned char water_price[] = {1, 2, 3, 4, 5, 6, 7, 8};
  14. uchar code wait_sale[]=" Welcome Sale ";    //定义所显示的内容
  15. uchar code no_water[] = "No Water!";
  16. uchar code price[] = "Price:";
  17. uchar code number[] = "Num:";
  18. uchar code sum[] = "SUM:";
  19. uchar code input[] = "INPUT:";
  20. uchar code change[] = "Change:";
  21. uchar code put_water[] = "Get Water...";
  22. uchar code cancle[] = "Cancle...";

  23. unsigned char e=0x00;                    
  24. sbit P2_0=P2^0;                       //定义接端口
  25. sbit P2_1=P2^1;
  26. sbit P2_2=P2^2;
  27. sbit P2_3=P2^3;
  28. sbit lcd_en=P3^4;            
  29. sbit rs=P3^2;
  30. sbit rw = P3^3;

  31. void lcd_1602_delay(uint z)          //延时
  32. {
  33. uint x,y;
  34. for(x=z;x>0;x--)
  35. for(y=110;y>0;y--);
  36. }
  37. void lcd_1602_write_com(uchar com)   //写命令
  38. {
  39. rs=0;
  40. rw=0;
  41. P2=com;
  42. lcd_1602_delay(5);
  43. lcd_en=1;
  44. lcd_1602_delay(5);
  45. lcd_en=0;
  46. }

  47. void lcd_1602_write_data(uchar date) //写数据
  48. {
  49. rs=1;
  50. rw=0;
  51. P2=date;
  52. lcd_1602_delay(5);
  53. lcd_en=1;
  54. lcd_1602_delay(5);
  55. lcd_en=0;
  56. }

  57. void lcd_1602_init()               //LCD1602初始化函数
  58. {
  59. lcd_en=0;
  60. lcd_1602_write_com(0x38);
  61. lcd_1602_write_com(0x0e);
  62. lcd_1602_write_com(0x06);
  63. lcd_1602_write_com(0x01);
  64. }

  65. void lcd_1602_wait_sure()         //显示'OK'&'NO'界面
  66. {
  67. lcd_1602_write_com(0x80+0x40);
  68. lcd_1602_write_data('O');
  69. lcd_1602_write_data('K');
  70.                
  71. lcd_1602_write_com(0x80+0x4e);
  72. lcd_1602_write_data('N');
  73. lcd_1602_write_data('O');
  74. }

  75. void lcd_1602_show_num(uint num)       // 1602显示数字的函数
  76. {
  77. if(num <= 9)
  78. {
  79.    lcd_1602_write_data('0'+num);
  80.    lcd_1602_write_data(' ');
  81.   }else if(num > 10 )
  82. {
  83.    lcd_1602_write_data('0'+num/10);
  84.    lcd_1602_write_data('0'+num%10);
  85.   }
  86. }

  87. void lcd1602_info_display(uint choose, uint num_type, uint num_count)  
  88. {
  89. int num;
  90. lcd_1602_write_com(0x81);
  91. switch(choose)
  92.   {
  93. case WAIT_SALE:
  94. lcd_1602_write_com(0x80+0x01);       //
  95. for(num = 0; num < 13; num++)
  96. {
  97. lcd_1602_write_data(wait_sale[num]);
  98. }
  99. break;
  100. case NO_WATER:
  101. lcd_1602_write_com(0x80+0x03);
  102. for(num = 0; num < 9; num++)
  103.   {
  104.    lcd_1602_write_data(no_water[num]);        
  105.    }
  106. break;
  107. case SALING:
  108. lcd_1602_write_com(0x80+0x00);
  109. for(num = 0; num < 6; num++)
  110.   {
  111.     lcd_1602_write_data(price[num]);
  112.    }
  113. lcd_1602_write_data('0'+(num_type+1));
  114. lcd_1602_write_data(' ');
  115. lcd_1602_write_data(' ');
  116. for(num = 0; num < 4; num++)
  117.           {
  118.            lcd_1602_write_data(number[num]);
  119.            }
  120. lcd_1602_show_num(num_count);
  121. break;
复制代码


回复

使用道具 举报

ID:403916 发表于 2020-2-27 12:54 | 显示全部楼层
你好!请问如果改成扫码支付,有没有推荐的可以买到的模块呢?
回复

使用道具 举报

ID:718052 发表于 2020-3-29 12:16 | 显示全部楼层
1061897836 发表于 2020-2-27 12:54
你好!请问如果改成扫码支付,有没有推荐的可以买到的模块呢?

我也想问这个问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表