【STM32单片机】数学自动出题器设计

news2024/10/7 14:33:03

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用STM32F103C8T6单片机控制器,使用按键、IIC OLED模块等。
主要功能:
系统运行后,OLED液晶显示出题器开机界面,默认结果范围为100,可按下S13键进入范围值设置,S1-S10键输入0-9数字,最大输入3位数;若输入有误可按下S11键撤回,若输入完成,可按下S12键进入答题界面;如果无需设置,则按下S16键进入答题界面;出题的计算结果范围则为前面设置的范围内。
此时显示屏会显示答题时间、得分、计算题(程序内设置了加减乘除,默认仅开启加减运算功能)和计算结果输入窗口,可按下S1-S10键输入答案,如果结果正确,
得分+5,否则显示错误提示,且需重新输入结果。答案正确则自动进入下一题,如此循环。当得分为100,则完成测试。


二、软件设计

/*
作者:嗨小易(QQ:3443792007)

*/


//系统生成题目
void sys_generate_subject(void)
{
	u8 key=0;
	u8 buf[3];
	u16 result=0;
	
	OLED_Clear();
	OLED_ShowString(0,0, "00:00:00   Socre:   ",12);
	OLED_ShowString((X_WIDTH-6*12)/2,16,"  +  =",24);
	OLED_DrawRectanglex(0,45,X_WIDTH,18,1);
	OLED_ShowString(2,46,"-->   ",16);
	
	TIM_Cmd(TIM3,ENABLE); //打开定时器	
	
	while(1)
	{
		//显示时间
		OLED_ShowxNum(0,0,sys_ctrl.hour,2,12,0x80,1);
		OLED_ShowxNum(6*3,0,sys_ctrl.min,2,12,0x80,1);
		OLED_ShowxNum(6*6,0,sys_ctrl.sec,2,12,0x80,1);
		//显示得分
		OLED_ShowxNum(17*6,0,sys_ctrl.score,3,12,0x80,1);
		
		//开始生成题目
		if(sys_ctrl.start==1)
		{
			sys_ctrl.start=0;
			srand(sys_ctrl.sec);//播种
			//生成随机符号值,加和减
			sys_ctrl.sign=rand()%2;
			//显示符号
			switch(sys_ctrl.sign)
			{
				case 0://加
					OLED_ShowString((X_WIDTH-6*12)/2+2*12,16,"+",24);
					//生成有效的两个计算数,在指定范围数内
					//rand() % (b-a+1)+ a ; 就表示 a~b 之间的一个随机整数
					sys_ctrl.num[0]=rand()%((sys_ctrl.range-1)-1+1)+1;
					sys_ctrl.num[1]=rand()%(sys_ctrl.range-sys_ctrl.num[0])+1;
					break;
				case 1://减
					OLED_ShowString((X_WIDTH-6*12)/2+2*12,16,"-",24);
					//生成的第一个数必须大于第二个数
					while(1)
					{
						sys_ctrl.num[0]=rand()%((sys_ctrl.range-1)-1+1)+1;
						sys_ctrl.num[1]=rand()%(sys_ctrl.range-sys_ctrl.num[0])+1;
						if(sys_ctrl.num[0]>=sys_ctrl.num[1])break;
					}
					break;
				case 2://乘
					OLED_ShowString((X_WIDTH-6*12)/2+2*12,16,"*",24);
					sys_ctrl.num[0]=rand()%((sys_ctrl.range-1)-1+1)+1;
					sys_ctrl.num[1]=rand()%(sys_ctrl.range-sys_ctrl.num[0])+1;
					break;
				case 3://除
					OLED_ShowString((X_WIDTH-6*12)/2+2*12,16,"/",24);
					//生成的第一个数必须大于第二个数
					while(1)
					{
						sys_ctrl.num[0]=rand()%((sys_ctrl.range-1)-1+1)+1;
						sys_ctrl.num[1]=rand()%(sys_ctrl.range-sys_ctrl.num[0])+1;
						if(sys_ctrl.num[0]>=sys_ctrl.num[1])break;
					}
					break;
			}
			//显示生成的两个计算数
			OLED_ShowxNum((X_WIDTH-6*12)/2,16,sys_ctrl.num[0],2,24,0,1);
			OLED_ShowxNum((X_WIDTH-6*12)/2+3*12,16,sys_ctrl.num[1],2,24,0,1);
		}
		//开始答题
		else
		{
			key=KEY_Matrix_Scan();
			if(key!=0)BEEP_Alarm(50,100);//提示音
			//输入数值键范围0-9
			if(key>0 && key<=10)
			{
				//最多输入3位数
				if(sys_ctrl.cnt<3)
				{
					//第一位输入0,后面都是0
					if(sys_ctrl.cnt==0 && key==1)
					{
						buf[sys_ctrl.cnt]=key-1;
						OLED_ShowNum(2+8*3+(sys_ctrl.cnt)*8,46,buf[sys_ctrl.cnt-1],1,16);
					}	
					else
					{
						buf[sys_ctrl.cnt]=key-1;
						sys_ctrl.cnt++;//输入位数+1
						OLED_ShowNum(2+8*3+(sys_ctrl.cnt-1)*8,46,buf[sys_ctrl.cnt-1],1,16);
					}	
				}
			}
			//按下删除键
			else if(key==11)
			{
				sys_ctrl.cnt--;
				if(sys_ctrl.cnt<0)sys_ctrl.cnt=0;
				OLED_ShowString(2+8*3+(sys_ctrl.cnt)*8,46," ",16);
			}	
			//按下确定键
			else if(key==12)
			{
				//获取范围值
				switch(sys_ctrl.cnt)
				{
					case 1://1位
						sys_ctrl.result=buf[0];
						break;
					case 2://2位
						sys_ctrl.result=buf[0]*10+buf[1];
						break;
					case 3://3位
						sys_ctrl.result=buf[0]*100+buf[1]*10+buf[2];
						break;
				}
				
				//根据符号计算生成题目的数值
				switch(sys_ctrl.sign)
				{
					case 0://加
						result=sys_ctrl.num[0]+sys_ctrl.num[1];
						break;
					case 1://减
						result=sys_ctrl.num[0]-sys_ctrl.num[1];
						break;
					case 2://乘
						result=sys_ctrl.num[0]*sys_ctrl.num[1];
						break;
					case 3://除
						result=sys_ctrl.num[0]/sys_ctrl.num[1];
						break;
				}
				//如果答题正确
				if(result==sys_ctrl.result)
				{
					sys_ctrl.start=1;
					sys_ctrl.cnt=0;
					sys_ctrl.score+=5;
					if(sys_ctrl.score>=100)
					{
						TIM_Cmd(TIM3,DISABLE); //关闭定时器
						sys_parm_init();//系统参数初始化
						break;
					}	
					OLED_ShowString(2+8*3,46,"   ",16);
				}
				//如果答题错误
				else
				{
					sys_ctrl.cnt=0;
					OLED_ShowString(2+8*3,46,"Error!",16);
					OLED_Refresh_Gram();//刷新显示缓存
					delay_ms(500);
					OLED_ShowString(2+8*3,46,"      ",16);
				}
			}		
		}
		
		OLED_Refresh_Gram();//刷新显示缓存
	}
}


