单词记忆测试器Word版
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
自动化专业综合设计报告设计题目:单词记忆测试器所在实验室:数院407
指导教师:刘华东
学生姓名:陈文
班级:计112-2
学号:201163872215
成绩评定:
设计目的
1.综合设计是综合性较强的实践教学环节,它对帮助学生全面牢固地掌握课堂教学内容、培养学生的实践和实际动手能力、提高学生全面素质具有很重要的意义。
2.通过本次单片机综合设计,使加深对C51单片机的认识,提高编程应用能力,并掌握Proteus仿真软件的使用。
一、设计要求
设计一个以单片机为核心的单词记忆测试器:
(1)实现单词的录入(为使程序具有可演示性,单词不少于10个)。
(2)单词用按键控制依次在屏幕上显示,按键选择认识还是不认识,也可以直接进入下一个或者上一个。
(3)单词背完后给出正确率。
二、设计内容
3.1 设计思路
本题目实质上是一个具有一定复杂程度键盘扫描程序,可将单词存储在一个二维数组中,按“确定”键开始程序后,次显示0行的数组,即第一个单词。之后按下“向上”按键,显示上一行数组,即上一个单词;按下“向下”按键,显示下一行数组,即下一个单词。当显示的行数超过9时,程序结束,并通过按“确认”的次数,计算出正确率。
根据课题要求,使用C51进行编程,建立字符型数组存放单词,通过LCD1602显示所存放的单词。通过对简易键盘的扫描确定按下了那个按键,对单词做以下四种处理:(1)确认:表示对当前单词认识,使显示下一个单词,并置计数数组的对应位为1;
(2)不认识:表示对当前单词不认识,使显示下一个单词,并置计数数组的对应位为0;
(3)上一个:不对当前单词做任何处理,使显示上一个单词,计数数组对应位不变;
(4)下一个:不对当前单词做任何处理,使显示下一个单词,计数数组对应位不变;
没显示一个单词,在LCD显示已经显示单词的认识个数,如“1/10”,当10个单词显示完毕,最后给出单词认识率,如“70%”。此时,按下任何按键,系统自动回到初始状态。
3.2 电路设计原理图
电路原理图设计使用集原理图设计、PCB设计、电路仿真功能为一体的PROTUES软件。以该软件设计的电路原理图图11。
电路设计参数:
(1)C1 C2 为20-30PF瓷片电容,与12M晶振组成时钟振荡电路;
(2)复位电路使用R1为10K电阻、C3为10uF电解电容;
(3)1602液晶模块与单片机P0口连接,因P0口为真正的三态门结构,因些作数据总线使用时要外接上拉电阻,可使用10K的排阻;
(4)电路的供电为5V直流电源;
(5)D1为输入错误的状态指示灯,加220欧限流电阻连到VCC,因为STC89C51单片机IO的电流灌入能力要强于电流输出能力,因此一般使IO为低电平时点亮LED灯。
3.3软件编程设计
1.键盘扫描
a=P1; //读取按键
switch(a)
{ case 0xff:b=0;break; //没有按下按键
case 0xfe:{
czhi[i]=1; //用数组记录当前单词是认识的
i++; //指向下一个单词
b=0; //指示灯不亮
while(sure!=0);//按键松手检测
}
break; //确定,下一个
case 0xfd:{
czhi[i]=0; //记录当前单词是不认识的,c认识单词个数不变
i++; //下一个单词
b=1; //指示灯亮
while(unknown!=0);
}
break; //不认识,下一个
case 0xfb:{
b=0;
i--;
while(up!=0); //松手检测
}
break; //上一个
case 0xf7:{
b=0;
i++;
while(down!=0); //松手检测
}
break; //下一个}
2.检查状态是否忙
bit test() //读忙信号
{
bit busy;
RS=0;
RW=1;
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
busy=BF;
E=0;
return busy;
}
3.写控制字
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.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.LCD显示函数
void write_date(uchar date) //写数据到LCD 显示出来