鱼C论坛

 找回密码
 立即注册
查看: 1846|回复: 3

自动售货程序

[复制链接]
发表于 2023-10-2 23:14:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
主要功能: 一款自动售货机设计,能够实现自动售货功能,使用STC89C52RC单片机做控制,LCD1602做显示,按键做货物的选择,步进电机做出货口的控制,直流发电机做报警提示。当选择好货物后,会提示投币付款,付款成功后,蜂鸣器会响一声,并伴随着电机转动,自动出货。
1.使用STC89C52RC单片机做主控制器件。
2.使用LCD1602做显示屏,1602可显示数字、字母等。显示屏显示欢迎界面、货物信息等。
3.使用按键做货物选择、投币、确实、返回等选择。

5.使用蜂鸣器做报警提示,当付款完成后,蜂鸣器会自动响一下,伴随电机转动,自动出货。(可根据自己想法自由开发程序)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-10-2 23:15:15 | 显示全部楼层
这是一个基于STC89C52RC单片机的自动售货程序。主要功能是实现自动售货功能,使用LCD1602显示器显示信息,按键选择货物,步进电机控制出货口,直流发电机做报警提示。具体实现步骤如下:

1.使用STC89C52RC单片机做主控制器件。STC89C52RC是一款高性能、低功耗的单片机,具有强大的处理能力和丰富的外设资源,非常适合用于控制型应用。

2.使用LCD1602做显示屏。LCD1602是一种常用的液晶显示器,能够显示数字、字母等信息。在本程序中,LCD1602用于显示欢迎界面、货物信息等。

3.使用按键做货物选择、投币、确定、返回等选择。按键是一种常用的输入设备,可以用于控制程序的运行流程。在本程序中,按键用于选择货物、投币、确定购买、返回等操作。

4.使用步进电机控制出货口。步进电机是一种常用的电机,能够精确控制转动角度。在本程序中,步进电机用于控制出货口的开合,实现自动出货功能。

5.使用蜂鸣器做报警提示。蜂鸣器是一种常用的声音输出设备,能够发出警报声。在本程序中,蜂鸣器用于提示付款完成,伴随电机转动,自动出货。

总体来说,这是一个基于STC89C52RC单片机的自动售货程序,能够实现自动售货功能,具有良好的用户体验和稳定性。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-2 23:15:16 | 显示全部楼层
这个自动售货程序的设计非常不错,所有的硬件设备都能够很好地协同工作,以实现自动售货机的功能。以下是程序实现方面的一些建议:

1. 使用中断来处理按键输入。这样可以避免在轮询过程中影响程序的响应速度,提高程序的效率。

2. 考虑使用定时器来控制电机的运转时间。这样可以避免电机一直运转,或者因为误操作导致电机长时间停止运转,从而保护电机的寿命。

3. 在程序中加入货物库存管理功能。当某种货物售完时,自动售货机需要提示用户并暂停服务,以便进行补货。同时,在进行销售统计时,也需要考虑货物库存量的变化。

4. 加入退币功能。在用户投币之后,如果出现货物故障或者其他问题,自动售货机需要自动退还投币金额,以保护用户的权益。

5. 在代码中加入异常处理机制。当出现电机故障、传感器故障等情况时,程序需要及时检测并给出相应的提示,以保证自动售货机的正常运行。

