




已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
张家界航空工业职业技术学院张家界航空工业职业技术学院毕 业 设 计 论 文学生考勤管理系统的设计学生姓名: 专 业:应用电子技术 班 级: 093331 负责教师: 龙治红 2012 年 5 月一、学生考勤打卡机分析.3二、系统的主要功能.3三、流程图.4四、数据结构设计.4-7五、类设计.7六、主要算法设计.8-9七、主要代码.9-21八、at89s52单片机简介.22-31九、调试.32-34十、总结.35一、学生考勤打卡机分析1.1需求分析功能需求: 1、录入学生的缺勤记录; 2、修改某个学生的缺勤记录; 3、查询某个学生的缺勤情况; 4、统计某段时间内,缺勤学生学号及缺勤次数,按缺勤权值统计学生的负分值,并能进行排序; 5、统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序; 6、系统以菜单方式工作数据需求 本系统主要涉及的数据有学生缺课信息类和有关信息排序类。学生缺课信息包括缺课时间,学生姓名,课程名称,第几节,学生迟到次数,早退次数,请假次数,旷课次数。有关信息排序类包括对课程排序和对姓名排序。性能需求 要求系统具有可靠性,速度要快二、系统的主要功能 (1)、录入学生的缺课记录,函数代码void input(records *r)模块中。首先提示用户按照正确的格式进行学生缺课记录的录入,这个步骤比较简单,只需要不断地将记录的每个数据项存入结构体对应的成员中。 (2)、修改某个学生的缺课记录,函数代码void edt(records *r)模块中。首先必须查找到你所需要修改的那位的学生全部缺课记录。这个模块不需要定义新的结构体。在修改前当然要检查记录是否为空了,不为空的话,可以设置下面这五个菜单供用户选择:1、缺课日期2、第几节课3、课程名称4、学生姓名5、缺课类型6、退出修改程序并返回系统主菜单。修改很简单,仅需要对该学生的某个部分进行替换即可。采用switch语句很快就解决。最后实现对所选记录的修改,完成后更新原有的学生记录。 (3)、查询某个学生的缺课情况,函数代码void search(records *r)模块中。达到查询结果按照日期升序排序,同一天内按照所缺课程的时间升序排序的目的, (4)、统计,函数代码为void order_c()和void order_s()的类模块中。其中实现对课程排序和对学生姓名的排序。三、流程图学生考勤系统结构图:基类的数据成员和成员描述 recordstring date,cname,sname;int cno,type;void set();string tostr();类名/函数名描述 类名/函数名描述record 基类edt()修改学生信息records实现学生旷课情况排序的类del()删除学生信息wt/rd()实现对文件的输入和输出search()查找学生信息input()录入学生的缺课记录search_s()一定范围查找学生信息edt()修改学生信息main()主函数四、数据结构设计 此程序运用多种条件语句,主体采用的是动态数组、指针。系统的设计采用了数组语句、选择语句和循环语句,在需要处理大量同类数据时,这样就使程序书写更加简洁。程序使用了布尔函数。选择语句多采用if多分支选择结构与switch语句。首先计算switch表达式,然后在caes子句中寻找值相等的常量表达式,并以此为入口符号,由此开始顺序执行。循环语句采用了for语句等、do-while语句,for语句用于已知循环次数的循环结构,括号中的三个量分别用来表示循环变量初值、循环终值和循环增量。do-while语句先循环后判断, break语句在switch语句中,保证多分支情况的正确执行,在循环语句中,强制终止本层循环。保存和读取函数是典型的函数功能,一个程序是由若干个函数组成的,保存和读取函数是和其他函数互相调用的再有使用有关类的设计,学生缺课信息类和有关信息排序类,如下:class record /学生缺课信息类public:void set(string d,int cno,string c,string s,int type)date.assign(d);/日期cname.assign(c);/课程名字sname.assign(s);/学生姓名this-cno=cno;/对缺课类型的选择 为int型this-type=type;/缺课类型void set(record re)date.assign(re.date);cname.assign(ame);sname.assign(re.sname);this-cno=o;this-type=re.type;string date,cname,sname;int cno,type;class records /实现学生旷课情况排序的类public:records() /构造函数r=new record100;n=0;void order_s() /姓名的排序int i; int j;string *s=new stringn;int *c=new int n;s0.assign(r0.sname);c0=1;int k=1,flag;for( i=1;in;i+)flag=0;for( j=0;jk;j+)if(ri.sname=sj)cj+;flag=1;break;if(!flag)sk=ri.sname;ck+=1;for(i=1;i0;j-)if(cjcj-1)int tmp=cj;cj=cj-1;cj-1=tmp;string stmp=sj;sj=sj-1;sj-1=stmp;cout旷课学生姓名t旷课次数endl;for(i=0;ik;i+)coutsittciendl;void order_c() /课程排序int i,j;string *s=new stringn;int *c=new int n;s0.assign(ame);c0=1;int k=1,flag;for( i=1;in;i+)flag=0;for(j=0;jk;j+)if(ame=sj)cj+;flag=1;break;if(!flag)sk=ame;ck+=1;for(i=1;i0;j-)if(cjcj-1)int tmp=cj;cj=cj-1;cj-1=tmp;string stmp=sj;sj=sj-1;sj-1=stmp;cout课程名t旷课人次endl;for(i=0;ik;i+)coutsitciendl;record *r;int n; 五、类设计系统中主要涉及了两个类: 一个是class record /关于学生考勤基本信息类 另一个是class records/实现学生旷课情况排序的类六、主要算法设计 关键算法:旷课情况的排序:class records/实现学生旷课情况排序的类public:records() /构造函数r=new record100;n=0;旷课记录的修改:cout请输入要修改缺课记录的学生姓名: tmp;t1.assign(tmp);for(i=0;in;i+)if(r-ri.sname=t1)flag=7;break;if(!flag)cout查无此学生!ri.date;t2=o;t3=ame;t4=r-ri.sname;t5=r-ri.type;旷课项目的修改! cout请输入要修改的项目:n(1.缺课日期 2.缺课节次 3.缺课名称 4.学生姓名 5.缺课类型 6.全部) flag;switch(flag)case 1:goto e1;case 2:goto e2;case 3:goto e3;case 4:goto e4;case 5:goto e5;case 6:goto e1;default:goto e0; 用到的知识点有:函数的作用域、函数的调用、数组赋值、函数循环、以及类的定义,另外还用到了for函数、getch函数、switch函数、case函数、default函数等等。七、主要代码第一部分:学生考勤管理系统#include stdlib.h#include hanshushixian.h#include record.h#include #include #include #include using namespace std;#include record.hint main()c1: /主菜单实现 system(cls); cout *endl; cout * 欢迎访问学生考勤管理系统 *endl; cout *endl; cout * 系统主菜单: 1.显示所有学生的缺课记录 *endl;cout * 2.录入学生的缺课信息记录 *endl; cout * 3.查询某个学生的缺课情况 *endl; cout * 4.修改某个学生的缺课记录 *endl; cout * 5.删除某个学生的缺课记录 *endl; cout * 6.统计某段时间内旷课情况 *endl; cout * 7. 退出系统 *endl; cout *endl; couto(_)o 请选择你所需要的操作 o(_)o: chose;if(chose=7)exit(0);records *r=new records();rd(r);switch(chose)case 1:pri(r);break;case 2:input(r);break;case 3:search(r);break;case 4:edt(r);break;case 5:del(r);break;case 6:search_s(r);break;default:goto c2;cout是否返回主菜单? (y/n)你的选择: yn;if(yn=y)goto c1;else if(yn=n)exit(0);else goto c3;return 0;第二部分:record.h (类的设计部分)#include #include using namespace std;#ifndef record_class#define record_classclass record /关于学生考勤基本信息类public:void set(string d,int cno,string c,string s,int type)date.assign(d);cname.assign(c);sname.assign(s);this-cno=cno;this-type=type;void set(record & re)date.assign(re.date);/assign可以避免不必要的内存分配,可以提高效率cname.assign(ame);sname.assign(re.sname);this-cno=o;this-type=re.type;string tostr()string s;char tmp3;s.assign(date);itoa(cno,tmp,10);s.append(#);s.append(tmp);/直接添加另一个完整的字符串s.append(#);s.append(cname);s.append(#);s.append(sname);itoa(type,tmp,10);s.append(#);s.append(tmp);return s;string date;string cname;string sname;int cno;int type;#endif record_class#ifndef records_class#define records_classclass records/实现学生旷课情况排序的类public:records() /构造函数r=new record100;n=0;void order_s() /姓名的排序int i; int j;string *s=new stringn;int *c=new int n;s0.assign(r0.sname);c0=1;int k=1,flag;for( i=1;in;i+)flag=0;for( j=0;jk;j+)if(ri.sname=sj)cj+;flag=1;break;if(!flag)sk=ri.sname;ck+=1;for(i=1;i0;j-)if(cjcj-1)int tmp=cj;cj=cj-1;cj-1=tmp;string stmp=sj;sj=sj-1;sj-1=stmp;cout旷课学生姓名t旷课次数endl;for(i=0;ik;i+)coutsittciendl;void order_c() /课程排序int i,j;string *s=new stringn;int *c=new int n;s0.assign(ame);c0=1;int k=1,flag;for( i=1;in;i+)flag=0;for(j=0;jk;j+)if(ame=sj)cj+;flag=1;break;if(!flag)sk=ame;ck+=1;for(i=1;i0;j-)if(cjcj-1)int tmp=cj;cj=cj-1;cj-1=tmp;string stmp=sj;sj=sj-1;sj-1=stmp;cout课程名t旷课人次endl;for(i=0;ik;i+)coutsitciendl;record *r;int n;#endif records_class第三部分:hanshushixian.h (功能子函数的实现部分)#include record.h#include #include #include #include stdlib.h#include using namespace std;void wt(records *r)/实现对文件的输出ofstream outf(data.txt);for(int i=0;in;i+)outfri.tostr()endl;outf!endl;void rd(records *r)/实现对文件的输入ifstream inf(data.txt);if(inf.eof()cout记录为空!n=0;while(true)inf.getline(tmp,10,#);if(tmp0=!)break;t1.assign(tmp);inf.getline(tmp,3,#);t2=atoi(tmp);inf.getline(tmp,30,#);t3.assign(tmp);inf.getline(tmp,30,#);t4.assign(tmp);inf.getline(tmp,3);t5=atoi(tmp);r-rr-n+.set(t1,t2,t3,t4,t5);bool timechk(string t1)int year=atoi(t1.substr(0,2).c_str();int month=atoi(t1.substr(2,2).c_str();int day=atoi(t1.substr(4,2).c_str();if(!(t1.length()=6&year0&year0&month0&day32)cout日期录入有误! 请重新录入: endl;return false;else return true;void input(records *r)/录入学生的缺课记录string t1,t3,t4;int t2,t5,flag=0;char yn;cout录入一条学生缺课记录:endl;/endl表示终止一行并刷新缓冲区m1:cout请输入缺课日期: (例如110627) t1;if(!(timechk(t1)goto m1;m2:cout请输入缺第几节课: t2;if(t210)cout节次录入有误! 请重新录入: endl;goto m2;cout请输入缺课名称: t3;cout请输入缺课学生姓名: t4;m3:cout请输入缺课类型: (1.迟到 2.早退 3.请假 4.旷课) t5;if(t54)cout类型输入有误! 请重新录入: endl;goto m3;for(int i=0;in;i+)if(r-ri.date=t1&o=t2&ame=t3&r-ri.sname=t4&r-ri.type=t5)cout该条记录已存在,是否添加为新记录? (y/n) yn;if(yn=y)break;else if(yn=n)goto n2;else goto n1;r-rr-n+.set(t1,t2,t3,t4,t5);n2:cout是否继续输入? (y/n) yn;if(yn=y)goto m1;else if(yn=n)cout保存修改? (y/n) yn;if(yn=y)wt(r);else return;else goto n3;void prione(record r)amettr.snamettflush;switch(r.type)case 1:cout迟到endl;break;case 2:cout早退endl;break;case 3:cout请假endl;break;case 4:cout旷课n=0)cout记录为空!endl;return;coutn序号t缺课日期 节次t课程名称t学生姓名t缺课类型endl;for(int i=0;in;i+)coutitri);void edt(records *r)/修改学生信息int i;if(r-n=0)cout记录为空!endl;return;cout请输入要修改缺课记录的学生姓名: tmp;t1.assign(tmp);for(i=0;in;i+)if(r-ri.sname=t1)flag=7;break;if(!flag)cout查无此学生!ri.date;t2=o;t3=ame;t4=r-ri.sname;t5=r-ri.type;cout请输入要修改的项目:n(1.缺课日期 2.缺课节次 3.缺课名称 4.学生姓名 5.缺课类型 6.全部) flag;switch(flag)case 1:goto e1;case 2:goto e2;case 3:goto e3;case 4:goto e4;case 5:goto e5;case 6:goto e1;default:goto e0;e1:cout请输入缺课日期: (例如080612) t1;if(flag!=6)goto e6;e2:cout请输入缺第几节课: t2;if(flag!=6)goto e6;e3:cout请输入缺课名称: t3;if(flag!=6)goto e6;e4:cout请输入缺课学生姓名: t4;if(flag!=6)goto e6;e5:cout请输入缺课类型: (1.迟到 2.早退 3.请假 4.旷课) t5;e6:r-ri.set(t1,t2,t3,t4,t5);char yn;cout保存修改? (y/n) yn;if(yn=y)wt(r);else return;void del(records *r)/删除学生信息if(r-n=0)cout记录为空!endl;return;cout请输入要删除的记录的序号: (输入-1删除全部) flag;if(flagr-n-1&flag-1)cout不存在所要删除的记录!n=0;elsefor(int i=flag;in-1;i+)r-ri.set(r-ri+1);r-n-;char yn;cout保存修改? (y/n) yn;if(yn=y)wt(r);else return;void search(records *r)/查找学生信息if(r-n=0)cout记录为空!endl;return;cout请输入要查询的学生姓名: str;for(int i=0;in;i+)if(r-ri.sname=str)if(!flag)coutn序号t缺课日期 节次t课程名称t学生姓名t缺课类型endl;coutj+tri);flag=1;if(!flag)cout没有查到该学生的缺课记录!n=0)cout记录为空!endl;return;records *r1=new records();g1:cout请输入要检索的时间范围: (例如110610-110612) tmp;ld.assign(tmp.substr(0,6);hd.assign(tmp.substr(7,6);if(!timechk(ld)|!timechk(hd)goto g1;for(i=0;in;i+)if(pare(ld)=0&pare(hd)ri.type=4)r1-rr1-n+.set(r-ri);cout请选择统计方式: (1.学生旷课情况降序显示 2.课程旷课情况降序显示)i;switch(i)case 1:coutn在ld到hd期间学生旷课情况如下:order_s();break;case 2:coutn在ld到hd期间课程旷课情况如下:order_c();break;default:goto g2;单片机是考勤打卡机的核心部分,在单片机的控制下,外部硬件电路实现其各个功能,通过k4射频模块实现对id卡的识别与读取,外部硬件电路还包括存储器模块、显示模块、时钟模块、串口通讯模块等。本章着重介绍at89s52单片机的相关知识、各模块电路的设计等。八、at89s52单片机简介at89s52单片机的主要性能:l 8k可反复擦写(1000次)isp flash roml 4.5-5.5v工作电压l 2568bit内部raml 低功耗空闲和省电模式l 3级加密位l 软件设置空闲和省电功能l 32个双向i/o口l 3个16位可编程定时/计数器l 全双工uart串行中断口线l 2个外部中断源l 中断唤醒省电模式l 看门狗(wdt)电路l 灵活的isp字节和分页编程 at89s52具有如下特点:40个引脚,8k bytes flash片内程序存储器,256 bytes的随机存取数据存储器(ram),32个外部双向输入/输出(i/o)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(wdt)电路,片内时钟振荡器。at89s52设计和配置了振荡频率可为0hz并可通过软件设置省电模式。空闲模式下,cpu暂停工作,而ram定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存ram的数据,停止芯片其它功能直至外中断激活或硬件复位。该芯片具有pdip、tqfp和plcc等三种封装形式。at89s52引脚图如图2.1所示。图2.1 at89s52引脚图8.1 时钟模块的设计8.11 ds1302引脚功能表及内部结构图ds1302的引脚如图2.2所示。图2.2 ds1302的引脚图8.12 ds1302的控制字控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到ds1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取ram数据,位5至位1指示操作单元的地址,最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。ds1302控制字如表2.1所示。表2.1 ds1302控制字8.13 复位 通过把输入驱动置高电平来启动所有的数据传送。输入有两种功能:首先,接通控制逻辑,允许地址命令序列送入移位寄存器;其次,提供了终止单字节或多字节数据的传送手段。当rst为高电平时,所有的数据传送被初始化,允许对ds1302进行操作。如果在传送过程中置rst为低电平,则会终止此次数据传送,并且i/o引脚变为高阻态。上电运行时,在vcc1+0.2v2.5v之前, 必须保持低电平。只有在sclk为低电平时,才能将rst置为高电平。8.14 数据输入输出在控制指令字输入后的下一个sclk时钟的上升沿时数据被写入ds1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个sclk脉冲的下降沿读出ds1302的数据,读出数据时从最低位第0位至最高位第7位。 8.15 ds1302的寄存器ds1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据为bcd码形式。其日历、时间寄存器及其控制字如表2.2所示。表2.2 ds1302日历、时间寄存器及其控制字寄存器名命令字取值范围各位内容写操作读操作765543210秒寄存器80h81h0059ch10secsec分钟寄存器82h83h0059010minmin小时寄存器84h85h0112或002312/24010/aphrhr日期寄存器86h87h0128,29,30,310010datadata月份寄存器88h89h011200010mmonth周日寄存器8ah8bh010700000dat年份寄存器8ch8dh009910yearyear 此外,ds1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与ram相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。ds1302与ram相关的寄存器分为两类,一类是单个ram单元,共31个,每个单元组态为一个8位的字节,其命令控制字为c0hfdh,其中奇数为读操作,偶数为写操作;再一类为突发方式下的ram寄存器,此方式下可一次性读写所有的ram的31个字节,命令控制字为feh(写)、ffh(读)。 ds1302与cpu的连接仅需要三条线,即sclk(7)、i/o(6)、rst(5)。vcc2 在单电源与电池供电的系统中提供低电源并提供低功率的电池备份。vcc2在双电源系统中提供主电源,在这种运用方式下vcc1连接到备份电源,以便在没有主电源的情况下能保存时间信息以及数据。ds1302由vcc2或vcc1两者中的较大者供电。当vcc2大于vcc1+0.2v时,vcc2给ds1302供电;当vcc2小于vcc1时,ds1302由vcc1供电。8.2 时钟模块电路的硬件设计时钟模块电路的硬件设计图如图2.3所示。图2.3 时钟模块电路图8.3 k4模块的设计8.31 k4模块的介绍技术性能参数:尺 寸:26.516.56.9mm电 源:5v44ma工作频率:125khz卡片格式:em4001/4102 或兼容卡译码方式:manchester 64bit,modulus 64i/o 输出电流:25ma sink/source天线电压:150volt pkpk感应距离:最大值为30cm感应速度:约0.3 秒 工作温度:-1575 储存温度:-2585 储存湿度:595rh输出格式:韦根26位/rs232 ttl(ascii)标准韦根26位输出时,k4引脚及说明如表2.3所示。表2.3 k4引脚及说明1脚天线1接外部天线2脚天线2接外部天线3脚接 +0v4脚蜂鸣器/发光二极管2.7khz 逻辑5脚1输出6脚0输出7脚重启8脚地0v9脚电源+4.6 到 +5.5v标准韦根26位输出数据结构如表2.4所示。表2.4 韦根26位输出数据结构1234567891011121314151617181920212223242526p(1)eeeeeeeeeeeeoooooooooooop(2)偶校验奇校验p(1):起始位,第1位为213位的偶校验位。p(2):终止位,第26位为1425位的奇校验位。韦根输出(3脚接低电平):(a) 输出资料为卡片号码(62e3086ced)的后三个字节:08h,6ch,edh。注:韦根26位输出时,将去除原卡片号码的高16bit的数据,从剩余卡片号码的最高位开始输出。(b) bit0 =1:d0=1,d1=0bit23=0:d0=0,d1=1(c) 输出波形如图2.4所示。k4模块天线参数: l 电感值:680uhl 天线尺寸参考值:长65mm宽55mm高3mm,线径:0.20mm,参考圈数67圈。 50us 1msdata1data0 p(1) bit23 bit22 bit1bit0 p(2)1 0 0 1 1 msb lsb图2.4 韦根26位输出波形8.4 显示模块的设计8.41 led的介绍该模块采用led显示器,用来显示 id卡的卡号以及ds1302提供的时间。led显示器相对于同类产品来讲,具有外观时尚、功能强大、价格低廉等优点。le
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 6 徽 章(教学设计)苏教版二年级下册综合实践活动
- 大型公共建筑合同投标保函范本
- 分期房产合同范本
- 13《 画杨桃》教学设计2023-2024学年统编版语文二年级下册
- 同城小店转让合同范本
- 企业模具合同范本
- 5这些事我来做 第一课时(教学设计)-部编版道德与法治四年级上册
- 耐火原料采购合同范本
- 8《网络新世界》(第一课时)教学设计-2024-2025学年道德与法治四年级上册统编版
- 劳务合同范本 货运
- 2023年自然资源部所属事业单位招聘(208人)笔试参考题库(共500题)答案详解版
- 钢结构夹层吊装方案
- 小学英语绘本-中国节日
- 基于STM32的智能小车研究
- 【实用资料】主动脉夹层PPT
- 生产制造行业岗位薪酬等级表
- 六年级科学培优辅差计划
- 教育从看见孩子开始
- 八大员考核评价大纲
- 小学二年级下册体育教案 全册
- 领导安全生产事故检讨书【8篇】
评论
0/150
提交评论