|
发表于 2023-10-2 23:16:21
|
显示全部楼层
这是一个很有趣的自动售货程序设计!以下是一个简单的C语言程序框架,可以供你参考:
- #include <reg52.h> //STC89C52RC专用头文件
- #define uchar unsigned char
- #define uint unsigned int
- sbit 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显示和延时等操作,如果对这些操作不熟悉,建议先学习相关知识。
球一个最佳答案谢谢啦!这对我非常重要!  
|
|