计算机综合实训 数字秒表.docx
《计算机综合实训 数字秒表.docx》由会员分享,可在线阅读,更多相关《计算机综合实训 数字秒表.docx(21页珍藏版)》请在冰豆网上搜索。
计算机综合实训数字秒表
课程设计
题目计算机综合实训(数字秒表)
二级学院
专业
班级
学生姓名
学号
指导教师
考核项目
设计50分
平时成绩20分
答辩30分
得分
总分
考核等级
教师签名
前言
在计算机综合应用实训,此实验阐述了基于单片机的数字电子秒表设计。
本设计主要特点是计时精度达到0.01s,具有多组数据记录功能,一键实现开始、暂停、继续和清零功能。
完成了专业秒表计时的基本计时功能,而且误差很小。
是各种体育竞赛的必备设备之一。
数字秒表计时器特色
1.数字电子秒表系统采用AT89S52单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合显示电路、LED数码管以及外部控制电路来设计计时器。
2.将软、硬件有机地结合起来,使得系统能够实现六位LED显示,显示时间为0~59分59秒99毫秒,计时精度为0.01秒,能正确地进行计时,同时能记录10组时间,并能对计时时间进行查询。
3.其中软件系统采用C语言编写程序,包括显示程序,定时中断服务,延时程序等,硬件系统利用PROTEUS强大的功能来实现,简单切易于观察,在仿真中就可以观察到实际的工作状态。
目录
一、概述3
1.意义:
3
2.小组的工作分配:
3
3.系统主要功能3
二、硬件电路设计及描述4
1.方案及设计思想:
4
2.电路原理图6
3.芯片资料:
7
4.元件清单:
9
三、软件设计流程及描述10
1.模块层次结构图11
2、程序流程图12
四.测试21
五.总结23
参考文献……………………………………………………………24
一、概述
1.意义:
从古至今,时间都是一个很宝贵的东西,但是他们却不能随时喊暂停和开始。
现在,我们有了数字秒表,它让时间被记录成为了可能。
它被广泛运用于日常生活中。
如体育竞技、工业、医学和航天等领域。
人们通过秒表测量时间的同时,秒表的精度就成为了人们最关心的问题,这就要求它的计时最小单位足够小,显示模块的灵敏度足够高。
特别是在体育测量中对秒表的精度和功能有较高的要求。
无独有偶,本设计达到了实际运用对测量准确性的要求,并且可记录多组数据。
因为这次实验中让系统有了更小的计时单位和更多的记录功能。
本设计能解决竞技时,一表记录多人不同成绩。
其中一键实现开始、暂停、继续和清零的功能,简化了电路,操作简便。
2.小组的工作分配:
3.系统主要功能
1.实现计时功能:
当按下开始键时,秒表开始计时。
计时范围在0~59分59秒990毫秒。
2.实现多组数据记录功能:
当计时开始后,按下记录键,每按一次记录一组数据,暂停后,用另一按键可以对记录数据翻动查询。
3.实现一键四功能:
一键实现开始、暂停、继续和清零功能。
二、硬件电路设计及描述
1.方案及设计思想:
设计要求:
数字秒表
A.最小显示位10ms,计时范围0~59分59秒990毫秒。
B.一键控制四种工作状态:
计时,暂停,继续计时,清零。
C.可以记录并读取多组数据。
D.精度为0.01s。
F.系统工作符合一般秒表要求。
方案一:
此方案在仿真中采用AT89S52单片机实现。
采用独立式键盘和动态扫描方式来实现。
用K1、K2,K3三个按键分别接单片机P1.0~P1.2,K1来实现秒表的启动、暂停、继续计时、停止四个功能,K2实现对数据的记录,K3实现对数据的读取;以P0口作为数据的输出,应接外拉电阻和74LS245用来驱动数码管的段选,以P2.0~P2.5口控制数码管的位选。
以完成用单片机控制LED数码管,结构框图如图1.1。
其原理如图X-1所示。
方案二:
此方案采用数字电路实现,单片机控制显示部分。
数字电路具有占用硬件电路复杂、只能驱动数码管和其它简单的外围电路、产生的最小计时单元误差大。
原理图如图X-2所示。
图X-1采用单片机控制方法
图X-2数字电路控制方法
方案比较:
通过以上两种方案框图,我们可以看到用单片机来实现,自由度大,不但能实现所要求的功能,而且能在很大的程度上扩展功能,且产生效果很好,故我们采用前一种方案。
其中显示,我们采用的是LED显示,因其器件显示清晰,价格低廉。
所以此次设计,我们方案一。
2.电路原理图
仿真电路图
结构图
按键部分(左边)
单片机首先判断外部按键P1.0、P1.1、P1.2的状态,当按“开始”键时,单片机根据外部脉冲信号,计算时间,动态在P0口输出段选电平在P2口输出位选电平,经过74LS245驱动后通过数码管显示出计时时间。
计时开始后再按此键便暂停,继续按则继续计时,再按下就可以清零了。
按P1.1接的键可以记录多组数据,P1.2接的按键可以读取记录的数据。
LED显示部分(右边)
我们采用动态显示的方法。
动态显示的优点是,它占用CPU的时间少,每次只把一个数据送到外部接口,做实物时调节程序内的扫描时间就可以让数码管显示平稳察觉不到闪烁。
静态显示,是每一个数码管不论在什么时候都点亮,占用CPU的时间很多。
数码管为共阳极工作,P0端口用来为八段显码提供低电平输入,P2.0、P2.1、P2.2、P2.3、P2.4、P2.5输出高电平用作选位,来确定哪一个数码管显示,并协同P0口确定显示的数值,在显示的过程中,为确保有足够大的驱动电流,我们采用了一个74LS245来驱动P0口,P2.0~P2.5采用的放电电路来驱动。
使数码管能够正常显示。
3.芯片资料:
74LS245管脚图
74LS245是我们常用的芯片,用来驱动led或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。
74LS245还具有双向三态功能,既可以输出,也可以输入数据。
当8051单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS245等总线驱动器。
当片选端/CE低电平有效时,DIR=“0”,信号由B向A传输;(接收)DIR=“1”,信号由A向B传输;(发送)当CE为高电平时,A、B均为高阻态。
由于P2口始终输出地址的高8位,接口时74LS245的三态控制端1G和2G接地,P2口与驱动器输入线对应相连。
P0口与74LS245输入端相连,E端接地,保证数据线畅通。
8051的/RD和/PSEN相与后接DIR,使得RD且PSEN有效时,74LS245输入(P0.1←D1),其它时间处于输出(P0.1→D1)。
AT89S52管脚图
4.元件清单:
AT89S52单片机1片
74LS2451片
C1815三极管6个
12Mhz晶振1个
30pf电容2个
100pf电容1个
1k电阻2个
10k电阻3个
1k电阻排1个
按键开关4个
共阳极四位LED数码管1个
共阳极二位LED数码管1个
三、软件设计流程及描述
1.模块层次结构图
简述:
通过键盘模块控制整个显示模块,但是在写程序时应该注意位选的延时,使显示模块更完美。
键盘模块为控制模块,而位选模块和段选模块只是为显示模块服务的,主程序是整个程序的基础,也是核心。
2、程序流程图
3.源程序代码
#include
#include
codeunsignedcharnum[]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90};
codeunsignedcharnum1[]={0x40,0x79,0x24,0x30,0x19,
0x12,0x02,0x78,0x00,0x10};
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
voidinit();
voiddelay();
voiddisplay();
voidkey_1();
voidkey_2();
voidkey_3();
staticunsignedcharMs0[10],Ms1[10],Sec0[10],Sec1[10],Min0[10],Min1[10];
staticintkey_n,j,x,y,z;
unsignedcharkey3_flag,key4_flag;
unsignedcharms0=0,ms1=0,sec0=0,sec1=0,min0=0,min1=0;
voidmain()
{
init();
while
(1)
{
key_1();
key_2();
key_3();
display();
}
}
voiddelay(unsignedintz)
{
unsignedintx,y;
for(x=z;x>0;x--)
for(y=600;y>0;y--);
}
voidkey_1()
{
if(!
key1)
{
delay
(1);
if(!
key1)
{
while(!
key1)
{;}
key_n++;
if(key_n==1)
TR0=1;
else
{
if(key_n==2)
TR0=0;
else
{
if(key_n==3)
TR0=1;
else
{
if(key_n==4)
{
TR0=0;
ms0=ms1=0;
sec0=sec1=0;
min0=min1=0;
key_n=0;
for(j=0;j<10;j++)
{
Min0[j]=0;Min1[j]=0;
Sec0[j]=0;Sec1[j]=0;
Ms0[j]=0;Ms1[j]=0;
}
j=0;x=0;
}}
}
}
}
}
}
voidkey_2()
{
if(!
key2)
{
delay
(1);
if(!
key2)
{
while(!
key2)
{;}
if(j==10)
TR0=0;
Min0[j]=min0;Min1[j]=min1;
Sec0[j]=sec0;Sec1[j]=sec1;
Ms0[j]=ms0;Ms1[j]=ms1;
j++;
}
}
}
voidkey_3()
{
if(!
key3)
{
delay
(1);
if(!
key3)
{
while(!
key3)
{;}
key3_flag=1;
if(x==j)
x=0;
else
if(key4_flag)
x+=1;
key4_flag=0;
min0=Min0[x];sec0=Sec0[x];ms0=Ms0[x];
min1=Min1[x];sec1=Sec1[x];ms1=Ms1[x];
x++;
}
}
}
voiddisplay()
{
P2=0x20;
P0=num[ms0];delay
(1);
P2=0x10;
P0=num[ms1];delay
(1);
P2=0x08;
P0=num1[sec0];delay
(1);
P2=0x04;
P0=num[sec1];delay
(1);
P2=0x02;
P0=num1[min0];delay
(1);
P2=0x01;
P0=num[min1];delay
(1);
}
voidinit()
{
key3_flag=0,key4_flag=0;
ms0=ms1=sec0=sec1=min0=min1=0;
key_n=0;j=0;x=0;
P2=0xff;
P1=0xff;
TMOD=0x01;
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
EA=1;
ET0=1;
TR0=0;
}
voidtiem0(void)interrupt1using1
{
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
TR0=1;
ms0++;
if(ms0==10)
{
ms0=0;
ms1++;
if(ms1==10)
{
ms1=0;
sec0++;
if(sec0==10)
{
sec0=0;
sec1++;
if(sec1==6)
{
sec1=0;min0++;
if(min0==10)
{
min0=0;
min1++;
if(min1==6)min1=0;
}
}
}
}
}
}
四.测试
测试方法:
将电路接上电源,自制秒表与校验秒表同时计时,我组采用了用手机同时拍下2个秒表的数据,以此减小操作误差。
测试设备:
校验秒表(手机秒表),直流稳压电源,可以摄像的手机。
截图数据:
整理数据:
自制秒表计时时间
校验秒表计时时间
相差时间
02分59秒880毫秒
02分59秒800毫秒
80毫秒
04分26秒680毫秒
04分26秒800毫秒
120毫秒
08分16秒880毫秒
08分17秒300毫秒
420毫秒
11分13秒880毫秒
11分13秒300毫秒
420毫秒
14分09秒880毫秒
14分10秒800毫秒
920毫秒
17分22秒880毫秒
17分23秒800毫秒
920毫秒
20分24秒880毫秒
20分25秒800毫秒
920毫秒
系统指标:
相差时间/校验时间=误差时间
取20分钟的误差大概为1.5s
根据计算误差时间约为0.00125秒
该秒表符合设计要求,能满足一般非精密计时工作。
备注:
在对2个秒表同时操作会产生人为误差,而且在用手机取图的时候也会有一定的误差,因此此数据会存在一定的偏差。
五.总结
我们小组通过团队交流、合作与实干,以及在老师画龙点睛的指导和建议下,历时两个周完成了数字秒表的实训项目(整体设计、程序设计、程序仿真、电路实际连接和调试阶段)。
并且数字秒表计时精度较高,实用性好。
我们大家的表现也是可圈可点的。
在此期间,我们从以往的理论上升到了实际。
较全面而系统的认识了关于单片机、数码管和放大器等的引脚和功能,以及知道了如何将一般C语言运用到单片机C语言并且在软件中编译仿真等。
这次实训的电路连线中,我们首次用到了烙铁。
当然,使用技巧还有待提高。
当然,在程序设计仿真和实物连接中,我们也遇到了很多困哪。
如:
程序设计的时候经过多次修改,找到程序中存在的问题(P2端口的程序设计时,在书写程序时语法错误);在仿真中,没有给数码管的位选路加放大电路;在实物连接中,由于实物布局不科学以及运用烙铁不熟练就很容易导致线路松动、短路。
这次实训过后,我们渐渐地觉得我们也能自己设计一些简单的工具,如闹钟、计时器、计算器、交通灯等。
我们因为能学以致用而骄傲。
参考文献:
刘坤《51单片机典型应用开发范例大全》中国铁道出版社
彭伟《单片机C语言程序设计实训—基于8051+Proteus仿真》电子工业出版社