//应用控制系统
void app_sys_ctrl_demo(void)
{
	LED_Init();
	USART1_Init(115200);
	OLED_Init();
	KEY_Matrix_Init();
	BEEP_Init();
	TIM3_Init(1000,36000-1);  //定时500ms
	sys_parm_init();//系统参数初始化
	
	while(1)
	{
		sys_open_show();//系统开机界面显示
		sys_generate_subject();//系统生成题目
	}
}





三、实验现象

B站演示视频:https://space.bilibili.com/444388619

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对干扰SAY NO!GNSS模拟将提供伽利略OS-NMA功能(二)

上一章主要介绍了OS-NMA架构、测试载体和虹科Safran Skydel仿真引擎中的测试向量。本章将继续为大家介绍虹科Safran GNSS模拟如何使用OS-NMA场景及解决方案等内容。 测试GNSS接收器 在这一部分中&#xff0c;我们将演示如何使用OS-NMA场景&#xff0c;并提供如何修改它们以执…

QT基础入门——QMainWindow与对话框QDialog(三)

前言&#xff1a; Qt 并没有专门的菜单项类&#xff0c;只是使用一个QAction类&#xff0c;抽象出公共的动作。当我们把QAction对象添加到菜单&#xff0c;就显示成一个菜单项&#xff0c;添加到工具栏&#xff0c;就显示成一个工具按钮。用户可以通过点击菜单项、点击工具栏按…

asp.net闲置物品购物网系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net闲置物品购物网系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语 言开发 asp.net 闲置物品购物网 二、功…

2023年中国非晶纳米晶竞争格局、产业链及行业产量分析[图]

非晶合金又称“液态金属、金属玻璃”&#xff0c;是一种新型软磁合金材料&#xff0c;主要包含铁、硅、硼等元素。其主要制品非晶合金薄带的制造工艺是采用急速冷却技术将合金熔液以每秒106℃的速度急速冷却&#xff0c;形成厚度约0.03mm的非晶合金薄带&#xff0c;物理状态表现…

华为云ModelArts:引领AI艺术创作的未来,让人人都可以成为“艺术家”!

随着科技的飞速发展,艺术创作逐渐告别传统的画布和画笔,开始走向数字化、智能化的新时代。在这个蓬勃发展的领域中,华为云ModelArts以其强大的功能和出色的性能引领着AI艺术创作的未来。 华为云ModelArts是面向开发者的一站式AI开发平台,为机器学习与深度学习提供海量数据预处…

【STM32单片机】多功能电子密码锁设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;使用按键、IIC OLED模块、DS18B20温度传感器、SG90舵机、红外遥控、矩阵按键、EEPROM等。 主要功能&#xff1a; 系统运行后&#xff0c;OLED显示RTC日期…

【前段基础入门之】=>CSS3的新增特性!

