用 51 单片机做的二十四点小游戏

一、任务要求

设计一个模拟纸牌 24 点玩法的单片机模拟器,由单片机随机发出四个牌点,测试者在实验板按键上输入计算过程,单片机判断计算结果是否正确,并评定测试者的成绩。

【基本要求】:

1.测试多组数据

2.单片机在数码管上随机给出 4 张牌点,牌点范围为 1-13,10 到 13 由字符 a,b,c,d 表示

3.在单片机实验板按键中设计 4 个数学运算键 +-×÷

4.4 个数字中每使用完一个后该字符应有明显标识

5.只允许测试者使用四则运算(可加括号)

6.无论测试结果是否正确,均有声光效果提示;

7.测试完毕,由单片机给出测试者的最终成绩

二、功能特点与使用说明

功能特点:

1.使用最低的系统时钟频率,降低功耗

2.键盘扫描使用了软件消抖,防止按键被重复判别为弹起或按下

3.键值判断使用的是键值跳变判断,即使你一直将键盘按下,也不会重复执行命令

4.使用后缀表达式计算字符串算式,代码简洁易懂

使用说明

各键盘功能如表所示:

三、方案设计

1.资源分配:

(1)使用外部晶振 22.1184MHz,使用二分频作为系统时钟;

(2)定时器 T2:

开启中断,系统时钟 12 分频,16 位自动重装模式;

初始值和自动重装值均为 FB80,计算(65536-0xFB80)(12/11059200)=0.00125s=1.25ms,即中断 1.25ms 发生一次;该定时器用来产生 1.25ms 定时,用来扫描键盘,判断其是否被按下,扫描按键,完成一次轮询扫描时间为 51.25ms=6.25ms

(3)定时器 T4:

开启中断,系统时钟 12 分频,16 位自动重装模式;

初始值和自动重装值均为 FB80,计算(65536-0xFB80)*(12/11059200)=0.00125s=1.25ms,即中断 1.25ms 发生一次;该定时器用来产生 1.25ms 定时,用来扫描键值,并执行相应的键盘操作

(4)使用了比较多的全局变量,将不需要修改的常量数据存入外部 RAM 中

2.设计思路:

键盘设计思路:首先通过 T2 扫描键盘,判断键盘是否被按下,这里运用了软件消抖的方法,连续检测到四次键盘被按下(或松开)才会把键值数组里相应的地方置为 1(0)。然后通过 T4 扫描键值数组,如果检测到跳变(防止一直按着某个键,其键值一直为 1,导致其功能一直被反复执行),且跳变后键值为 1,则执行此键位的命令。

LCD 屏设计思路:通过字模软件生成数字字母及运算符号的 32 位字模数组,通过选择左右屏以及生成的 X,Y 坐标可以将数字显示在自己想要的地方主程序设计思路:随机生成四个数并将其存在一个数组之中,然后显示在屏幕的上方。按键选择数或符号,每选择了一个数,就会将其原数所在的区域清除,表示此数以及被选择了,然后将此数或此符号用字符的形式存在一个字符数组里面,最后按下等于键,就会运行计算此字符数组对应的表达式的值的程序,最后结果算出来如果等于 24,则会亮起黄灯,如果错误则会亮绿灯。

计算字符串表达式的设计思路:

1.中缀表达式转换为后缀表达式:a).数字直接入队列 b).运算符要与栈顶元素比较

① 栈为空直接入栈

② 运算符优先级大于栈顶元素优先级则直接入栈

③ 小于或等于则出栈入列,再与栈顶元素进行比较,直到运算符优先级小于栈顶元

