基于单片机的单词记忆测试器毕业设计说明.docx
- 文档编号:6135910
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:21
- 大小:716.88KB
基于单片机的单词记忆测试器毕业设计说明.docx
《基于单片机的单词记忆测试器毕业设计说明.docx》由会员分享,可在线阅读,更多相关《基于单片机的单词记忆测试器毕业设计说明.docx(21页珍藏版)》请在冰豆网上搜索。
基于单片机的单词记忆测试器毕业设计说明
基于单片机的单词记忆测试器
基于单片机的单词记忆测试器
摘要
本论文的研究对象是基于单片机的单词记忆测试器的设计,此单词记忆测试器可以实现单词的输入并判断输入的单词是否正确,单词背完后给出正确率。
该单片机单词记忆测试器为在现实生活中有着广泛的应用,特别是对学习英语方面有很大的作用。
本设计以STC89C52单片机为处理器,以12854点阵液晶屏为显示器件,并使用5×6距阵键盘为输入设备,实现了功能全面的人机界面和高速的数据处理功能,利用单片机片上FLASHROM,可储存10-20个英文单词和汉字,作为记忆测试用。
关键词:
单片机单词记忆测试器AT89C5212864液晶屏
第一章单词记忆测试器的设计
1.1硬件模块设计
本单词记忆测试器系统硬件部分分为三个模块:
中央处理模块、显示模块、键盘输入模块。
系统模型图如下:
单片机中央处理模块
5×6矩阵键盘模块
LCD12864液晶显示模块
图4系统硬件模块图
1.1.1中央处理模块
中央处理模块选用STC89C52单片机系统组成,电路包括:
STC89C52单片机、复位电路、时钟振荡电路。
STC89C52单片机需在复位电路和时钟振荡电路组成的最小系统下工作,单片机引脚图如图5,外围电路如图6和图7所示,时钟电路采用频率采用为12MHZ的晶振,C1、C2与晶振构成了外部振荡电路。
复位电路采用电解电容与电阻串联,当系统上电时,由于电容充电,在RST端会产生一个高电平,高电平持续的时间由电容和电阻的值决定,当RESET信号为低电平时,系统为工作状态。
STC89C52具有ISP的功能,可以通过串行口直接将程序下载到单片机内。
在下载程序状态下,RESET信号被拉高,系统进行程序下载,待程序下载完毕后,RESET重新拉低。
用户可以通过切断电源进行手动复位,或者通过重新下载新的程序进行复位。
图5STC89C52的引脚排列图
图6时钟电路图图7复位电路图
1.1.2显示模块的硬件部分介绍
显示模块采用单色点阵液晶屏12864模块,该模块在点阵液晶屏基础上集成了控制器kS0108,用户只需设计好接口程序,就可让模块显示出各种字符和图像。
通常我们所见到的LCD模块,分为几部分:
LCM(玻璃)、背光、PCB板;而背光和PCB板部分其实是可有可无的,视具体的LCD模块而定。
点阵的LCD模块按照驱动控制器的集成方式,大可分为两种:
COB和COG;COG其实就是将驱动控制IC集成到了玻璃里面,这样的而后面的PCB板上其实只是一些驱动控制IC无法集成的电容电阻而已;COB也就是把驱动控制IC焊接在LCD模块后面的PCB板上。
12864为一块128X64点阵的LCD显示模块,模块上的LCM采用COG技术将控制
(包括显存)、驱动器集成在LCM的玻璃上,接口简单、操作方便;为方便用户的使用,
在LCM的基础上设计了12864模块,将模块所必需的外围电容电阻集成到模块上,
并引出多种形式的引线接口方便用户使用。
12864模块与各种MCU均可进行方便简
单的接口操作。
LCD的接口:
一般来说,LCD模块(带有驱动控制器)的接口多为总线的接口,不是6800就是8080,或者是串行SPI(及类SPI时序);除了这些总线的端口外,有的LCD模块还引出了一些功能性的端口,如偏压调节输入、负压输出等。
图812864模块接口定义表
显示RAM区映射情况:
对于LCD模块,了解清楚驱动控制IC当中的显存与LCD玻璃上的点的对应关系是非常重要的,这是编写LCD的驱动程序的基础。
12864液晶显示模块的显示器(玻璃)上的显示点与驱动控制芯片中的显示缓存RAM是一一对应的;驱动控制芯片当中共有65(8Pagex8bit+1)X132个位的显示RAM区。
而显示器的显示点阵大小为64X128点,所以实际上在液晶显示模块中有用的显示RAM区为64X128个位;按byte为单位划分,共分为8个Page,每个Page为8行,而每一行为128个位(即128列)。
驱动控制芯片的显示RAM区每个byte的数据对应屏上的点的排列方式为:
纵向排列,低位在上高位在下;如图8所示
图8驱动控制芯片的显示RAM区
12864液晶显示模块的显示屏上的每一个点都对应有控制器片内的显示缓存RAM中
的一个位,显示屏上64X128个点分别对应着显示RAM的8个Page,每一个Page有128个byte的空间对应。
因此可知显示RAM区中的一个Page空间对应8行的点,而该Page中的一个byte数据则对应一列(8个点)。
图9为显示RAM区与显示屏的点映射图:
图9显示RAM区与显示屏的点映射图
行、列地址:
用户如要点亮LCD屏上的某一个点时,实际上就是对该点所对应的显示RAM区中的某一个位进行置1操作;所以就要确定该点所处的行地址、列地址。
从上图中可以看出,
MzL02-12864液晶显示模组的行地址实际上就是Page的信息,每一个Page应有8行;而列地址则表示该点的横坐标,在屏上为从左到右排列,Page中的一个Byte对应的是一列(8行,即8个点),达128列。
可以根据这样的关系在程序中控制LCD显示屏的显示。
注意:
MzL02-12864的显示缓存RAM区实际上比模块上的显示器所对应的RAM区要大;而LCD模块具体设置Page(有时也称页)时,屏上的位置与驱动控制IC当中的哪里的RAM区对应,还与驱动控制IC与屏的连接有关;所以,实际在使用时,请参考所提供的范例设置(主要是设置COM反向扫描、SEG设置为正向扫描,以此设置方法,则每个Page中的前三列以及最后一列是不对应在LCD屏幕上的)。
1.1.3矩阵键盘
要测试记忆的单词,就要有字母的输入接口,本接口设计为5×6矩阵键盘输入,接入单片机的P1口和P3口进行键盘扫描。
最大程度地提高了单片机IO口的利用率,设计共30个接键,包括了26个英文字母以及四个功能键:
“确定”、“不认识”、“上一个”、“下一个”。
矩阵键盘如图10,由30个轻触按键按照6行5列排列,连接到P1、P3端口。
其扫描的原理是:
先将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。
这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。
行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。
然后再将行线所接的单片机的I/O口作为输入端,而列线所接的I/O口则作为输出,以相同的方法读一次端口,程序中就可识别是啊个坐标的按键按下了。
图105×6矩阵键盘
1.2电路原理图设计
电路原理图设计使用集原理图设计、PCB设计、电路仿真功能为一体的PROTUES软件。
以该软件设计的电路原理图图11。
图11单片机单词记忆测试器电路原理图
电路设计参数:
(1)C1C2为20-30PF瓷片电容,与12M晶振组成时钟振荡电路;
(2)复位电路使用R1为10K电阻、C3为10uF电解电容;
(3)12864液晶模块与单片机P0口连接,因P0口为真正的三态门结构,因些作数据总线使用时要外接上拉电阻,可使用10K的排阻;
(4)按键如图的行相连,列相连的矩阵接法连入单片机IO口;
(5)电路的供电为5V直流电源;
(6)D1为输入错误的状态指示灯,加220欧限流电阻连到VCC,因为STC89C51单片机IO的电流灌入能力要强于电流输出能力,因此一般使IO为低电平时点亮LED灯。
1.3软件程序设计
1.3.1程序设计思路
因本系统为模块化设计,为方便软件编写和移植,程序设计采用C语言,程序流程图如下:
1.3.2矩阵键盘的程序设计
矩阵键盘采用5×6列与行扫描法,P1口依次接键盘的每一行,而P3口依次接键盘的每一列,程序开始先令P1全为高电平,P3口全为低电平,这样一旦矩阵键盘中有一个键按下时,就会在某一行中出现低电平,而某一列中出现高电平,程序先读P1口,以检测到有低电平来确定行。
再使P1全为低电平,P3口全为高电平,再读P3口,以检测到低电平来确定列。
这里还要考虑按键的机械抖动问题,因为按键的机械特性,可能在按下瞬间会有一组抖动的脉冲,一般程序中采用延时方法来去抖动。
实现的C程序函数如下:
/*************************************************
**键盘扫描程序
*************************************************/
unsignedcharkbscan()//键盘扫描
{
ucharhang,lie,key;//P1连行,P3连列
if(P1!
=0xFF||P3!
=0)//按键去抖动
delayms(5);//延时5ms
if(P1!
=0xFF||P3!
=0)
{
switch(P1&0xFF)//P1扫行
{
case0xFE:
hang=5;break;//P1.0为第6行
case0xFD:
hang=4;break;//P1.1为第5行
case0xFB:
hang=3;break;//P1.2为第4行
case0xF7:
hang=2;break;//P1.3为第3行
case0xEF:
hang=1;break;//P1.4为第2行
case0xDF:
hang=0;break;//P1.5为第1行
}
P1=0;//P1全低电平
P3=0xFF;//P3全高电平
switch(P3&0xFF)
{
case0xFE:
lie=4;break;//P1.0为第5列
case0xFD:
lie=3;break;//P0.5为第4列
case0xFB:
lie=2;break;//P0.6为第3列
case0xF7:
lie=1;break;//P0.7为第2列
case0xEF:
lie=0;break;//P0.7为第1列
}
P1=0xFF;//P1全高电平
P3=0;//P3全低电平
while(P1!
=0xFF||P3!
=0);//按键松开后才返回值
key=tab1[hang][lie];
}
else
key='_';//没键按下返回空
return(key);
}
1.3.3LCD12864显示模块的驱动程序
LCD12864显示模块的程序作为显示部分的底层程序,用户可直接调用其函数来达到驱动和显示功能。
主要显示命令和显示的函数说明如下:
清显示屏:
voidClearLCD(),将LCD上的显示字符清空
汉字的显示函数:
voidhz_disp(unsignedcharx,unsignedchary,unsignedcharn,unsignedcharcode*hz,bitflag);
其中XY为汉字的起始坐标,n为字数,hz为存储汉字字模码(后述)的地址,flag为显示为黑还是白。
英文的显示函数为:
voiden_disp(unsignedcharx,unsignedchary,unsignedcharn,unsignedcharcode*asc,unsignedchar*string,bitflag);
其中其中XY为字母的起始坐标,n为字数,asc为存储字形码(后述)的地址,flag为显示为黑还是白。
LCD12864显示一个单词的示例代码如下:
en_disp(6,0,8,Asc,"correct:
",1);//在第7行,第1列开始显示correct;
LCD12864显示一个汉字的示例代码如下:
hz_disp(0,48,1,hz1+hz_Num*32,1);//在第1行,第49列开始显示测试的汉字
1.3.4显示字模码的提取
为了使LCD12864能够显示用户存储的中文汉字和英文单词,用户必须将要显示的汉字字模及英文字母字模码存入单片机存储器中,因LCD12864只能显示点阵图形,因此存储入单片机的字模码必须是通过点阵码转换而成,为了软换更方便,设计使用了字模转换软件实现汉字和英文码的取模。
图12中英文取字模软件界面
例如汉字“中国”,取得的字模码为:
/*--文字:
中--*/
0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00,
0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00,
/*--文字:
国--*/
0x00,0xFE,0x02,0x0A,0x8A,0x8A,0x8A,0xFA,0x8A,0x8A,0x8A,0x0A,0x02,0xFE,0x00,0x00,
0x00,0xFF,0x40,0x48,0x48,0x48,0x48,0x4F,0x48,0x49,0x4E,0x48,0x40,0xFF,0x00,0x00,
将此码存入单片机程序存储器里,使用液晶显示的函数就可方便地显示汉字或英文字形。
本单片机记忆测试系统的程序中将英文字符的字模码表以asc.h文件形式保存,为节约单片机的RAM,生成的二进制文件以只读形式储在单片机的FLASHROM中。
1.3系统软件主程序结构及其函数
系统主程序完成主循环和对各模块函数的调用,调用的文件包括:
reg52.h、asc.h、12864.h,其中reg52.h是8051内核单片机的标准头文件,定义了单片机内部各寄存器的地址,使用户编程更方便;asc.h存储了本单词记忆测试器的单词和中文汉字字模块,供显示函数调用,而12864.h为LCD12864显示屏的底层驱动程序,包括了屏显示的指令函数和显示中英文的函数。
在KEILuV3环境下将主程序文件和reg52.h、asc.h、12864.h放在同一工程工作组中,以便主程序调用,如图13。
图13keil下的程序工程文件
主程序的函数:
主程序首先进行存储变量的定义:
bitERROR;//输入字符错误标志位,输入错误为1
bitresult;//输入的最终结果对错的标志位,为0是正确
bitverify;//标志按过一次确认键
sbitERR=P2^7;//P2.7口接一个指示灯警告输入错误
ucharcorrectNUM;//统计测试正确的单词数,即得分
ucharcodeSL[10]={4,4,5,3,2,4,4,3,4,3};
//存储各测试单词的长度,如果输入的单词长度与存储的不同,也为错误
为能动态地显示测试的单词,先将要测试的单词存在一个二维数组中,显示了该数组中的字符时,12864.h中的显示函数会调用相应字符的字模码(asc.h中);
/*****************************************
/**存储要测试的单词,放在ROM中
/****************************************/
ucharcodeS[10][5]={"tree",//树
"rain",//雨
"water",//水
"fly",//飞
"go",//去
"fish",//鱼
"snow",//雪
"eat",//吃
"rice",//米
"ice",//冰
};
该二维数组为行*列10*5,即10行5列,10行表示有10个单词,实际根据存储ROM的大小,可以增加单词数;列数表示单词在存储器中占的字符数,以最长单词(5个字符)定义,不足5个字符的单词后补空格表示。
前节介绍过键盘的输入是通过矩阵扫描的方法,通过矩阵扫描可使单片机找到按键所在的某行某列,但要得到一个英文字母值,还得在单片机返回的某行某列位置预先定义个字母值,因此5*6矩阵键盘的整个返回字母表可定义一个二维数组存储:
/*****************************************
/**存储键盘的字母值,放在ROM中
/****************************************/
ucharcodetab1[6][5]={{'a','b','c','d','e'},
{'f','g','h','i','j'},
{'k','l','m','n','o'},
{'p','q','r','s','t'},
{'u','v','w','x','y'},
{'z',1,2,3,4}};
例如在按下键盘时,单片机返回键盘位置为第二行第三列,就可从上表中查出是对应位置的字母。
键盘扫描函数返回的是键值。
key=tab1[hang][lie];
进入主程序后,先对LCD12864屏进行初始化和清屏操作,然后在LCD12864屏上显示单片机单词记忆测试器的静态的图文,需要动态刷新的字符则在主循环中进行。
LCD12864_init();//LCD12864初始化
ClearLCD();//清屏
en_disp(2,1,11,Asc,"INPUTWORD:
",1);//在第3行第21列显示"INPUTWORD:
"
//最后的“1”表示显示为白底黑字,如是0则为黑底白字,即反显
en_disp(4,1,1,Asc,">",1);//在第5行,第5列开始显示">"
en_disp(6,0,8,Asc,"correct:
",1);//在第7行,第1列开始显示"correct:
"
en_disp(6,80,5,Asc,"00/10",1);//在第7行第81列显示"00/10"
LCD12864的显示效果如下,此时系统进入单词输入测试就绪状态。
在系统进入单词输入测试就绪状态后,主程序即进入while
(1)的主循环中,循环进行键盘扫描,并判断键盘输入值,再与待测试的单词进行比较,如果输入的字符和字符长度均与被测试的单词一致,则显示correct加1,即为加1分,并进入下一个单词的测试,测试完10个单词后,重新进入第1个单词的测试。
主程序的主循环部分代码及注释如下:
while
(1)
{
KeyNum[iword]=kbscan();//进行矩阵按键扫描,得到扫描键盘的输入值
hz_disp(0,48,1,hz1+hz_Num*32,1);//在第1行,第49列开始显示测试的汉字
temp[0]=(hz_Num+1)/10+0x30;//将十进制数转换为ASCII字符
//temp数组用来存储测试的序号
temp[1]=(hz_Num+1)%10+0x30;//算出测试汉字的序号的第一位和第二位
en_disp(0,20,1,Asc,":
",1);//在第1行第21列显示":
"
en_disp(0,4,2,Asc,temp,1);//在第1行第5列显示测试序号
if(KeyNum[iword]!
='_')//键盘有按键按下,无按下返回的是'_'
{
if(KeyNum[iword]==1)//如果按下了确定键
{
if(SL[hz_Num]==iword&&verify)
//输入长度等于测试单词的长度,则正确,verify表示按下了确认后有效一次
{
correctNUM+=1;
if(correctNUM>10)
{
correctNUM=10;//最多10个正确的
}
verify=0;//标志位清零
hz_Num++;//测试下一个单词
if(hz_Num==10)hz_Num=0;//最多设10个单词
temp[0]=(correctNUM)/10+0x30;//将十进制数转换为ASCII字符
temp[1]=(correctNUM)%10+0x30;//算出测试汉字的序号的第一位和第二位
en_disp(6,80,2,Asc,temp,1);//在第7行第81列
iword=0;
Nword=0;
en_disp(4,16,8,Asc,"",1);//在第5行,第17列开始显示
}
}
elseif(KeyNum[iword]==2||KeyNum[iword]==4)
//如果按下了“不认识”或“下一个”键,直接跳到下一个单词
{
result=0;//跳下一个时错误灯灭
ERROR=0;
hz_Num++;//测试下一个单词
if(hz_Num==10)hz_Num=0;//最多设10个单词
iword=0;
Nword=0;
en_disp(4,16,8,Asc,"",1);//在第5行,第17列开始显示
}
elseif(KeyNum[iword]==3)//如果按下了“上一个”键,直接跳到上一个单词
{
result=0;//跳下一个时错误灯灭
ERROR=0;
//测试下一个单词
if(hz_Num==0)hz_Num=10;//最多设10个单词
hz_Num--;
iword=0;
Nword=0;
en_disp(4,16,8,Asc,"",1);//在第5行,第17列开始显示
}
elseif(S[hz_Num][iword]==KeyNum[iword])//输入的字符与测试的标准字符比较
{temp[0]=KeyNum[iword];
ERROR=0;//正确就标志位置0
en_disp(4,Nword+16,1,Asc,temp,1);//在第5行,第17列开始显示
iword++;
if(iword==8)iword=0;
Nword=iword*8;
verify=1;
}
else
{temp[0]=KeyNum[iword];
ERROR=1;//错误就置1
en_disp(4,Nword+16,1,Asc,temp,1);//在第5行,第17列开始显示
iword++;
if(iword==8)iword=0;
Nword=iword*8;
}
result=ERROR|result;//0表示结果正确
}
ERR=!
result;//错误指示灯
}
}
1.4软件的仿真
软件的仿真使用protues环境,在画好protues原理图后,将keil环境下生成的目标文件HEX文件载入protues中,即可进行软件仿真。
因仿真软件中没有STC89C52元件,故可使用完全兼容的AT89C52
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 单词 记忆 测试 毕业设计 说明
![提示](https://static.bdocx.com/images/bang_tan.gif)