单词记忆测试器程序设计.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流单词记忆测试器程序设计.精品文档.扬州大学水利与能源动力工程学院课程设计报告 题 目: 单词记忆测试器程序设计 课 程: 单片机原理及应用课程设计 专 业: 电气工程及其自动化 班 级: 电气1202 姓 名: 倪勇 学 号: 121704214 第 一 部 分任务书单片机原理及应用课程设计任务书一、课题名称单词记忆测试器程序设计二、课程设计目的课程设计是课程教学中的一项重要内容,是达到教学目标的重要环节,是综合性较强的实践教学环节,它对帮助学生全面牢固地掌握课堂教学内容、培养学生的实践和实际动手能力、提高学生全面素质具有很重要的意义。单片机原理及应用是一门理论性、实用性和实践性都很强的课程,课程设计环节应占有更加重要的地位。单片机原理及应用课程设计的目的是让学生在理论学习的基础上,通过完成一个涉及MCS-51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用,使学生不但能将课堂上学到的理论知识与实际应用结合起来,而且能进一步加深对电子电路、电子元器件等知识的认识与理解,同时在软件编程、排错调试、相关软件和仪器设备的使用技能等方面得到较全面的锻炼和提高。为今后能够独立进行某些单片机应用系统的开发设计工作打下一定的基础。通过单片机硬件和软件设计、调试、整理资料等环节的培训,使学生初步掌握工程设计方法和组织实践的基本技能,逐步熟悉开展科学实践的程序和方法。三、课程设计内容设计以89C51单片机和外围元器件构成的单片机应用系统,并完成相应的软硬件调试。1. 系统方案设计:综合运用单片机课程中所学到的理论知识,学生根据所选课题的任务、要求和条件进行总体方案的设计。2. 硬件电路设计:对方案中以单片机为核心的电路进行设计计算,包括元器件的选择和电路参数的计算,并画出总体电路图。3. 软件设计:根据已设计出的软件系统框图,用汇编语言或C51编制出各功能模块的子程序和整机软件系统的主程序。4. 调试:在单片机EDA仿真软件环境Proteus下进行仿真设计并调试;或在单片机周立功实验箱上进行相关设计并调试。四、课程设计要求设计一个以单片机为核心的单词记忆测试器: 1、实现单词的录入(为使程序具有可演示性,单词不少于10个)。 2、单词用按键控制依次在屏幕上显示,按键选择认识还是不认识,也可以直接进入下一个或者上一个。 3、单词背完后给出正确率。 4单词五、进度安排序号内容天数1布置任务,熟悉课题要求,学习proteus0.52总体方案确定,硬件电路设计1.53软件编程1.54Proteus仿真,调试25总结,撰写课程设计报告1.5七、课程设计报告内容:总结设计过程,写出设计报告,设计报告具体内容要求如下:1课程设计的目和设计的内容。2课程设计的要求。3控制系统总框图及系统工作原理。4控制系统的硬件电路连接图,电路的原理。 5软件设计流程图及其说明。6电路设计,软件编程、调试中遇到的问题及分析解决方法。7实验结果及其分析。8体会。第 二 部 分课程设计报告目 录1 课题简介 6 2 单词记忆测试器程序设计方案设计.73 单词记忆测试器硬件电路设计硬件电路设计.84 单词记忆测试器软件编程设计115 实验与结果分析196 小结与体会.207 参考文献.218 附录.221 课题简介1.1 课题的目的课程设计是课程教学中的一项重要内容,是达到教学目标的重要环节,是综合性较强的实践教学环节,它对帮助学生全面牢固地掌握课堂教学内容、培养学生的实践和实际动手能力、提高学生全面素质具有很重要的意义。单片机原理及应用是一门理论性、实用性和实践性都很强的课程,课程设计环节应占有更加重要的地位。单片机原理及应用课程设计的目的是让学生在理论学习的基础上,通过完成一个涉及MCS-51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用,使学生不但能将课堂上学到的理论知识与实际应用结合起来,而且能进一步加深对电子电路、电子元器件等知识的认识与理解,同时在软件编程、排错调试、相关软件和仪器设备的使用技能等方面得到较全面的锻炼和提高。为今后能够独立进行某些单片机应用系统的开发设计工作打下一定的基础。通过单片机硬件和软件设计、调试、整理资料等环节的培训,使学生初步掌握工程设计方法和组织实践的基本技能,逐步熟悉开展科学实践的程序和方法。1.2课题的任务要求设计一个以单片机为核心的单词记忆测试器:1、实现单词的录入(为使程序具有可演示性,单词不少于10个)。2、单词用按键控制依次在屏幕上显示,按键选择认识还是不认识,也可以直接进入下一个或者上一个。实现所有单词的循环显示。3、单词背完后给出正确率。(实时显示正确率,且对同一个单词确定不会重复增加正确率)4、不认识时,警示灯亮。5、按键时喇叭不响,松开时喇叭播放音乐。2、方案设计2.1系统的总体介绍系统主要模块如下:1、 时钟脉冲,复位控制:外部时钟方式使用现成的外部振荡器产生脉冲信号,同时通过开关对单片机的复位进行控制。2、 单词存取模块。 将单词存在二位数组中,通过读二维数组,送往显示。3、 单词正确率判断模块4、 ML016L 16*2LCD液晶屏显示模块该模块是将单片机送来的数据进行显示。5、 错误提示模块当不认识单词时,发出警示信号。 6、按键时喇叭不响,松开时喇叭播放音乐。 2.2 系统硬件模块图 1*4键盘LM016LLCD2*16液晶显示模块单片机中央处理模块2.3系统的工作原理单片机启动后,不停地读取P1口低四位的状态,P1口的低四位读取单词显示的,其中P1.0为sure, P1.1为unknown,P1.2为up,P1.3为down。按键部分,sure键按下时,P1.0被拉低,当单片机读到P1.0为低时,位置为i加以,将下一个单词送去显示。如时该单词的标志位满足,正确率改变。当unknown按下时,i加一,同时给指示灯送一,(此前指示灯已被置0)。当up按下时i减一,显示上一个单词.。 当unknown按下时,i加一,显示下一个单词。显示模块是通过re,rw,的置位来选择数据和指令的输入,配合使能位E。8位数据数据控制引脚分时复用,从而实现显示。字符的显示:用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。3 、硬件电路设计3.1总电路系统3.2时钟脉冲和单片机复位模块晶振是晶体振荡器的简称 在电气上它可以等效成一个电容和一个电阻并联再串联一个电容的二端网络 电工学上这个网络有两个谐振点 以频率的高低分其中较低的频率是串联谐振 较高的频率是并联谐振 由于晶体自身的特性致使这两个频率的距离相当的接近 在这个极窄的频率范围内 晶振等效为一个电感 所以只要晶振的两端并联上合适的电容它就会组成并联谐振电路 这个并联谐振电路加到一个负反馈电路中就可以构成正弦波振荡电路 由于晶振等效为电感的频率范围很窄 所以即使其他元件的参数变化很大 这个振荡器的频率也不会有很大的变化。3.3单片机模块8051 单片机内部结构,一个完整的计算机应该由运算器、控制器、存储器(ROM 及RAM)、数据总线和IO 接口组成。一般微处理器(如8086)就只包括运算器和控制器两部分。和一般微处理器相比,8051 增加了四个8 位IO 口、一个串行口、4KB ROM、128BRAM、很多工作寄存器及特殊功能寄存器(SFR),所以单片机具有比微处理器更强大的控制功能,单片机是专为进行控制设计的,而常见的微处理器是用于运算功能的。3.4键盘模块(1*4)4个按键依次接在P1.0,P1.1,P1.2,P1.3。其中P1.0为sure, P1.1为unknown,P1.2为up,P1.3为down。均接地,未按键时,口为高电平。通按键后,口为低电平。通过对P口低四位扫描,程序中用if,while,switch等语句,其中放入相应的控制变量,控制变量变化,从而能够读取相应的单词存储二维数组。正确率也得以输出。在按键按下sure时,单词认识,当up到该单词时再按sure,单词正确率不会发生变化。这正是该部分的难点,在程序部分会说明。3.5喇叭模块(4*7) 喇叭的工作原理是当输入的信号的频率不同是,喇叭发出的音调也不同。通过读取在数组中的各个音符的频率以及节拍,再通过定时器中断加以实现,最终就能让喇叭发出一首歌的全部音调了。3.6显示模块显示屏为一块LCD1602液晶屏,2*16(2行,16字符/行)读状态输入RS=L,R/W=H,E=H输出D0D7=状态字写指令输入RS=L,R/W=L,D0D7=指令码,E=高脉冲输出无读数据输入RS=H,R/W=H,E=H输出D0D7=数据写数据输入RS=H,R/W=L,D0D7=数据,E=高脉冲输出无表3-1 LCD1602时序表如下编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极表3-2 引脚接口说明表引脚功能第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。P0口与8位数据/指令复用线连接,P2.0连RS,P2.1连RW,P2.3连使能位E。这三位为控制信号。可以控制写入的是指令还是数据,具体操作见表3-1。E为使能信号,下降沿时,写入数据或指令。 其次第一行首个字符的显示地址为0x80H,第二行的首个字符显示地址为0xc0H。通过写入不同的显示位置,可以控制字符显示位置。3.7报警模块该模块最简单,一个LED接在P2.0口,在unknown,uph和down时闪烁。在switch的case语句中加入P2.0置1的指令,其后清0。即可实现。主要注意单片机复位时,各口都是1,要先置0。才能开始时灭。4、软件编程设计4.1 程序设计框图因本系统为模块化设计,为方便软件编写和移植,程序设计采用C语言,程序流程图如下:4.2主程序函数 void main(void) unsigned char a,c,i,j,k,p,q/*,key*/; bit b; LCD_init(); /液晶初始化子程序 delay(10); /延时10ms子程序 p=0; q=0; c=0; i=0; write_com(0x01); /写控制字 delay(5); /延时5ms write_address(0x00); /写LCD第一行开头地址 delay(5); j=0; while(stringj != '0') write_date(stringj); j+; delay(10); write_address(0x40); /写LCD第一行开头地址 delay(5); j=0; while(string00j != '0') write_date(string00j); j+; delay(50); delay(200); delay(200); delay(200); delay(200); delay(200); delay(200); delay(200); delay(200); delay(200); delay(200); while(1) LCD_init(); /液晶初始化子程序 delay(10); /延时10ms子程序 write_address(0x00); /写LCD第一行开头地址 delay(5); while(i<10) write_address(0x00); /写LCD第一行开头地址 delay(5); j=0; while(string0ij != '0') write_date(string0ij); j+; delay(10); /显示Word write_address(0x40); /第二行开头地址 delay(5); k=0; while(string0ik!= '0') write_date(string1ik); k+; delay(10); /显示单词 write_address(0x09); delay(5); c=0; for(j=0;j<=10;j+) c+=czhij; write_date(string2c); write_address(0x0b); delay(5); write_date('/'); write_address(0x0d); write_date('1'); write_address(0x0e); write_date('0'); a=P1&0x0f; /读取按键 音乐函数 while(a=0x0f) unsigned char k,i; TMOD|=0x01; /置定时器0工作方式1 EA=1; /打开全局中断 ET0=1; /打开定时0中断 while(a=0x0f) i=0; while(i<100) /音乐数组长度 ,唱完从头再来 a=P1&0x0f; if(a!=0x0f)break; k=MUSICi+7*MUSICi+1-1;/去音符振荡频率所需数据 Timer0_H=FREQHk; Timer0_L=FREQLk; Time=MUSICi+2; /节拍时长 i=i+3; Song(); a=P1&0x0f; break; switch(a) case 0x0f:b=0;break; /没有按下按键 case 0x0e: czhii=1; /用数组记录当前单词是认识的 i+; /指向下一个单词 b=0; /指示灯不亮 while(sure!=1); /按键松手检测 break; /确定,下一个 case 0x0d: czhii=0; /记录当前单词是不认识的,c认识单词个数不变 i+; /下一个单词 b=1; /指示灯亮 while(unknown!=1); break; /不认识,下一个 case 0x0b: b=1; i-; while(up!=1); /松手检测 break; /上一个 case 0x07: b=1; i+; while(down!=1); /松手检测 break; /下一个 P1=0x0f; error=b; delay(200); /如果错误,灯亮 error=0; c=0; for(j=0;j<=10;j+) c+=czhij; /就算认识单词的个数 for(j=0;j<=10;j+) czhij=0; /清空数组 LCD_init(); /液晶初始化子程序 delay(10); /延时10ms子程序 /以下的显示正确率 while(i=10) write_address(0x00); /第二行开头地址 delay(5); q=0; while(string3q!= '0') write_date(string3q);/显示正确率 q+; delay(10); write_address(0x40); /第二行开头地址 delay(5); k=c; /保存当前c值 c=c*10; if(c<100&&c!=0) /c不等于0,小于100 c=c/10; write_date(string2c); delay(10); write_date(string20); delay(10); else if(c=100) /全部认识 write_date(string21); delay(10); write_date(string20); delay(10); write_date(string20); delay(10); else /c=0,都不认识 write_date(string20); delay(10); write_date(string40); /显示百分号% delay(100); /延时100ms q=0; a=P1&0x0f; /检测有没有按键按下 if(a=0x0e|a=0x0d|a=0x0b|a=0x07) i=0; c=0; /有键按下,重新显示第一个单词 else c=k; /没有键按下,循环显示正确率 while(a=0x0f) unsigned char k,i; TMOD|=0x01; /置定时器0工作方式1 EA=1; /打开全局中断 ET0=1; /打开定时0中断 while(a=0x0f) i=0; while(i<100) /音乐数组长度 ,唱完从头再来 a=P1&0x0f; if(a!=0x0f)break; k=MUSICi+7*MUSICi+1-1;/去音符振荡频率所需数据 Timer0_H=FREQHk; Timer0_L=FREQLk; Time=MUSICi+2; /节拍时长 i=i+3; Song(); a=P1&0x0f; break; delay(100); delay(200); delay(200); delay(200); delay(200); delay(200); 4.3延时子程序 delayvoid DelayMs(unsigned char t) while(t-) /大致延时1mS DelayUs2x(245); DelayUs2x(245); 节拍延时函数 各调1/4节拍时间: 调4/4 125ms 调2/4 250ms 调3/4 187msvoid delayN(unsigned char t) unsigned char i;for(i=0;i<t;i+) DelayMs(250); TR0=0;4.4 液晶屏状态读取指令表4-4:控制命令表序号指令RSR/WD7D6D5D4D3D2D1D01清显示00000000012光标返回000000001*3置输入模式00000001I/DS4显示开/关控制0000001DCB5光标或字符移位000001S/CR/L*6置功能00001DLNF*7置字符发生存贮器地址0001字符发生存贮器地址8置数据存贮器地址001显示数据存贮器地址9读忙标志或地址01BF计数器地址10写数到CGRAM或DDRAM)10要写的数据内容11从CGRAM或DDRAM读数11读出的数据内容1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)指令1:清显示,指令码01H,光标复位到地址00H位置。指令2:光标复位,光标返回到地址00H。指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。指令7:字符发生器RAM地址设置。指令8:DDRAM地址设置。指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令10:写数据。指令11:读数据。4.5写指令子程序void write_com(uchar com) /写控制字 while(test()=1) ; RS=0; RW=0; E=0; _nop_(); _nop_(); P0=com; _nop_(); _nop_(); _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); _nop_();E=0; /写指令,RL=0,RW=0,E=高脉冲 4.6 字符显示位置指令void write_address(uchar x) /写数据存放地址 write_com(x|0x80); 调用了写指令子程序,查表4-4可得控制指令。4.5写数据指令void write_date(uchar date) /写数据到LCD 显示出来 while(test()=1) ; RS=1; RW=0; E=0; P0=date; _nop_(); _nop_(); _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); _nop_(); E=0; /写数据,RS=1,RL=0,E=高脉冲 4.6初始化LCD指令void LCD_init(void) /液晶初始化 delay(15); write_com(0x38); delay(5); write_com(0x38); delay(5); write_com(0x38); delay(5); write_com(0x0c); delay(5); write_com(0x06); delay(5); write_com(0x01); delay(5); 5、实验与结果分析5.1初始化屏幕显示 图 5.15.2 sure键显示 图 5.2.1 图 5.2.25.3其他键的情况显示图 5.3 按下up down unkown 键时,警示灯亮起,如图5.3所示。5.4正确率显示(7*4)6 小结与体会本学期的单片机综合课程设计也在一周内完成了。说起课程设计,我认为最重要的就是要好好的把电路原理看懂,什么芯片手册也要弄清楚它的时序,只有这样才能在编写程序是有的放矢,程序是在硬件的基础上编写的。一开始在网上看别人写的程序手感觉一些步骤一点也不知道为什么要这样做,后来通过对对应的电路加以研究,才理解到了每一步编写程序人的用心。所以在我进行课程设计时我没有急于求成的去到网上找一些资料,而是把我所要用到的器件的手册好好的看了一下,比如LCD1602,它在每次写完指令之后都要有一定的延时,这也是在看完时序图后知道的。其次,老师对实验的讲解要一丝不苟的去听去想,因为只有都明白了,做起设计就会事半功倍,如果没弄明白,就迷迷糊糊的去选题目做设计,到头来一点收获也没有。最后,要重视程序的模块化,修改的方便,也要注重程序的调试,掌握其方法。软件的编程也要我们不断的调试,最终一个能完成课程设计的劳动成果出来了,很高兴它能按着设计的思想与要求运动起来。当然,这其中也有很多问题,由于对课本理论的不熟悉导致编程出现错误。是在学习态度上,这次课设是对我的学习态度的一次检验。对于这次单片机综合课程实习,我的第一大心得体会就是作为一名工程技术人员,要求具备的首要素质绝对应该是严谨。在这次难得的课程设计过程中我锻炼了自己的思考能力和动手能力。通过题目选择和设计电路的过程中,加强了我思考问题的完整性和实际生活联系的可行性。在方案设计选择和芯片的选择上,培养了我们综合应用单片机的能力,对单片机的各个管脚的功能也有了进一步的认识。还锻炼我们个人的查阅技术资料的能力,动手能力,发现问题,解决问题的能力。并且我们熟练掌握了有关器件的性能及测试方法。对单片机个IO口的位地址,还有对液晶显示屏的指令,都有极大地了解。再次感谢夏阳老师的辅导以及同学的帮助,是他们让我对单片机有了一个更好的认识,无论是学习还是生活,生活是实在的,要踏实走路。课程设计时间虽然很短,但我学习了很多的东西,使我眼界打开,感受颇深。参 考 文 献1 张毅刚主编,单片机原理及应用,北京:高等教育出版社,20042 陈涛编著,单片机应用及C51程序设计,北京:机械工业出版社,20083 周润景主编,PROTEUS入门实用教程,北京:机械工业出版社,20074 夏继强主编,单片机实验与实践教程,北京:北京航天航空大学 20105 周润景主编, 基于Proteus的单片机设计与仿真,北京:北京航天航空大学, 2010 6 王为青主编,单片机KEIL Cx51 应用开发技术,2006 附录#include <reg51.h>#include <intrins.h>sbit rs= P20;sbit rw = P21;sbit ep = P22;sbit p10=0x90;sbit p11=0x91;sbit p12=0x92;sbit p13=0x93;sbit p24=0xA4;unsigned char code dis1129= "1","ping","liang","chuan","dan","pian","ji","ke","she",