




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于单片机的单词记忆测试器目 录第一章 单词记忆测试器的设计111.1 硬件模块设计111.1.1中央处理模块111.1.2 显示模块的硬件部分介绍121.1.3 矩阵键盘151.2 电路原理图设计161.3 软件程序设计171.3.1 程序设计思路171.3.2矩阵键盘的程序设计181.3.3 lcd12864显示模块的驱动程序191.3.4 显示字模码的提取201.3 系统软件主程序结构及其函数211.4 软件的仿真26第二章 结语28附 录 单片机单词记忆测试器c程序源代码基于单片机的单词记忆测试器摘要本论文的研究对象是基于单片机的单词记忆测试器的设计,此单词记忆测试器可以实现单词的输入
2、并判断输入的单词是否正确,单词背完后给出正确率。该单片机单词记忆测试器为在现实生活中有着广泛的应用,特别是对学习英语方面有很大的作用。 本设计以stc89c52单片机为处理器,以12854点阵液晶屏为显示器件,并使用56距阵键盘为输入设备,实现了功能全面的人机界面和高速的数据处理功能,利用单片机片上flash rom,可储存10-20个英文单词和汉字,作为记忆测试用。关键词: 单片机 单词记忆测试器 at89c52 12864液晶屏第一章 单词记忆测试器的设计1.1 硬件模块设计 本单词记忆测试器系统硬件部分分为三个模块:中央处理模块、显示模块、键盘输入模块。系统模型图如下:单片机中央处理模块
3、56矩阵键盘模块lcd12864液晶显示模块图4 系统硬件模块图1.1.1中央处理模块 中央处理模块选用stc89c52单片机系统组成,电路包括:stc89c52单片机、复位电路、时钟振荡电路。stc89c52单片机需在复位电路和时钟振荡电路组成的最小系统下工作,单片机引脚图如图5,外围电路如图6和图7所示,时钟电路采用频率采用为12mhz的晶振,c1、c2与晶振构成了外部振荡电路。复位电路采用电解电容与电阻串联,当系统上电时,由于电容充电,在rst端会产生一个高电平,高电平持续的时间由电容和电阻的值决定,当reset信号为低电平时,系统为工作状态。 stc89c52具有isp的功能,可以通过
4、串行口直接将程序下载到单片机内。在下载程序状态下,reset信号被拉高,系统进行程序下载,待程序下载完毕后,reset重新拉低。用户可以通过切断电源进行手动复位,或者通过重新下载新的程序进行复位。图5 stc89c52的引脚排列图 图6 时钟电路图 图7复位电路图1.1.2 显示模块的硬件部分介绍显示模块采用单色点阵液晶屏12864模块,该模块在点阵液晶屏基础上集成了控制器ks0108,用户只需设计好接口程序,就可让模块显示出各种字符和图像。通常我们所见到的 lcd 模块,分为几部分:lcm(玻璃)、背光、pcb 板;而背光和pcb板部分其实是可有可无的,视具体的lcd 模块而定。点阵的lcd
5、 模块按照驱动控制器的集成方式,大可分为两种:cob 和cog;cog 其实就是将驱动控制ic 集成到了玻璃里面,这样的而后面的pcb 板上其实只是一些驱动控制ic 无法集成的电容电阻而已;cob 也就是把驱动控制ic 焊接在lcd 模块后面的pcb 板上。12864 为一块128x64 点阵的lcd 显示模块,模块上的 lcm 采用cog 技术将控制(包括显存)、驱动器集成在lcm 的玻璃上,接口简单、操作方便;为方便用户的使用,在lcm 的基础上设计了12864 模块,将模块所必需的外围电容电阻集成到模块上,并引出多种形式的引线接口方便用户使用。12864 模块与各种mcu 均可进行方便简
6、单的接口操作。lcd 的接口:一般来说,lcd 模块(带有驱动控制器)的接口多为总线的接口,不是6800 就是8080,或者是串行spi(及类spi 时序);除了这些总线的端口外,有的lcd 模块还引出了一些功能性的端口,如偏压调节输入、负压输出等。图8 12864 模块接口定义表显示 ram 区映射情况:对于 lcd 模块,了解清楚驱动控制ic 当中的显存与lcd 玻璃上的点的对应关系是非常重要的,这是编写lcd 的驱动程序的基础。12864 液晶显示模块的显示器(玻璃)上的显示点与驱动控制芯片中的显示缓存ram是一一对应的;驱动控制芯片当中共有65(8 page x 8 bit+1)x 1
7、32 个位的显示ram 区。而显示器的显示点阵大小为64x128 点,所以实际上在液晶显示模块中有用的显示ram 区为64 x 128 个位;按byte 为单位划分,共分为8 个page,每个page 为8 行,而每一行为128 个位(即128 列)。驱动控制芯片的显示ram区每个byte的数据对应屏上的点的排列方式为:纵向排列,低位在上高位在下;如图 8所示图8 驱动控制芯片的显示ram区12864 液晶显示模块的显示屏上的每一个点都对应有控制器片内的显示缓存ram中的一个位,显示屏上64x128 个点分别对应着显示ram的8 个page,每一个page有128 个byte的空间对应。因此可
8、知显示ram区中的一个page空间对应8 行的点,而该page中的一个byte数据则对应一列(8 个点)。图9 为显示ram区与显示屏的点映射图:图9 显示ram区与显示屏的点映射图行、列地址:用户如要点亮 lcd 屏上的某一个点时,实际上就是对该点所对应的显示ram 区中的某一个位进行置1 操作;所以就要确定该点所处的行地址、列地址。从上图中可以看出,mzl02-12864 液晶显示模组的行地址实际上就是page 的信息,每一个page 应有8 行;而列地址则表示该点的横坐标,在屏上为从左到右排列,page 中的一个byte 对应的是一列(8行,即8 个点),达128 列。可以根据这样的关系
9、在程序中控制 lcd 显示屏的显示。注意:mzl02-12864 的显示缓存ram 区实际上比模块上的显示器所对应的ram 区要大;而lcd 模块具体设置page(有时也称页)时,屏上的位置与驱动控制ic 当中的哪里的ram区对应,还与驱动控制ic 与屏的连接有关;所以,实际在使用时,请参考所提供的范例设置(主要是设置com 反向扫描、seg 设置为正向扫描,以此设置方法,则每个page 中的前三列以及最后一列是不对应在lcd 屏幕上的)。1.1.3 矩阵键盘 要测试记忆的单词,就要有字母的输入接口,本接口设计为56矩阵键盘输入,接入单片机的p1口和p3口进行键盘扫描。最大程度地提高了单片机i
10、o口的利用率,设计共30个接键,包括了26个英文字母以及四个功能键:“确定”、“不认识”、“上一个”、“下一个”。 矩阵键盘如图10,由30个轻触按键按照6行5列排列,连接到p1、p3端口。其扫描的原理是:先将行线所接的单片机的i/o口作为输出端,而列线所接的i/o口则作为输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。然后再将行线所接的单片机的i/o口作为输入端,而列线所接的i/o口则作为输出,以相同的方法读一次端口,程序中就可识别是啊个坐标的按键按下了。图10 56矩阵
11、键盘1.2 电路原理图设计 电路原理图设计使用集原理图设计、pcb设计、电路仿真功能为一体的protues软件。以该软件设计的电路原理图图11。图11 单片机单词记忆测试器电路原理图电路设计参数:(1) c1 c2 为20-30pf瓷片电容,与12m晶振组成时钟振荡电路;(2) 复位电路使用r1为10k电阻、c3为10uf电解电容;(3) 12864液晶模块与单片机p0口连接,因p0口为真正的三态门结构,因些作数据总线使用时要外接上拉电阻,可使用10k的排阻;(4) 按键如图的行相连,列相连的矩阵接法连入单片机io口;(5) 电路的供电为5v直流电源;(6) d1为输入错误的状态指示灯,加22
12、0欧限流电阻连到vcc,因为stc89c51单片机io的电流灌入能力要强于电流输出能力,因此一般使io为低电平时点亮led灯。1.3 软件程序设计1.3.1 程序设计思路因本系统为模块化设计,为方便软件编写和移植,程序设计采用c语言,程序流程图如下:开始单片机初始化键盘扫描输入有按键命令?执行按键命令ny显示正确输入正确字符比较确定键显示下一个显示上一个ylcd12864初始化n1.3.2矩阵键盘的程序设计矩阵键盘采用56 列与行扫描法,p1口依次接键盘的每一行,而p3口依次接键盘的每一列,程序开始先令p1全为高电平,p3口全为低电平,这样一旦矩阵键盘中有一个键按下时,就会在某一行中出现低电平
13、,而某一列中出现高电平,程序先读p1口,以检测到有低电平来确定行。再使p1全为低电平,p3口全为高电平,再读p3口,以检测到低电平来确定列。这里还要考虑按键的机械抖动问题,因为按键的机械特性,可能在按下瞬间会有一组抖动的脉冲,一般程序中采用延时方法来去抖动。实现的c程序函数如下:/* 键盘扫描程序*/unsigned char kbscan() /键盘扫描 uchar hang,lie,key; /p1连行,p3连列if(p1!=0xff|p3!=0) /按键去抖动 delayms(5); /延时5msif(p1!=0xff|p3!=0)switch(p1&0xff) /p1 扫行 case
14、0xfe:hang=5;break; /p1.0为第6行 case 0xfd:hang=4;break; /p1.1为第5行 case 0xfb:hang=3;break; /p1.2为第4行 case 0xf7:hang=2;break; /p1.3为第3行 case 0xef:hang=1;break; /p1.4为第2行 case 0xdf:hang=0;break; /p1.5为第1行 p1=0; /p1全低电平 p3=0xff;/p3全高电平 switch(p3&0xff)case 0xfe:lie=4;break; /p1.0为第5列case 0xfd:lie=3;break; /
15、p0.5为第4列case 0xfb:lie=2;break; /p0.6为第3列case 0xf7:lie=1;break; /p0.7为第2列case 0xef:lie=0;break; /p0.7为第1列p1=0xff; /p1全高电平 p3=0; /p3全低电平while(p1!=0xff|p3!=0); /按键松开后才返回值key=tab1hanglie;elsekey=_; /没键按下返回空return (key);1.3.3 lcd12864显示模块的驱动程序 lcd12864显示模块的程序作为显示部分的底层程序,用户可直接调用其函数来达到驱动和显示功能。主要显示命令和显示的函数说
16、明如下:清显示屏:void clearlcd() ,将lcd上的显示字符清空汉字的显示函数:void hz_disp(unsigned char x,unsigned char y,unsigned char n,unsigned char code * hz,bit flag) ;其中x y为汉字的起始坐标,n为字数,hz为存储汉字字模码(后述)的地址,flag为显示为黑还是白。英文的显示函数为:void en_disp(unsigned char x,unsigned char y,unsigned char n,unsigned char code *asc,unsigned char
17、*string,bit flag) ;其中其中x y为字母的起始坐标,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能够显示用户存储的中文汉字和英文单词,用户必须将要显示的汉字字模及英文字母字模码存入单片机存储器中,因lcd128
18、64只能显示点阵图形,因此存储入单片机的字模码必须是通过点阵码转换而成,为了软换更方便,设计使用了字模转换软件实现汉字和英文码的取模。图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,0
19、x0a,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,生成的二进制文件以只读形式储在单片机的flash rom中。1.3 系统软件主程序结构及其函数系统主程序完成主循环和对各模块函数的调用,调
20、用的文件包括:reg52.h、asc.h、 12864.h,其中reg52.h是 8051内核单片机的标准头文件,定义了单片机内部各寄存器的地址,使用户编程更方便;asc.h存储了本单词记忆测试器的单词和中文汉字字模块,供显示函数调用,而12864.h为lcd12864显示屏的底层驱动程序,包括了屏显示的指令函数和显示中英文的函数。在keil uv3环境下将 主程序文件和reg52.h、asc.h、12864.h放在同一工程工作组中,以便主程序调用,如图13。图13 keil下的 程序工程文件主程序的函数:主程序首先进行存储变量的定义:bit error; /输入字符错误标志位,输入错误为 1
21、bit result; /输入的最终结果对错的标志位,为0是正确bit verify; /标志按过一次确认键sbit err=p27; /p2.7 口接一个指示灯警告输入错误uchar correctnum; /统计测试正确的单词数,即得分uchar code sl10=4,4,5,3,2,4,4,3,4,3; /存储各测试单词的长度,如果输入的单词长度与存储的不同,也为错误为能动态地显示测试的单词,先将要测试的单词存在一个二维数组中,显示了该数组中的字符时,12864.h中的显示函数会调用 相应字符的字模码(asc.h中); /*/* 存储要测试的单词,放在rom中/*/uchar code
22、 s105= tree , /树 rain , /雨 water, /水 fly , /飞 go , /去 fish , /鱼 snow , /雪 eat , /吃 rice , /米 ice , /冰 ;该二维数组为行*列 10*5,即10行5列,10行表示有10个单词,实际根据存储rom的大小,可以增加单词数;列数表示单词在存储器中占的字符数,以最长单词(5个字符)定义,不足5个字符的单词后补空格表示。前节介绍过键盘的输入是通过矩阵扫描的方法,通过矩阵扫描可使单片机找到按键所在的某行某列,但要得到一个英文字母值,还得在单片机返回的某行某列位置预先定义个字母值,因此5*6矩阵键盘的整个返回字
23、母表可定义一个二维数组存储: /*/* 存储键盘的字母值 ,放在rom中/*/uchar code tab165=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=tab1hanglie;进入主程序后,先对lcd12864屏进行初始化和清屏操作,然后在lcd12864屏上显示单片机单词记忆测试器的静态的图文,需要动态刷新的字符则在主循环中进行。 lcd12864_init
24、();/lcd12864初始化clearlcd();/清屏en_disp(2,1,11,asc,input word:,1); /在第3行 第21列 显示input word: /最后的“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/10lcd12864的显示效果如下,此时系统进入单词输入测试就绪状态。在系统进入单词输入测试就绪状
25、态后,主程序即进入while(1)的主循环中,循环进行键盘扫描,并判断键盘输入值,再与待测试的单词进行比较,如果输入的字符和字符长度均与被测试的单词一致,则显示correct加1,即为加1分,并进入下一个单词的测试,测试完10个单词后,重新进入第1个单词的测试。 主程序的主循环部分代码及注释如下:while(1) keynumiword=kbscan(); /进行矩阵按键扫描,得到扫描键盘的输入值 hz_disp(0,48,1,hz1+hz_num*32,1); /在第1行,第49列开始显示测试的汉字 temp0=(hz_num+1)/10+0x30; /将十进制数转换为ascii字符 /te
26、mp数组用来存储测试的序号 temp1=(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(keynumiword!=_) /键盘有按键按下,无按下返回的是_ if(keynumiword=1) /如果按下了确定键 if(slhz_num=iword&verify) /输入长度等于测试单词的长度,则正确 ,verify表示按下了确认后有效一次 correctnum+=1; if(correctnum1
27、0) correctnum=10; /最多10个正确的 verify=0; /标志位清零 hz_num+; /测试下一个单词 if(hz_num=10) hz_num=0; /最多设10个单词 temp0=(correctnum)/10+0x30; /将十进制数转换为ascii字符 temp1=(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列开始显示 else if(keynum
28、iword=2|keynumiword=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列开始显示 else if(keynumiword=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列开始显示 else if(shz_numiword=keynumiword)/输入的字符与测试的标准字符比较 temp0=keynumiword; error=0; /正确就标志位置0 en_disp(4,nword+16,1,asc,temp,1); /在第5行,第17列开始显示 iword+; if(iword=8) iword=0; nword=iwo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年美容师岗位职业技能资格知识考试题库与答案
- 2025春季学期国开河南电大本科补修课《财务管理#》一平台无纸化考试(作业练习+我要考试)试题及答案
- 地铁公司内部培训体系构建
- 职业健康检查培训
- 员工安全职责培训
- 幼儿教师职责培训
- 带教老师培训课件
- 转运老人协议书范本
- 运营服务类合同协议
- 迎合作协议书范本
- 赴远(2024年山东东营中考语文试卷记叙文阅读试题)
- 2025山东能源集团中级人才库选拔易考易错模拟试题(共500题)试卷后附参考答案
- 家长法制安全教育
- 中级经济师(人力资源管理专业)串讲讲义
- 儿童主任培训课件
- JBQGTGST9000控制器说明书
- UL2595标准中文版-2015电池驱动设备的要求中文版
- 初二英语语法填空浙江版单选题100道及答案解析
- 医疗质量及医疗安全
- 烧伤治疗和护理
- 2024年广西职业院校技能大赛高职组《区块链技术应用》赛项样卷
评论
0/150
提交评论