以下是一个简单的51单片机自动售货机对两款不一样的产品同时出货的程序:

#include <reg51.h>
#define LCD P1 //定义LCD显示端口

sbit RS = P0^0; //定义控制线
sbit RW = P0^1;
sbit EN = P0^2;
sbit Key1 = P3^0; //定义按键
sbit Key2 = P3^1;

unsigned char code Product1[16] = "Product1: $1.00"; //定义产品1信息
unsigned char code Product2[16] = "Product2: $1.50"; //定义产品2信息
unsigned char code InsertCoin[16] = "Insert Coin: $0.25"; //定义投币提示信息
unsigned char code ThankYou[16] = "Thank You!"; //定义感谢信息

unsigned char Product1Amount = 5; //定义产品1数量
unsigned char Product2Amount = 3; //定义产品2数量
unsigned char CoinAmount = 0; //定义投币数量

void DelayMs(unsigned int i) //延时函数
{
    unsigned int j, k;
    for(j = 0; j < i; j++)
    {
        for(k = 0; k < 125; k++);
    }
}

void LcdBusy() //忙检测函数
{
    LCD = 0xFF;
    RS = 0;
    RW = 1;
    EN = 0;
    while(LCD & 0x80);
}

void LcdWriteCmd(unsigned char cmd) //写命令函数
{
    LcdBusy();
    LCD = cmd;
    RS = 0;
    RW = 0;
    EN = 1;
    DelayMs(1);
    EN = 0;
}

void LcdWriteData(unsigned char dat) //写数据函数
{
    LcdBusy();
    LCD = dat;
    RS = 1;
    RW = 0;
    EN = 1;
    DelayMs(1);
    EN = 0;
}

void LcdInit() //LCD初始化函数
{
    LcdWriteCmd(0x38); //设置16*2显示,5*8点阵,8位数据接口
    LcdWriteCmd(0x0C); //显示开,光标关,光标闪烁关
    LcdWriteCmd(0x06); //光标右移,字符不移动
    LcdWriteCmd(0x01); //清屏
}

void DisplayProduct1() //显示产品1信息函数
{
    LcdWriteCmd(0x80); //第1行第1个字符
    for(unsigned char i = 0; i < 16; i++)
    {
        LcdWriteData(Product1[i]);
    }
}

void DisplayProduct2() //显示产品2信息函数
{
    LcdWriteCmd(0xC0); //第2行第1个字符
    for(unsigned char i = 0; i < 16; i++)
    {
        LcdWriteData(Product2[i]);
    }
}

void DisplayInsertCoin() //显示投币提示信息函数
{
    LcdWriteCmd(0x80); //第1行第1个字符
    for(unsigned char i = 0; i < 16; i++)
    {
        LcdWriteData(InsertCoin[i]);
    }
}

void DisplayCoinAmount() //显示投币数量函数
{
    LcdWriteCmd(0xC0); //第2行第1个字符
    LcdWriteData('$');
    LcdWriteData(' ');
    LcdWriteData(CoinAmount / 100 + '0'); //百位
    LcdWriteData((CoinAmount % 100) / 10 + '0'); //十位
    LcdWriteData('.');
    LcdWriteData(CoinAmount % 10 + '0'); //个位
}

void DisplayThankYou() //显示感谢信息函数
{
    LcdWriteCmd(0x80); //第1行第1个字符
    for(unsigned char i = 0; i < 16; i++)
    {
        LcdWriteData(ThankYou[i]);
    }
}

void DispensingProduct1() //出售产品1函数
{
    if(Product1Amount > 0 && CoinAmount >= 100) //如果产品1数量大于0且投币数量大于等于1.00
    {
        Product1Amount--; //产品1数量减1
        CoinAmount -= 100; //投币数量减1.00
        DisplayThankYou(); //显示感谢信息
        DelayMs(2000); //延时2秒
        DisplayProduct1(); //重新显示产品1信息
        DisplayProduct2(); //重新显示产品2信息
        DisplayCoinAmount(); //重新显示投币数量
    }
}

void DispensingProduct2() //出售产品2函数
{
    if(Product2Amount > 0 && CoinAmount >= 150) //如果产品2数量大于0且投币数量大于等于1.50
    {
        Product2Amount--; //产品2数量减1
        CoinAmount -= 150; //投币数量减1.50
        DisplayThankYou(); //显示感谢信息
        DelayMs(2000); //延时2秒
        DisplayProduct1(); //重新显示产品1信息
        DisplayProduct2(); //重新显示产品2信息
        DisplayCoinAmount(); //重新显示投币数量
    }
}

void main()
{
    LcdInit(); //LCD初始化
    DisplayProduct1(); //显示产品1信息
    DisplayProduct2(); //显示产品2信息
    DisplayInsertCoin(); //显示投币提示信息
    DisplayCoinAmount(); //显示投币数量
    while(1)
    {
        if(!Key1) //如果按下按键1
        {
            CoinAmount += 25; //投币数量加0.25
            DisplayCoinAmount(); //显示投币数量
        }
        if(!Key2) //如果按下按键2
        {
            DispensingProduct1(); //出售产品1
            DispensingProduct2(); //出售产品2
        }
        DelayMs(10); //延时10毫秒
    }
}

在这个程序中,我们使用了LCD显示器来显示产品信息、投币提示信息、投币数量和感谢信息。按键1用于投币,每次按下会增加投币数量0.25,按键2用于出售产品,每次按下会同时出售产品1和产品2。出售产品的条件是产品数量大于0且投币数量大于等于产品价格。出售成功后,会显示感谢信息,并延时2秒后重新显示产品信息和投币数量。程序中的延时函数可以根据需要进行调整


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

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