希望这些建议能对您的自动售货机设计有所帮助。祝您的设计能够成功实现!
如果问题已经解决,请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-2 23:16:21 | 显示全部楼层
这是一个很有趣的自动售货程序设计!以下是一个简单的C语言程序框架,可以供你参考:
  1. #include <reg52.h> //STC89C52RC专用头文件
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit motor = P1^0; //定义步进电机控制引脚
  5. sbit buzzer = P1^1; //定义蜂鸣器控制引脚
  6. sbit coin_slot = P2^0; //定义投币口输入引脚
  7. sbit confirm_btn = P2^1; //定义确认按钮输入引脚
  8. sbit cancel_btn = P2^2; //定义取消按钮输入引脚
  9. sbit return_btn = P2^3; //定义返回按钮输入引脚
  10. sbit lcd_rs = P3^0; //定义LCD数据/命令选择引脚
  11. sbit lcd_rw = P3^1; //定义LCD读/写选择引脚
  12. sbit lcd_e = P3^2; //定义LCD使能引脚
  13. void delay(uint x); //延时函数
  14. void init_lcd(); //LCD初始化函数
  15. void display_string(uchar row, uchar col, uchar *str); //在指定位置显示字符串函数
  16. uchar read_keypad(); //读取按键函数
  17. void main()
  18. {
  19.     init_lcd();
  20.     display_string(0, 0, "Welcome!"); //欢迎界面
  21.     //货物信息数组
  22.     uchar goods[4][16] = {
  23.         "1. Coke $1 ",
  24.         "2. Pepsi $1",
  25.         "3. Sprite $1",
  26.         "4. Water $0.5"
  27.     };
  28.     //货物价格数组
  29.     float prices[4] = {1.0, 1.0, 1.0, 0.5};
  30.     uchar selected_good = 0; //选中的货物编号
  31.     float payment = 0.0; //已付款金额
  32.     float price = 0.0; //选中货物的价格
  33.     while (1)
  34.     {
  35.         //选择货物
  36.         display_string(0, 0, goods[selected_good]); //显示当前选中的货物信息
  37.         display_string(1, 0, "Insert coin: $"); //提示投币
  38.         while (1)
  39.         {
  40.             uchar key = read_keypad(); //读取按键
  41.             if (key == 'C') //按下取消按钮,退出选择
  42.             {
  43.                 payment = 0.0;
  44.                 break;
  45.             }
  46.             else if (key == 'R') //按下返回按钮,返回上一级
  47.             {
  48.                 if (selected_good > 0)
  49.                     selected_good--;
  50.             }
  51.             else if (key == 'E') //按下确认按钮,进入付款环节
  52.             {
  53.                 price = prices[selected_good]; //获取选中货物的价格
  54.                 break;
  55.             }
  56.             else if (key >= '1' && key <= '4') //按下数字键,选择对应货物
  57.             {
  58.                 selected_good = key - '1';
  59.             }
  60.         }
  61.         //付款
  62.         if (price > 0)
  63.         {
  64.             display_string(1, 14, " "); //清空原来的付款金额
  65.             while (payment < price) //如果没有达到商品价格,一直提示付款
  66.             {
  67.                 uchar key = read_keypad();
  68.                 if (key == 'C') //按下取消按钮,退出付款
  69.                 {
  70.                     payment = 0.0;
  71.                     break;
  72.                 }
  73.                 else if (key >= '0' && key <= '9') //按下数字键,增加付款金额
  74.                 {
  75.                     payment += key - '0';
  76.                     display_string(1, 14, "%2.1f", payment); //显示当前已付款金额
  77.                 }
  78.             }
  79.             //付款成功,出货
  80.             if (payment >= price)
  81.             {
  82.                 payment -= price; //计算找零金额
  83.                 display_string(1, 14, "OK"); //显示付款成功
  84.                 buzzer = 1; //发出报警提示音
  85.                 motor = 1; //转动步进电机,开启出货口
  86.                 delay(10000); //等待一段时间,让电机转动
  87.                 motor = 0; //关闭出货口
  88.                 buzzer = 0; //关闭报警提示音
  89.             }
  90.         }
  91.     }
  92. }
  93. //延时函数,以10us为单位
  94. void delay(uint x)
  95. {
  96.     while (x--);
  97. }
  98. //LCD初始化函数
  99. void init_lcd()
  100. {   
  101.     lcd_rw = 0; //切换到写入模式
  102.     lcd_e = 0; //置低使能引脚
  103.     delay(2000); //等待超过40ms
  104.     lcd_rs = 0; //选择命令寄存器
  105.     P0 = 0x38; //8位数据总线,2行显示,5x7点阵字符
  106.     lcd_e = 1; //置高使能引脚,上升沿时才有效
  107.     delay(5); //延时至少1us
  108.     lcd_e = 0; //置低使能引脚,下降沿时写入数据
  109.     delay(2000); //等待超过100us
  110.     P0 = 0x0c; //显示开,光标关,光标闪烁关
  111.     lcd_e = 1;
  112.     delay(5);
  113.     lcd_e = 0;
  114.     delay(2000);
  115.     P0 = 0x01; //清屏,且光标复位到起始位置
  116.     lcd_e = 1;
  117.     delay(5);
  118.     lcd_e = 0;
  119.     delay(2000);
  120.     P0 = 0x06; //设定文字加法,文字移动不移动屏幕
  121.     lcd_e = 1;
  122.     delay(5);
  123.     lcd_e = 0;
  124.     delay(2000);
  125. }
  126. //在指定位置显示字符串函数
  127. void display_string(uchar row, uchar col, uchar *str)
  128. {
  129.     uchar address;
  130.     if (row == 0)
  131.         address = 0x80 + col;
  132.     else if (row == 1)
  133.         address = 0xc0 + col;
  134.     else
  135.         return;
  136.     lcd_rs = 0; //选择命令寄存器
  137.     lcd_rw = 0; //切换到写入模式
  138.     lcd_e = 0; //置低使能引脚
  139.     delay(1); //等待
  140.     P0 = address; //写入地址
  141.     lcd_e = 1;
  142.     delay(5);
  143.     lcd_e = 0;
  144.     delay(1);
  145.     lcd_rs = 1; //选择数据寄存器
  146.     lcd_rw = 0;
  147.     while (*str)
  148.     {
  149.         P0 = *str++;
  150.         lcd_e = 1;
  151.         delay(5);
  152.         lcd_e = 0;
  153.         delay(1);
  154.     }
  155. }
  156. //读取按键函数
  157. uchar read_keypad()
  158. {
  159.     uchar key = ' '; //默认返回空格
  160.     if (coin_slot == 0) //检测投币口输入引脚
  161.     {
  162.         delay(1000); //去抖
  163.         if (coin_slot == 0)
  164.             key = 'I'; //插入硬币
  165.     }
  166.     else if (confirm_btn == 0) //检测确认按钮输入引脚
  167.     {
  168.         delay(1000); //去抖
  169.         if (confirm_btn == 0)
  170.             key = 'E'; //确认
  171.     }
  172.     else if (cancel_btn == 0) //检测取消按钮输入引脚
  173.     {
  174.         delay(1000); //去抖
  175.         if (cancel_btn == 0)
  176.             key = 'C'; //取消
  177.     }
  178.     else if (return_btn == 0) //检测返回按钮输入引脚
  179.     {
  180.         delay(1000); //去抖
  181.         if (return_btn == 0)
  182.             key = 'R'; //返回
  183.     }
  184.     else //按键未被按下
  185.     {
  186.         key = ' '; //返回空格
  187.     }
  188.     return key;
  189. }
复制代码

注意:以上代码是一个简化的程序框架,具体实现可能需要进行更多的优化和修改。另外,程序中用到了很多简单的IO控制、LCD显示和延时等操作,如果对这些操作不熟悉,建议先学习相关知识。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-12 00:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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