题目 3 :20 以内加减法训练机
基于单片机实现 20 以内整数加减法训练,要求具有加法、减法(结果不出现负数)、加
减法三种训练模式,每次训练随机产生题目。
可以选择每次训练题目的数目,可分为每组 5 题、10 题、15 题目三档。可自动判断对
错并在完成每组题目后给出做正确的次数。要求具有较好的人机交互界面,用户体验好。
具体要求如下:
(1)具有加法、减法、减法混合三种训练模式。
(2)可以选择答题数量(分 5 题、10 题、15 题三档)
(3)在某种训练模式下,可随机产生题目,用户根据提示输入计算结果,机器自动判
断是否正确。
(4)答完一组题目后,可以显示答题正确的次数,当全部答对时,要有祝贺提示(如
屏幕闪烁,LED 闪烁等)
在本文中,我们将介绍一款基于单片机实现的20以内加减法训练机。这款设备旨在帮助用户练习20以内的整数加减法,通过具有良好的人机交互界面和用户体验,使训练过程变得更加有趣和高效。
该训练机具有以下功能特性:
多种训练模式:支持加法、减法和加减法混合三种训练模式。
题目数量选择:用户可以选择每次训练的题目数量,分为5题、10题和15题三档。
自动判断对错:机器可以自动判断用户的回答是否正确,并在完成每组题目后给出正确答案的数量。
答对提示:当用户答对全部题目时,屏幕和LED会闪烁表示祝贺。
单片机:使用M16单片机作为主控芯片,8MHz晶振。
显示屏:1602 LCD显示屏用于显示题目和结果。
矩阵键盘:用于用户输入答案。
将1602 LCD显示屏的各个引脚与单片机的相应IO口连接,初始化显示屏的IO口。
矩阵键盘的引脚与单片机的IO口连接,用于检测用户输入的按键。
为了确保系统的稳定性,我们定义了一些延时函数,用于在不同操作之间引入适当的延时:
cvoid delay_1us(void) {
asm ("nop");
asm ("nop");
asm ("nop");
asm ("nop");
asm ("nop");
asm ("nop");
}
void delay_3us(void) {
for (int i = 0; i < 3; i++) {
delay_1us();
}
}
void delay_10us(void) {
for (int i = 0; i < 10; i++) {
delay_1us();
}
}
void delay_100us(void) {
for (int i = 0; i < 100; i++) {
delay_1us();
}
}
void delay_1ms(void) {
for (int i = 0; i < 1000; i++) {
delay_1us();
}
}
void delay_nms(unsigned int nms) {
while (nms--) {
delay_1ms();
}
}
显示屏的初始化和数据写入函数:
cvoid initLcd1602IO() {
DDRC = 0xFF;
PORTA = 0xFF;
DDRA = 0xFF;
}
void LCD_write_com(unsigned char com) {
RS_CLR;
RW_CLR;
EN_SET;
LCDIO = com;
delay_nms(1);
EN_CLR;
}
void LCD_write_data(unsigned char data) {
RS_SET;
RW_CLR;
EN_SET;
LCDIO = data;
delay_nms(1);
EN_CLR;
}
void LCD_clear(void) {
LCD_write_com(0x01);
delay_nms(5);
}
void LCD_write_str(unsigned char x, unsigned char y, unsigned char *s) {
if (y == 0) {
LCD_write_com(0x80 + x);
} else {
LCD_write_com(0xC0 + x);
}
while (*s) {
LCD_write_data(*s);
s++;
}
}
void LCD_init(void) {
initLcd1602IO();
DDRC |= (1 << PC5) | (1 << PC6) | (1 << PC7);
LCD_write_com(0x38);
delay_nms(5);
LCD_write_com(0x08);
delay_nms(5);
LCD_write_com(0x01);
delay_nms(5);
LCD_write_com(0x06);
delay_nms(5);
LCD_write_com(0x0C);
delay_nms(5);
LCD_clear();
}
矩阵键盘的按键检测函数:
cunsigned char getkey(void) {
unsigned char statevalue, key_checkin, key_check;
unsigned char key;
key_io = 0xf0;
key_io = 0xf0;
key_checkin = key_ior;
if (key_checkin != 0xf0) {
delay_nms(10);
key_checkin = key_ior;
if (key_checkin != 0xf0) {
key_io = 0xfe;
key_io = 0xfe;
key_check = key_ior;
switch (key_check) {
case 0xee: key = 16; break;
case 0xde: key = 12; break;
case 0xbe: key = 8; break;
case 0x7e: key = 4; break;
}
key_io = 0xfd;
key_io = 0xfd;
key_check = key_ior;
switch (key_check) {
case 0xed: key = 15; break;
case 0xdd: key = 11; break;
case 0xbd: key = 7; break;
case 0x7d: key = 3; break;
}
key_io = 0xfb;
key_io = 0xfb;
key_check = key_ior;
switch (key_check) {
case 0xeb: key = 14; break;
case 0xdb: key = 10; break;
case 0xbb: key = 6; break;
case 0x7b: key = 2; break;
}
key_io = 0xf7;
key_io = 0xf7;
key_check = key_ior;
switch (key_check) {
case 0xe7: key = 13; break;
case 0xd7: key = 9; break;
case 0xb7: key = 5; break;
case 0x77: key = 1; break;
}
}
} else {
key = 20;
}
return key;
}
初始化显示屏和键盘:
调用LCD_init
函数初始化显示屏。
配置矩阵键盘的IO口。
模式选择:
题目数量选择:
题目生成和回答:
根据选择的模式,生成随机题目。
用户通过键盘输入答案,系统自动判断答案是否正确。
结果反馈:
完成一组题目后,显示正确答案的数量。
如果全部答对,显示祝贺提示。
这款基于单片机的20以内加减法训练机,通过简单易用的硬件设计和高效的软件流程,提供了一个优秀的练习平台。不仅适用于儿童的数学训练,也可以作为单片机应用的学习案例。希望这篇博客能够帮助大家了解并实现这个有趣的项目。
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?u=bdf8eeb84961492ba2b62f7bfee641ea&tab=BB08J2
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!