davidmou 发表于 2023-10-2 23:14:48

自动售货程序

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

5.使用蜂鸣器做报警提示,当付款完成后,蜂鸣器会自动响一下,伴随电机转动,自动出货。(可根据自己想法自由开发程序)

isdkz 发表于 2023-10-2 23:15:15

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

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

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

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

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

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

总体来说,这是一个基于STC89C52RC单片机的自动售货程序,能够实现自动售货功能,具有良好的用户体验和稳定性。

陶远航 发表于 2023-10-2 23:15:16

这个自动售货程序的设计非常不错,所有的硬件设备都能够很好地协同工作,以实现自动售货机的功能。以下是程序实现方面的一些建议:

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

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

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

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

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

希望这些建议能对您的自动售货机设计有所帮助。祝您的设计能够成功实现!
如果问题已经解决,请设置最佳答案

Mike_python小 发表于 2023-10-2 23:16:21

这是一个很有趣的自动售货程序设计!以下是一个简单的C语言程序框架,可以供你参考:


#include <reg52.h> //STC89C52RC专用头文件

#define uchar unsigned char
#define uint unsigned int

sbit motor = P1^0; //定义步进电机控制引脚
sbit buzzer = P1^1; //定义蜂鸣器控制引脚
sbit coin_slot = P2^0; //定义投币口输入引脚
sbit confirm_btn = P2^1; //定义确认按钮输入引脚
sbit cancel_btn = P2^2; //定义取消按钮输入引脚
sbit return_btn = P2^3; //定义返回按钮输入引脚
sbit lcd_rs = P3^0; //定义LCD数据/命令选择引脚
sbit lcd_rw = P3^1; //定义LCD读/写选择引脚
sbit lcd_e = P3^2; //定义LCD使能引脚

void delay(uint x); //延时函数
void init_lcd(); //LCD初始化函数
void display_string(uchar row, uchar col, uchar *str); //在指定位置显示字符串函数
uchar read_keypad(); //读取按键函数

void main()
{
    init_lcd();
    display_string(0, 0, "Welcome!"); //欢迎界面

    //货物信息数组
    uchar goods = {
      "1. Coke $1 ",
      "2. Pepsi $1",
      "3. Sprite $1",
      "4. Water $0.5"
    };

    //货物价格数组
    float prices = {1.0, 1.0, 1.0, 0.5};

    uchar selected_good = 0; //选中的货物编号
    float payment = 0.0; //已付款金额
    float price = 0.0; //选中货物的价格

    while (1)
    {
      //选择货物
      display_string(0, 0, goods); //显示当前选中的货物信息
      display_string(1, 0, "Insert coin: $"); //提示投币
      while (1)
      {
            uchar key = read_keypad(); //读取按键
            if (key == 'C') //按下取消按钮,退出选择
            {
                payment = 0.0;
                break;
            }
            else if (key == 'R') //按下返回按钮,返回上一级
            {
                if (selected_good > 0)
                  selected_good--;
            }
            else if (key == 'E') //按下确认按钮,进入付款环节
            {
                price = prices; //获取选中货物的价格
                break;
            }
            else if (key >= '1' && key <= '4') //按下数字键,选择对应货物
            {
                selected_good = key - '1';
            }
      }

      //付款
      if (price > 0)
      {
            display_string(1, 14, " "); //清空原来的付款金额
            while (payment < price) //如果没有达到商品价格,一直提示付款
            {
                uchar key = read_keypad();
                if (key == 'C') //按下取消按钮,退出付款
                {
                  payment = 0.0;
                  break;
                }
                else if (key >= '0' && key <= '9') //按下数字键,增加付款金额
                {
                  payment += key - '0';
                  display_string(1, 14, "%2.1f", payment); //显示当前已付款金额
                }
            }

            //付款成功,出货
            if (payment >= price)
            {
                payment -= price; //计算找零金额
                display_string(1, 14, "OK"); //显示付款成功
                buzzer = 1; //发出报警提示音
                motor = 1; //转动步进电机,开启出货口
                delay(10000); //等待一段时间,让电机转动
                motor = 0; //关闭出货口
                buzzer = 0; //关闭报警提示音
            }
      }
    }
}

//延时函数,以10us为单位
void delay(uint x)
{
    while (x--);
}

//LCD初始化函数
void init_lcd()
{   
    lcd_rw = 0; //切换到写入模式
    lcd_e = 0; //置低使能引脚
    delay(2000); //等待超过40ms
    lcd_rs = 0; //选择命令寄存器
    P0 = 0x38; //8位数据总线,2行显示,5x7点阵字符
    lcd_e = 1; //置高使能引脚,上升沿时才有效
    delay(5); //延时至少1us
    lcd_e = 0; //置低使能引脚,下降沿时写入数据
    delay(2000); //等待超过100us
    P0 = 0x0c; //显示开,光标关,光标闪烁关
    lcd_e = 1;
    delay(5);
    lcd_e = 0;
    delay(2000);
    P0 = 0x01; //清屏,且光标复位到起始位置
    lcd_e = 1;
    delay(5);
    lcd_e = 0;
    delay(2000);
    P0 = 0x06; //设定文字加法,文字移动不移动屏幕
    lcd_e = 1;
    delay(5);
    lcd_e = 0;
    delay(2000);
}

//在指定位置显示字符串函数
void display_string(uchar row, uchar col, uchar *str)
{
    uchar address;
    if (row == 0)
      address = 0x80 + col;
    else if (row == 1)
      address = 0xc0 + col;
    else
      return;
    lcd_rs = 0; //选择命令寄存器
    lcd_rw = 0; //切换到写入模式
    lcd_e = 0; //置低使能引脚
    delay(1); //等待
    P0 = address; //写入地址
    lcd_e = 1;
    delay(5);
    lcd_e = 0;
    delay(1);
    lcd_rs = 1; //选择数据寄存器
    lcd_rw = 0;
    while (*str)
    {
      P0 = *str++;
      lcd_e = 1;
      delay(5);
      lcd_e = 0;
      delay(1);
    }
}

//读取按键函数
uchar read_keypad()
{
    uchar key = ' '; //默认返回空格
    if (coin_slot == 0) //检测投币口输入引脚
    {
      delay(1000); //去抖
      if (coin_slot == 0)
            key = 'I'; //插入硬币
    }
    else if (confirm_btn == 0) //检测确认按钮输入引脚
    {
      delay(1000); //去抖
      if (confirm_btn == 0)
            key = 'E'; //确认
    }
    else if (cancel_btn == 0) //检测取消按钮输入引脚
    {
      delay(1000); //去抖
      if (cancel_btn == 0)
            key = 'C'; //取消
    }
    else if (return_btn == 0) //检测返回按钮输入引脚
    {
      delay(1000); //去抖
      if (return_btn == 0)
            key = 'R'; //返回
    }
    else //按键未被按下
    {
      key = ' '; //返回空格
    }
    return key;
}


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

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 自动售货程序