以下是一个51单片机自动售货机对两款不一样的产品同时出货能计算找零的程序,其中产品A的价格为5元,产品B的价格为10元,售货机只接受面额为1元、5元、10元的纸币和硬币。

#include <reg52.h>

#define PRODUCT_A_PRICE 5
#define PRODUCT_B_PRICE 10

sbit MOTOR1 = P1^0;
sbit MOTOR2 = P1^1;

unsigned char product_a_count = 10;
unsigned char product_b_count = 5;

unsigned char balance = 0;  // 余额
unsigned char change = 0;   // 找零

void delay(unsigned int ms)
{
    unsigned int i, j;
    for (i = 0; i < ms; i++) {
        for (j = 0; j < 110; j++);
    }
}

void display(unsigned char num)
{
    P0 = num;
    delay(5);
    P0 = 0xff;
}

void disp_balance()
{
    display(balance / 10);
    delay(10);
    display(balance % 10);
}

void disp_change()
{
    display(change / 10);
    delay(10);
    display(change % 10);
}

void disp_product_a_count()
{
    display(product_a_count / 10);
    delay(10);
    display(product_a_count % 10);
}

void disp_product_b_count()
{
    display(product_b_count / 10);
    delay(10);
    display(product_b_count % 10);
}

void disp_no_change()
{
    display(0);
    delay(1000);
}

void disp_out_of_stock()
{
    display(1);
    delay(1000);
}

void disp_not_enough_money()
{
    display(2);
    delay(1000);
}

void disp_thank_you()
{
    display(3);
    delay(1000);
}

void disp_return_money()
{
    display(4);
    delay(1000);
}

void disp_balance_zero()
{
    display(5);
    delay(1000);
}

void disp_product_a_sold_out()
{
    display(6);
    delay(1000);
}

void disp_product_b_sold_out()
{
    display(7);
    delay(1000);
}

void main()
{
    while(1) {
        if (product_a_count == 0) {
            disp_product_a_sold_out();
        }
        if (product_b_count == 0) {
            disp_product_b_sold_out();
        }

        if (P2 == 0xfe) {  // 选择产品A
            if (product_a_count > 0) {
                if (balance >= PRODUCT_A_PRICE) {
                    MOTOR1 = 1;
                    delay(1000);
                    MOTOR1 = 0;
                    product_a_count--;
                    balance -= PRODUCT_A_PRICE;
                    if (balance > 0) {
                        change = balance;
                        disp_change();
                        balance = 0;
                    }
                    disp_thank_you();
                } else {
                    disp_not_enough_money();
                }
            } else {
                disp_out_of_stock();
            }
        }

        if (P2 == 0xfd) {  // 选择产品B
            if (product_b_count > 0) {
                if (balance >= PRODUCT_B_PRICE) {
                    MOTOR2 = 1;
                    delay(1000);
                    MOTOR2 = 0;
                    product_b_count--;
                    balance -= PRODUCT_B_PRICE;
                    if (balance > 0) {
                        change = balance;
                        disp_change();
                        balance = 0;
                    }
                    disp_thank_you();
                } else {
                    disp_not_enough_money();
                }
            } else {
                disp_out_of_stock();
            }
        }

        if (P2 == 0xfb) {  // 插入纸币或硬币
            if (P3 == 0xfe) {  // 插入1元纸币
                balance += 1;
            }
            if (P3 == 0xfd) {  // 插入5元纸币
                balance += 5;
            }
            if (P3 == 0xfb) {  // 插入10元纸币
                balance += 10;
            }
            disp_balance();
        }

        if (P2 == 0xf7) {  // 退还余额
            if (balance > 0) {
                change = balance;
                disp_change();
                balance = 0;
                disp_return_money();
            } else {
                disp_balance_zero();
            }
        }

        disp_product_a_count();
        disp_product_b_count();
    }
}
``
找一个51单片机自动售货机对两款不一样的产品同时出货能计算找零的程序

原文地址: https://www.cveoy.top/t/topic/d85r 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录