找一个51单片机自动售货机对两款不一样的产品同时出货的程序
以下是一个简单的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 著作权归作者所有。请勿转载和采集!