素优先级后,操作符再入栈 c).操作符是(则无条件入栈

d).操作符为),则依次出栈入列,直到匹配到第一个(为止,此操作符直接舍弃,(直接出栈舍弃

2.通过逆波兰表达式计算结果:获取字符串表达式的每一项,判断这一项是数据还是操作符,如果是数据,则让它入栈,如果是操作符,让数据出栈,和操作符进行运算

四、流程图

1.主程序 intmain()

2.按键检测子程序 voidKeyboardDriver()

3.按键扫描子程序 voidKeyscan(unsignedcharscannum)

4.中缀表达式转后缀表达式子程序

5.随机数生成子程序 voidset_24()

六、程序测试方法与结果

再按一次生成四个随机数

多次按下可见四个数完全随机

测试按键,选择第一个数

可见第一个数被挪下,且原位置数消失接着测试 +-*/<>

可见功能正常

接着测试计算,首先测试算出来的数不是 24

可见 D2(绿灯)亮起,说明计算错误

接着测试计算,测试算出来的数是 24

可见经过多重括号计算出的值为 24,D1(黄灯亮),说明整个程序是完整可行符合要求的

七、心得与体会

在本次专题实验中我再次深刻体会到单片机是将软件与硬件紧密结合的,软件的编程无法脱离实际的硬件电路而存在,软件的编程是为硬件服务的,硬件工程师需要根据实际实际电路编写程序,而不是纯软件编程。有时候软件上编写正确,硬件上不一定可以实现所想的功能,操纵硬件,是单片机课程的魅力所在。

同时,通过这次专题实验,我强化了我的编程能力,思维,学到了一些编程上的技巧,也学会如何管理自己的代码等。

本次实验中我遇到的最大困难是全局变量和函数内静态变量的使用,不能滥用全局变量和静态变量,对于小容量的单片机来说,内存资源很宝贵,如果占用太多空间,内存不足会导致程序运行异常,我也在这个问题上卡了很久,以后会更加注意单片机内存的利用。

另外本次实验还锻炼了我的动手能力,满足我动手实践的需求,让我这段时间过得相当充实,谢谢老师给我这次机会。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913027.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913027.shtml
英文地址,请注明出处:http://en.pswp.cn/news/913027.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop WordCount 程序实现与执行指南

Hadoop WordCount 程序实现与执行指南 下面是使用Python实现的Hadoop WordCount程序,包含完整的Mapper和Reducer部分。 这个程序可以在PyCharm中本地测试,也可以部署到远程Hadoop集群上运行。 mapper.py import sys# 从标准输入读取数据 for line in sys.stdin:# 移除行首…

数据可视化:5 分钟读懂其核心价值与技术实践

为什么数据可视化成为企业数字化转型的“必修课”&#xff1f;在信息爆炸的时代&#xff0c;企业每天产生海量数据&#xff0c;从客户行为到销售业绩&#xff0c;从供应链运作到市场趋势。如何从这些原始数据中快速提炼有价值的信息&#xff1f;如何将复杂数据转化为直观易懂的…

Python 量化交易安装使用教程

一、什么是量化交易&#xff1f; 量化交易是通过数学模型和计算机程序&#xff0c;自动化地执行证券买卖决策的交易方式。Python 凭借其丰富的生态和强大的数据处理能力&#xff0c;成为量化交易的首选语言。 二、环境准备 建议使用 Anaconda 安装 Python 3.8&#xff0c;方便…

从 PostgreSQL 到 DolphinDB:数据实时同步一站式解决方案

随着越来越多的用户使用 DolphinDB&#xff0c;各种不同的应用的场景也对 DolphinDB 的数据接入提出了不同的要求。部分用户需要将 PostgreSQL 的数据实时同步到 DolphinDB 中来&#xff0c;以满足在 DolphinDB 中使用数据的实时性需求。本篇教程将介绍使用 Debezium 来实时捕获…

关于联咏(Novatek )白平衡色温坐标系探究

目录 一、疑问 二、结论 三、分析 四、释疑 五、仿真模拟 一、疑问 为什么Novatek的白平衡色温坐标系是这个样子的呢?各条直线和曲线分别代表什么含义呢?色温坐标系中所标定的参数代表什么含义呢?如何标定新增一些特殊的光源呢?二、结论

Protein FID:AI蛋白质结构生成模型评估新指标

一、引言&#xff1a;蛋白质生成模型面临的评估挑战 近年来&#xff0c;AI驱动的蛋白质结构生成模型取得了令人瞩目的进展&#xff0c;但如何有效评估这些模型的质量却一直是一个悬而未决的问题。虽然实验验证仍然是金标准&#xff0c;但计算机模拟评估对于快速开发和比较机器…

Vim 高效编辑指南:从基础操作到块编辑的进阶之路

文章目录🔠 一、基础编辑命令(生存必备)⚡ 二、进阶操作:可视化块模式 (Ctrl+v)典型应用场景🚀 三、效率提升技巧💡 四、配置建议(~/.vimrc)结语作为开发者最强大的文本编辑器之一,Vim 的高效操作离不开其命令模式(Normal Mode)。本文将系统性地介绍 Vim 的核心编…

docker学习第一天框架学习以及在redhat7.9安装操作

一.docker是什么。 Docker 是一个开源的容器化平台&#xff0c;通过将应用程序及其依赖项&#xff08;如代码、运行时环境、系统工具等&#xff09;打包到轻量级、可移植的容器中&#xff0c;实现「一次构建&#xff0c;处处运行」的现代化开发模式。它利用了 Linux 内核特性来…

QT控件 使用Font Awesome开源图标库修改QWidget和QML两种界面框架的控件图标

又一个月快要结束了&#xff0c;在这里总结下分别在QWidget和QML两种界面设计模式中应用Font Awesome开源图标库&#xff0c;修改界面的显示图标效果&#xff0c; AriaNg是aria2的可视化web界面工具,其中的图标大都是Font AWesome中的字体图标&#xff0c;某位曾经尝试将AriaNg…

Qt Quick 与 QML(四)qml中的Delegate系列委托组件

一、概念 在QML中&#xff0c;Delegate是一种非常重要的组件&#xff0c;特别是在使用ListView、GridView、PathView等视图组件时。Delegate用于定义每个列表或网格中的项目是如何展示的。通过自定义Delegate&#xff0c;你可以控制每个项目的外观和行为。 Delegate通常是一个…

android图片优化

在 Android 中加载大图时&#xff0c;如果不进行优化处理&#xff0c;很容易导致内存溢出&#xff08;OOM&#xff09;和应用卡顿。以下是几种高效处理大图加载的方法和最佳实践&#xff1a; 1. 使用图片加载库&#xff08;推荐&#xff09; 成熟的第三方库已经处理了内存管理…

【机器人】复现 DOV-SG 机器人导航 | 动态开放词汇 | 3D 场景图

DOV-SG 建了动态 3D 场景图&#xff0c;并使用LLM大型语言模型进行任务分解&#xff0c;从而能够在交互式探索过程中对 3D 场景图进行局部更新。 来自RA-L 2025&#xff0c;适合长时间的 语言引导移动操作&#xff0c;动态开放词汇 3D 场景图。 论文地址&#xff1a;Dynamic …

mongodb 中dbs 时,local代表的是什么

在 MongoDB 中&#xff0c;local 是一个内置的系统数据库&#xff0c;用于存储当前 MongoDB 实例&#xff08;或副本集节点&#xff09;的元数据和内部数据&#xff0c;与其他数据库不同&#xff0c;local 数据库的数据不会被复制到副本集的其他成员。 local 数据库的核心作用 …

Spring Cloud(微服务部署与监控)

&#x1f4cc; 摘要 在微服务架构中&#xff0c;随着服务数量的增长和部署复杂度的提升&#xff0c;如何高效部署、持续监控、快速定位问题并实现自动化运维成为保障系统稳定性的关键。 本文将围绕 Spring Cloud 微服务的部署与监控 展开&#xff0c;深入讲解&#xff1a; 微…

音频动态压缩算法曲线实现

Juce实现动态压缩曲线绘制 动态范围压缩算法&#xff08;Dynamic Range Compression&#xff0c;DRC&#xff09;是将音频信号的动态范围映射到一个较小的范围内的过程&#xff0c;即降低较高的峰值的信号电平&#xff0c;而不处理较安静的部分。DRC被广泛用于音频录制、制作工…

技术视界 | OpenLoong 控制框架:打造通用人形机器人智能系统的中枢基座

在人形机器人向通用性、智能化方向加速演进的当下&#xff0c;控制系统的角色正在发生根本变化&#xff1a;它不再只是底层驱动的接口适配层&#xff0c;也不只是策略调用的转译引擎&#xff0c;而是成为连接具身模型、异构本体与多样化任务的“中枢神经系统”。 在 2025 年张…

IOS 蓝牙连接

最近做一个硬件设备&#xff0c;写IOS相应的数据连接/分析代码时&#xff1b;发现一个问题&#xff0c;如果是开机&#xff0c;每次都能连接上。连接断开后&#xff0c;发现再也扫描不到了。通过第三方工具LightBlue&#xff0c;发现信号是-127。 此时进入设置查看蓝牙设备&am…

【硬核数学 · LLM篇】3.1 Transformer之心:自注意力机制的线性代数解构《从零构建机器学习、深度学习到LLM的数学认知》

我们已经完成了对机器学习和深度学习核心数学理论的全面探索。我们从第一阶段的经典机器学习理论&#xff0c;走到了第二阶段的深度学习“黑盒”内部&#xff0c;用线性代数、微积分、概率论、优化理论等一系列数学工具&#xff0c;将神经网络的每一个部件都拆解得淋漓尽致。 …

flutter封装vlcplayer的控制器

import dart:async;import package:flutter_vlc_player/flutter_vlc_player.dart; import package:flutter/material.dart;class GlobalVlcController extends ChangeNotifier {//设置单例/*static final GlobalVlcController _instance GlobalVlcController._internal();fact…

SEO-滥用元机器人、规范或 hreflang 标签

&#x1f9f1; 一、滥用 Meta Robots 标签 ❌ 常见问题&#xff1a; 问题描述设置了 noindex 不该屏蔽的页面比如产品页、分类页被意外 noindex&#xff0c;导致不被收录设置 nofollow 导致内链失效所有链接都被 nofollow&#xff0c;影响爬虫抓取路径在 <meta> 标签和…