以下是一个简单的51单片机自动售货机程序,能够实现多款商品根据货道同时出货并在LCD上显示,出货后自动找零。

代码如下:

#include <reg51.h> #include <stdio.h>

sbit LED = P1^0; //LED灯 sbit LCD_RS = P2^0; //LCD1602 RS引脚 sbit LCD_RW = P2^1; //LCD1602 RW引脚 sbit LCD_E = P2^2; //LCD1602 E引脚 sbit LCD_D4 = P2^4; //LCD1602 D4引脚 sbit LCD_D5 = P2^5; //LCD1602 D5引脚 sbit LCD_D6 = P2^6; //LCD1602 D6引脚 sbit LCD_D7 = P2^7; //LCD1602 D7引脚

unsigned char code table[] = "0123456789"; unsigned char code price[] = {10, 15, 20}; //商品价格,分别对应货道1、2、3 unsigned char code name1[] = "Coca-Cola"; //商品1名称 unsigned char code name2[] = "Pepsi"; //商品2名称 unsigned char code name3[] = "Sprite"; //商品3名称 unsigned char stock[] = {10, 10, 10}; //商品库存,分别对应货道1、2、3 unsigned char money = 0; //用户投入的金额 unsigned char choice = 0; //用户选择的货道

void delay(unsigned int i) //延时函数 { unsigned int j, k; for(j = i; j > 0; j--) { for(k = 110; k > 0; k--); } }

void write_command(unsigned char command) //写命令函数 { LCD_RS = 0; LCD_RW = 0; LCD_E = 0; LCD_D7 = command & 0x80; LCD_D6 = command & 0x40; LCD_D5 = command & 0x20; LCD_D4 = command & 0x10; LCD_E = 1; delay(5); LCD_E = 0; LCD_D7 = command & 0x08; LCD_D6 = command & 0x04; LCD_D5 = command & 0x02; LCD_D4 = command & 0x01; LCD_E = 1; delay(5); LCD_E = 0; }

void write_data(unsigned char data) //写数据函数 { LCD_RS = 1; LCD_RW = 0; LCD_E = 0; LCD_D7 = data & 0x80; LCD_D6 = data & 0x40; LCD_D5 = data & 0x20; LCD_D4 = data & 0x10; LCD_E = 1; delay(5); LCD_E = 0; LCD_D7 = data & 0x08; LCD_D6 = data & 0x04; LCD_D5 = data & 0x02; LCD_D4 = data & 0x01; LCD_E = 1; delay(5); LCD_E = 0; }

void init_lcd() //初始化LCD1602函数 { write_command(0x28); //设置数据总线为4位,2行显示,5*7点阵字符 write_command(0x0c); //设置光标不显示,不闪烁 write_command(0x06); //设置文字从左到右移动 write_command(0x01); //清屏 }

void display_lcd(unsigned char x, unsigned char y, unsigned char *s) //在LCD上显示字符串函数 { unsigned char i; if(x == 0) write_command(0x80 + y); else write_command(0xc0 + y); for(i = 0; s[i] != '\0'; i++) write_data(s[i]); }

void display_stock() //在LCD上显示商品库存函数 { unsigned char i, j; for(i = 0; i < 3; i++) { display_lcd(0, i, &name1[i * 8]); display_lcd(1, i, "Stock: "); for(j = 0; j < 2; j++) write_data(table[stock[i] / 10 % 10]), write_data(table[stock[i] % 10]), write_data(' '); } }

void display_price() //在LCD上显示商品价格函数 { unsigned char i; for(i = 0; i < 3; i++) { display_lcd(0, i, &name1[i * 8]); display_lcd(1, i, "Price: "); write_data(table[price[i] / 10 % 10]), write_data(table[price[i] % 10]), write_data(' '); } }

void display_money() //在LCD上显示用户投入的金额函数 { display_lcd(0, 0, "Money: "); write_data(table[money / 10 % 10]), write_data(table[money % 10]), write_data(' '); }

void display_choice() //在LCD上显示用户选择的货道函数 { display_lcd(0, 1, "Choice: "); write_data(choice + 49), write_data(' '); display_lcd(1, 1, &name1[(choice - 1) * 8]); }

void display_change() //在LCD上显示找零函数 { display_lcd(0, 2, "Change: "); write_data(table[money / 10 % 10]), write_data(table[money % 10]), write_data(' '); }

void sell(unsigned char x) //出货函数 { if(stock[x - 1] > 0 && money >= price[x - 1]) //判断库存和金额是否充足 { LED = 1; //LED亮起表示出货 delay(1000); //等待1秒 LED = 0; //LED熄灭表示出货完成 stock[x - 1]--; //减少库存 money -= price[x - 1]; //减少金额 display_stock(); //刷新库存显示 display_money(); //刷新金额显示 display_change(); //刷新找零显示 } }

void main() { unsigned char key, i; init_lcd(); //初始化LCD1602 display_stock(); //显示商品库存 while(1) { key = P3; //读取按键 if(key == 0xfe) //选择货道1 { choice = 1; display_choice(); //显示用户选择的货道 } else if(key == 0xfd) //选择货道2 { choice = 2; display_choice(); //显示用户选择的货道 } else if(key == 0xfb) //选择货道3 { choice = 3; display_choice(); //显示用户选择的货道 } else if(key == 0xf7) //投入1元钱 { money += 1; display_money(); //显示用户投入的金额 } else if(key == 0xef) //投入5元钱 { money += 5; display_money(); //显示用户投入的金额 } else if(key == 0xdf) //投入10元钱 { money += 10; display_money(); //显示用户投入的金额 } else if(key == 0xbf) //出货 { sell(choice); //出货 } else if(key == 0x7f) //退币 { money = 0; display_money(); //显示用户投入的金额 display_change(); //显示找零 } }

帮我找一个51单片机自动售货机能实现多款商品根据货道能同时出货并且在lcd上显示出货后找零的程序

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

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