文章目录 CSS3概述CSS3私有前缀常见浏览器私有前缀 新增盒模型相关属性怪异盒模型拖拽调整盒子大小盒子阴影不透明度 新增背景属性background-originbackground-clipbackground-size多背景图backgorund 复合属性 新增边框属性边框圆角边框外轮廓 新增文本属性文本阴影文本换行文…

用合成数据训练车辆姿态估计神经网络

我们的客户希望开发一款应用程序&#xff0c;引导用户通过 AR 指南和自动照片拍摄来拍摄更高质量的汽车照片。 本文重点介绍构建汽车姿态估计组件的技术。 在应用程序中&#xff0c;用户被引导站在与汽车一定的角度和距离&#xff0c;以标准化的方式捕捉最好的照片。 当用户处于…

1600*C. Good Subarrays(找规律前缀和)

Problem - 1398C - Codeforces 解析&#xff1a; 可以写出 sum[ j ] - sum[ i ] j - i 1&#xff0c;对其移项得 sum[ j ] - j sum[ i ] - &#xff08;i - 1&#xff09;&#xff0c;问题转换为有多少个前缀和相等&#xff0c;则用map遍历统计一遍即可。 注意&#xff0c;当…

QMC5883L-磁力计椭球拟合校准

1.概述 磁力计椭球拟合校准是一种将磁力计测量数据校准到真实磁场的技术。这种技术通常使用椭球模型来拟合磁力计的测量结果&#xff0c;然后通过最小二乘法来找到拟合参数的最优解。 2.总体思想 磁力计椭球拟合校准的思想包括以下几个步骤&#xff1a; 1.数据预处理&#x…

Java 21 新功能展示(含示例)

Java 21 于 2023 年 9 月 19 日发布&#xff0c;是 Oracle 标准 Java 实现的下一个长期支持&#xff08;LTS&#xff09;版本。Java 21 具有以下 15 项功能。 字符串模板&#xff08;预览版&#xff09; [JEP-430] 序列集合 [JEP-431] 代 ZGC [JEP-439&#xff3d; 记录模式…

Helm部署EMQX集群

端口说明&#xff1a; 端口说明集群内端口Nodeport备注mqtt188331274Port for MQTTmqttssl888331170Port for MQTT(SSL)mgmt8081无ws808330099Port for WebSocket/HTTPwss808432580Port for WSS/HTTPSdashboard1808331303Port for dashboard 一、Helm在线部署EMQX集群 1、安…

Compose输入框

TextField label设置提示内容&#xff0c;TextFieldDefaults.textFieldColors设置输入框背景颜色 TextField(modifier Modifier.fillMaxWidth().padding(5.dp),value text.value,onValueChange { text.value it },label { Text(text "请输入内容") },colors …

算法题:买卖股票的最佳时机 II

这道题是贪心算法的中级难度练习题&#xff0c;由于题目设定&#xff0c;整个价格都是透明的&#xff0c;这里并不涉及需要预测股票涨势的问题。解决思路不难&#xff0c;就是一旦股票价格开始下降了就买入&#xff0c;一旦上升了&#xff0c;就赶紧卖出。&#xff08;完整题目…

led护眼台灯对眼睛有伤害吗?推荐好用的led护眼台灯

其实led护眼台灯对眼睛伤害是不大的&#xff0c;而且和白炽灯、卤素灯等老式台灯相对比&#xff0c;反而更加护眼。因为白炽灯、卤素灯等光线都不太稳定&#xff0c;而且光线不是很均匀可以明显感觉有明暗差&#xff0c;最主要的是频闪现象会比较严重&#xff0c;长时间使用的话…

Apache Tomcat安装、运行

介绍 Apache Tomcat是下面多个规范的一个开源实现&#xff1a;Jakarta Servlet、Jakarta Server Pages、Jakarta Expression Language、Jakarta WebSocket、Jakarta Annotations 和 Jakarta Authentication。这些规范是 Jakarta EE 平台的一部分。 Jakarta EE 平台是Java EE平…

Vue Router的使用

使用 项目中注入路由器 在项目中 src 目录下新建 router 目录&#xff0c;其中包含 index.js 路由主文件。 // src/router/index.jsimport Vue from vue import Router from vue-router import { routes } from ./routes.jsVue.use(Router) const router new Router({route…

EPDB 08、EPDBS 10、PDRV、EPDZA06插装式比例减压阀放大器

比例方向阀W42E-5PS03、W43E-5PS05、W42E-1AS06、W43E-1AS06、插装式S22E-1V08放大器。 该放大器既可用于工业及移动设备应用&#xff0c;也可用于固定安装。因此&#xff0c;电压范围非常宽&#xff0c;在8至35VDC之间变化。这些放大器对欠压和电压尖峰非常不敏感&#xff0c…

浅谈时间流管理体系

不想聊技术&#xff0c;但又想分享一些东西&#xff0c;这篇文章分享下如何构造自己的时间流管理体系以及如何完整的把控一个事件安排统筹&#xff0c;这里对一个大型事件或大型知识体系如何分解为不同问题的小点不做点出&#xff0c;这里只提时间管理体系化。 好处的话也不做阐…