设计一个由单片机控制的按键测量时长系统.docx
- 文档编号:30738072
- 上传时间:2023-08-20
- 格式:DOCX
- 页数:43
- 大小:359.34KB
设计一个由单片机控制的按键测量时长系统.docx
《设计一个由单片机控制的按键测量时长系统.docx》由会员分享,可在线阅读,更多相关《设计一个由单片机控制的按键测量时长系统.docx(43页珍藏版)》请在冰豆网上搜索。
设计一个由单片机控制的按键测量时长系统
一、设计要求:
1.单片机课程设计要求
(1)用Proteus仿真实现一个测量开关的闭合时长并用数码管显示出来。
(2)测量范围从0ms~60s。
(3)支持测量结果手动复位。
(4)用KeilC51编程实现上述功能
(5)用Keil与Proteus联调,自动或手动改写显示内容,要求显示稳定
2.C语言课程设计要求
(1)要求利用C语言面向过程的编程思想来完成系统的设计;
(2)突出C语言的函数特征,以多个函数实现每一个子功能;
(3)画出功能模块图;
(4)进行简单界面设计,能够实现友好的交互;
(5)具有清晰的程序流程图和数据结构的详细定义;
(6)熟练掌握C语言对文件的各种操作。
二、设计的作用、目的
通过程序设计,提高编程兴趣与编程水平。
1.设计一个由单片机控制的按键测量时长系统,数码管显示并手动复位。
通过对此程序的设计熟练掌握c语言。
2.设计一个学生成绩管理系统,上学期的本班的学习成绩进行管理,可以用数组设计这个程序,具有查询和检索功能,并且能够对指定文件操作,也可将多个文件组成一个文件。
通过对此程序的设计熟练掌握c语言。
三、课题分析
1.动态数码管显示,通过扫描返回键值,选择其中一个按键作为清零键,用定时器定1ms并计数。
2.输入N个学生的学号和每个学生考试三门功课(数学、英语、计算机基础)的成绩。
编程计算出每个学生的总分和平均分,并按学生成绩优劣排序。
要求:
含有:
登记学生资料、删除学生资料、查询学生资料、修改学生资料、保存学生资料、退出系统等各项功能。
四、设计的具体实现
一、单片机课程设计
1、组成模块
(1)定时函数,程序如下:
SCON=0x00;
TMOD=0x90;
TH1=(65536-900)/256;
TL1=(65536-900)%256;
(2)分解测量时长用于显示,程序如下:
h=p%10;
j=p/10;
g=j%10;
j=j/10;
f=j%10;
j=j/10;
e=j%10;
j=j/10;
d=d%10;
j=j/10;
c=j%10;
(3)显示函数,将当前所调节的数字显示出来,程序如下:
voiddisp_num()
{
LED(Seg[hour/10],Bit[0]);
delay
(2);
LED(Seg[hour%10],Bit[1]);
delay
(2);
LED(Seg[17],Bit[b]);
delay
(2);
LED(Seg[18],Bit[2]);
delay
(2);
LED(Seg[min/10],Bit[3]);
delay
(2);
LED(Seg[min%10],Bit[4]);
delay
(2);
LED(Seg[18],Bit[5]);
delay
(2);
LED(Seg[sec/10],Bit[6]);
delay
(2);
LED(Seg[sec%10],Bit[7]);
delay
(2);
2.流程图
是
二、C语言课程设计
1、系统的组成模块结构及功能
(1)当前学生信息:
通过结构体structstudent来保存学生的姓名,学号,性别,语文,数学,英语和计算机等等相关信息,并且通过cin函数来进行给当前学生输入初始信息.
具体使用的程序结构如下:
printstart();
printc();
printe(s);
printstart();
printf("\n");
return;
}
s=s->next;
}
p=(Node*)malloc(sizeof(Node));
strcpy(p->data.num,num);
printf("请你输入姓名:
");
scanf("%s",p->data.name);
getchar();
printf("请你输入性别:
");
scanf("%s",p->data.sex);
getchar();
printf("请你输入c语言成绩:
");
scanf("%d",&p->data.cgrade);
getchar();
printf("请你输入数学成绩:
");
scanf("%d",&p->data.mgrade);
getchar();
printf("请你输入英语成绩:
");
scanf("%d",&p->data.egrade);
getchar();
p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=p->data.totle/3;
/*信息输入已经完成*/
(2)、学生成绩查询:
输入一个学号,在文件中查找此学生,若找到则输出此学生的全部信息和成绩;若找不到则输出查找失败的信息.同时也可以全部把各科的平均成绩,最高和最低分输出。
使用的函数结构:
voidQur(Linkl)/*查询学生*/
{
intsel;
charfindmess[20];
Node*p;
if(!
l->next)
{
printf("\n=====>提示:
没有资料可以查询!
\n");
return;
}
printf("\n=====>1按学号查找\n=====>2按姓名查找\n");
scanf("%d",&sel);
if(sel==1)/*学号*/
{
printf("请你输入要查找的学号:
");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{
printf("\t\t\t\t查找结果\n");
(3)、学生资料删除:
输入要删除的学生学学号,若找到则根据提示进行删除;若找不到则提示没有资料删除。
使用的函数结构:
voidDel(Linkl)/*删除*/
{
intsel;
Node*p,*r;
charfindmess[20];
if(!
l->next)
{
printf("\n=====>提示:
没有资料可以删除!
\n");
return;
}
printf("\n=====>1按学号删除\n=====>2按姓名删除\n");
scanf("%d",&sel);
if(sel==1)
{
printf("请你输入要删除的学号:
");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{
r=l;
while(r->next!
=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>提示:
该学生已经成功删除!
\n");
shoudsave=1;
}
(4)、学生资料修改:
输入要修改的学生号,若找到则输入新的学生信息,并提示资料修改成功;若找不到则输出查找失败的信息。
使用的程序结构:
voidModify(Linkl)
{
Node*p;
charfindmess[20];
if(!
l->next)
{
printf("\n=====>提示:
没有资料可以修改!
\n");
return;
}
printf("请你输入要修改的学生学号:
");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{
printf("请你输入新学号(原来是%s):
",p->data.num);
scanf("%s",p->data.num);
printf("请你输入新姓名(原来是%s):
",p->data.name);
scanf("%s",p->data.name);
getchar();
printf("请你输入新性别(原来是%s):
",p->data.sex);
scanf("%s",p->data.sex);
printf("请你输入新的c语言成绩(原来是%d分):
",p->data.cgrade);
scanf("%d",&p->data.cgrade);
getchar();
printf("请你输入新的数学成绩(原来是%d分):
",p->data.mgrade);
scanf("%d",&p->data.mgrade);
getchar();
printf("请你输入新的英语成绩(原来是%d分):
",p->data.egrade);
scanf("%d",&p->data.egrade);
p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=p->data.totle/3;
printf("\n=====>提示:
资料修改成功!
\n");
(5)、学生成绩的排序,并统计单科的最高分。
(6)、退出系统。
2、系统程序流程图
图1.1总流程图
图1.2登记学生资料
图1.3查询学生资料
图1.4删除学生资料
图1.5修改学生资料
图1.6保存文件与退出系统
3、重要函数介绍
数据输入函数“cin()”
查看数据函数“lookdata()”
插入数据的函数“insert()”
查看数据的函数“find()”
更新数据的函数“update()”
保留数据函数“save()”
主函数main()
利用无限次循环for(;;)和swithch()实现各函数的调用,系统根据输入的数字选项来调用相应的函数。
初始化函数STUDENT*init()
这是一个无参函数,里面只有一个语句,它的作用是使链表初始化,使head的值为NULL。
比如:
没有这个函数的话,在你没有输入任何数据的情况下,去执行显示功能的时候会显示一些乱码!
菜单选择函数intmenu_select();
这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的九大功能,根据每个功能前面的序号进行选择,中间还显示系统当前的时间。
等执行完每一个函数功能后,按任一键回到主界面也要通过这个函数来实现!
输入记录函数STUDENT*create()
这是一个无参函数,用来执行第学生成绩记录的输入,当学生为0时停止输入,函数结束后,带回一个指向链表头的指针head。
算法:
先声明一个首节点head,并将head->next设为NULL。
每输入一个数据就声明一个新节点p,把p->next设为NULL,并且链接到之前列表的尾端。
在定义数据类型时,由于学生成绩管理信息需要由不同类型的数据反映出来。
如:
姓名、性别都需要用char型数据,而学号和成绩则需要用int型数据,并且每位同学的以上信息都需要一次性输入,所以采用结构体类型定义。
如:
typedefstructstudent/*定义结构体*/
{
charname[20] ; --------------------定义char型姓名
intnum[10]; --------------------定义int型学号
charsex --------------------定义char型性别
int cgrade;--------------------定义int型英语成绩
intmgrade;--------------------定义int型数学成绩
integrade;--------------------定义int型计算机成绩
totle;
structstudent*next;--------------------结构体指针
}stu;
五、程序运行背景:
1.单片机运行背景为keil和proteus的联调,keil用于编程,proteus用于仿真。
2.C语言的运行环境为VC++。
。
六、调试问题及解决方法:
1.单片机课程设计
按键过程中,存在消抖的问题,采用的是在主函数里加上延时函数,并同时显示当前的数字。
2.C语言课程设计
问题一、学生初始信息模块:
其中包括学生的姓名、学号和性别以及学生的语文、数学、英语和计算计相关信息;可用函数cin(stu*p1)来实现此操作。
当正确输入存在的学生学号,系统进行判断时,提示不存在此学生。
解决办法及步骤:
1、一个个输出所有的学生的学号,检查文件中是否有此学生,发现有。
2、既然有此学生,那么检查循环判断是否有此学生的语句发现没有错
3、输出用于循环检查语句中的学生信息,发现乱码
4、仔细分析乱码的原因,最后发现是变量的类型错误,错将学生类型的结构体指针变量定义为了其他类型的指针变量。
问题二、查询模块:
可用stu*lookdata(stu*p1) 来实现。
找到就输出此学生全部信息包括学生的语文、数学、英语和计算机等的成绩。
当正确输入查找信息时,系统却不能够得到所要查找的学生信息以及学生的语文、数学、英语和计算机的成绩。
解决办法及步骤:
1、检查所编写的程序代码是否完全正确,若不是,则改之,然后再继续正确输入查找信息看能否得到所要查找的学生信息以及学生的语文、数学、英语和计算机的成绩。
2、检查当我们在输入查找信息时,看是否我们输入的信息有误,若是这样的话,我们应当仔细输入查找信息。
七、心得
通过这次课程设计,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;再有对C语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对C语言中经常出现的错误也不了解,通过实践的学习,我认识到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。
在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。
因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前!
八、参考资料:
1.秦友淑、曹化工.C语言程序设计教程.华中科技大学出版社.
2.郭翠英.C语言课程设计案例精编.中国水利水电出版社.
6.张毅刚.单片机原理及应用[M].北京:
北京邮电出版社,2008.
附:
源程序及调试结果
一、单片机课程设计:
1.源程序:
#include
#defineucharunsignedchar
#defineunitunsignedint
ucharcodeSeg[17]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x00};/*数码表*/
ucharcodebitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsignedinta=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0;
unsignedintp=0,k=0,j=0,m=0,n=0,x=0;
sbitkey1=P2^0;
sbitkey2=P2^1;
voiddelay(uchartt)/*延迟*/
{
uchari;
for(;tt>0;tt--)
for(i=0;i<200;i++);
}
voidLED(uchard1,uchard2)/*显示*/
{INT0=0;
SBUF=d2;
while(!
TI);
TI=0;
SBUF=d1;
while(!
TI);
TI=0;
INT0=1;
}
voiddisplay(a,b,c,d,e,f,g,h)
{
LED(Seg[a],bitcode[0]);
delay
(1);
LED(Seg[b],bitcode[1]);
delay
(1);
LED(Seg[c],bitcode[2]);
delay
(1);
LED(Seg[d],bitcode[3]);
delay
(1);
LED(Seg[e],bitcode[4]);
delay
(1);
LED(Seg[f]|0x01,bitcode[5]);
delay
(1);
LED(Seg[g],bitcode[6]);
delay
(1);
LED(Seg[h],bitcode[7]);
delay
(1);
}
voidmain()
{
SCON=0x00;
TMOD=0x90;
TH1=(65536-900)/256;
TL1=(65536-900)%256;
while
(1)
{
TR1=!
key1;
while(!
key1)
{
p++;
if(p==60000)
p=0;
TH1=(65536-900)/256;
TL1=(65536-900)%256;
TF1=0;
h=p%10;
j=p/10;
g=j%10;
j=j/10;
f=j%10;
j=j/10;
e=j%10;
j=j/10;
d=d%10;
j=j/10;
c=j%10;
display(a,b,c,d,e,f,g,h);
}
if(key2==0)
{
a=0;b=0;c=0;d=0;e=0;f=0;g=0;h=0;p=0;
}
display(a,b,c,d,e,f,g,h);
}
}
2.调试结果
上电初始化
测量按键时间
手动清零
二、C语言课程设计:
1.源程序:
#include
#include
#include
intshoudsave=0;
structstudent
{
charnum[10];/*学号*/
charname[20];
charsex[4];
intcgrade;
intmgrade;
integrade;
inttotle;
intave;
charneartime[10];/*最近更新时间*/
};
typedefstructnode
{
structstudentdata;
structnode*next;
}Node,*Link;
voidmenu()
{
printf("********************************************************************************");
printf("\t1登记学生资料\t\t\t\t\t2删除学生资料\n");
printf("\t3查询学生资料\t\t\t\t\t4修改学生资料\n");
printf("\t5保存学生资料\t\t\t\t\t6统计最高成绩\n");
printf("\t7学生资料排序\t\t\t\t\t8显示学生成绩\n");
printf("\t0退出系统\n");
printf("********************************************************************************\n");
}
voidprintstart()
{
printf("-----------------------------------------------------------------------\n");
}
voidWrong()
{
printf("\n=====>提示:
输入错误!
\n");
}
voidNofind()
{
printf("\n=====>提示:
没有找到该学生!
\n");
}
voidprintc()/*本函数用于输出中文*/
{
printf("学号\t姓名性别英语成绩数学成绩C语言成绩总分平均分\n");
}
voidprinte(Node*p)/*本函数用于输出英文*/
{
printf("%-12s%s\t%s\t%d\t%d\t\t%d\t%d\t%d\n",p->data.num,p->data.name,p->data.sex,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.totle,p->data.ave);
}
Node*Locate(Linkl,charfindmess[],charnameornum[])/*该函数用于定位连表中符合要求的接点,并返回该指针*/
{
Node*r;
if(strcmp(nameornum,"num")==0)/*按学号查询*/
{
r=l->next;
while(r!
=NULL)
{
if(strcmp(r->data.num,findmess)==0)
returnr;
r=r->next;
}
}
else
if(strcmp(nameornum,"name")==0)/*按姓名查询*/
{
r=l->next;
while(r!
=NULL)
{
if(strcmp(r->data.name,findmess)==0)
returnr;
r=r->next;
}
}
return0;
}
voidAdd(Linkl)/*增加学生*/
{
Node*p,*r,*s;
charnum[10];
r=l;
s=l->next;
while(r->next!
=NULL)
r=r->next;/*将指针置于最末尾*/
while
(1)
{
printf("请你输入学号(以'0'返回
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 一个 单片机 控制 按键 测量 系统