这是一个很有趣的自动售货程序设计!以下是一个简单的C语言程序框架,可以供你参考:#include <reg52.h> //STC89C52RC专用头文件#define uchar unsigned char#define uint unsigned intsbit 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[4][16] = { "1. Coke $1 ", "2. Pepsi $1", "3. Sprite $1", "4. Water $0.5" }; //货物价格数组 float prices[4] = {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[selected_good]); //显示当前选中的货物信息 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[selected_good]; //获取选中货物的价格 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显示和延时等操作,如果对这些操作不熟悉,建议先学习相关知识。
球一个最佳答案谢谢啦!这对我非常重要!
|