单片机计时秒表的设计正确无误Word下载.docx
《单片机计时秒表的设计正确无误Word下载.docx》由会员分享,可在线阅读,更多相关《单片机计时秒表的设计正确无误Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
![单片机计时秒表的设计正确无误Word下载.docx](https://file1.bdocx.com/fileroot1/2022-11/30/0c96c436-9911-47c7-9588-bc538d89785f/0c96c436-9911-47c7-9588-bc538d89785f1.gif)
〔2〕对软硬件进行模块划分,并对各单元电路结合EDA工具进行论证设计;
〔3〕在查阅文献基础上展开设计,力求创新。
2、技术要求
〔1〕计时范围:
小于1小时
〔2〕可显示出毫秒计时
〔3〕实现开始、停止、继续功能
摘要
本次设计主要完成具备基本功能的计时秒表的理论和实践设计单片机控制秒表是集于单片机技术、模拟电子技术、数字技术为一体的机电一体化高科技产品,具有功耗低,安全性高,使用方便等优点。
本次设计内容为以AT89S52单片机为核心的秒表,它采用键盘输入,单片机技术控制。
设计内容以硬件电路设计和软件设计两部分来设计。
利用单片机的定时器/计数器定时和计数的原理,用集成电路芯片、LED数码管以与按键来设计计时器。
将软、硬件有机地结合起来,使他拥有正确的计时、暂停和继续并同时可以用数码管显示,在现实生中应用广泛。
关键词:
单片机;
计时秒表;
定时器/计数器;
中断
方案比较与选择
〔方案数量可根据具体情况而定。
方案论述要求简明扼要,突出设计原理。
〕
方案1:
利用集成计数器芯片74HC161进行计数,外加晶振14M电路提供脉冲,计数器最大计数值是16个数,可以用多片计数器级联,计数值通过转换芯片的转换,再输送给数码管显示。
方案2:
使用单片机AT89S52的定时器T0或者T1方式1十六位定时器,每隔一段时间产生一个中断,给定时器初值,通过程序设计使得软件计数器加1,将最后得到的软件计数器分离成各个段码,采用动态法使得数码管亮。
方案3:
使用单片机AT89S52的定时器T0或者T1方式2定时器,每隔一段时间产生一个中断,通过程序设计使得软件计数器加1,将最后得到的软件计数器分离成各个段码,采用动态法使得数码管亮。
方案4:
使用单片机AT89S52的定时器T2十六位自动重载方式定时器,每隔一段时间产生一个中断,通过程序设计使得软件计数器加1,将最后得到的软件计数器分离成各个段码,采用动态法使得数码管亮。
确定方案与理由:
方案1电路连接复杂,不能实现秒表的启停。
方案2使用方式1不能实现定时器初值的自动重载,将影响表秒的精确度。
方案3虽然实现了自动重载功能,但是其计数的最大值较小,必须进行多次中断,这也会减少秒表的精确度。
选择方案4,因为其最大技术值是65535,并且实现了自动重载功能,能最大的增加精确度。
第1章总体设计方案
1.1总体设计方案
本次实习选用了价格较为低廉的AT89S52芯片来实现秒表的精确计数,并运用编程加以实现。
具体是通过单片机的T2定时器每隔一定的时间产生中断,通过程序设计使得软件计数器加1,将最后得到的软件计数器分离成各个段码,采用动态法使得数码管显示不同的数。
其具体系统原理框图如图1.1
图1.1
1.2软硬件功能分析
系统的总体工作过程:
首先通过软件设置选用单片机T2的自动重载方式的定时器,通过两个按键来控制定时器的启动和停止,来实现秒表的启停。
设置三个软件计数器,分别负责分、秒,毫秒的计数,每隔10ms产生一次中断,然后判断对应的软件计数器是否满足值,若满足则相应的值加一,若不满足则返回主程序,获得的分、秒,毫秒通过运算可以得到七段译码,送到数码管显示最后结果。
第2章硬件电路设计
2.1单片机最小系统电路设计设计
所谓的最小系统是指可以保证计算机工作的最小硬件构成。
对于单片机内部资源已能够满足系统需要的直接采用最小系统。
对于AT89S52具有片上Flash的单片机,其最小系统如图2.1所示,其主要组成电路是复位电路和时钟电路。
此时,P0和P2可以从总线应用解放出来,以作为普通I/O使用。
图2.1
2.1.1复位电路
手动复位电路的工作原理是:
加电瞬间,RST端的是高电平,随着RC电路充电电流的减小RST电位也减小,降到一定程度,即为低电平,单片机开始正常工作。
当按下按键时,RST直接与VCC相连,为高电平形成复位,同时电解电容被短路放电;
按键松开时,VCC对电容充电,充电电流在电阻上,RST依然为高电平,仍然是复位,这就保证了在RST端足够长的高电平时间,充电完成后,电容相当于开路,RST为低电平,正常工作。
如图2.1.1所示。
时钟电路
时钟电路产生单片机工作所需要的时钟信号,电路应在唯一的时钟信号控制下严格的按时序进行工作。
在51芯片内部有一个高增益反向放大器,其输入端为引脚XTAL1,输出端引脚为XTAL2,在芯片的外部通过这两个脚跨接晶体振荡器和微调电容,形成反馈电路,就构成一个稳定的自激振荡器。
振荡晶体可在1.2MHz~12MHz之间选择,电容值无严格要求,但在电容值取值对振荡频率输出的稳定性、大小、振荡电路起振速度有少许影响,可在20pF~100pF之间取值。
本设计选取晶振为12MHz,电容为30pF。
如图2.1.2所示。
图2.1.1图2.1.2
2.2系统供电电源设计
本系统需要采用5V电源,所采用的电源电路是由LM1117三端稳压器组成的。
电源电路如图2.2所示。
图2.2
2.3按键电路
按键是常开的按键开关,每个按键都被赋予一个代码,称为键码。
按键的开关状态通过一定的电路转换为高、低电平状态。
按键闭合过程在相应的I/O端口形成一个负脉冲。
闭合和释放过程都要经过一定的过程才能达到稳定,这一过程是处于高、低电平之间的一种不稳定状态,称为抖动。
抖动持续时间的长短与开关的机械特性有关,一般在5~10ms之间。
本设计中是用软件程序来去除抖动。
由于系统使用到的按键数并不多,所以不选用矩阵键盘而选用独立式按键电路。
直接用I/O口线构成单个按键电路,每个按键占用一条I/O口线,每个按键的工作状态不会产生互相影响。
P2.0接停止按键,P2.1接开始按键,P2.2接继续按键然后按键都与地相接。
相应的按键电路图如图2.3所示。
图2.3
2.4驱动显示电路
LED显示器是单片机应用系统中常用的廉价输出设备。
它是由若干个发光二极管组成的,当发光二极管导通时,相应一个笔画发光,控制某几段发光二极管导通,就能显示出某个数码或字符。
在单片机应用系统中,显示器显示有静态显示和动态扫描显示两种方法。
1.静态显示
所谓静态显示,就是每一个显示器都要占用单独的具有锁存功能的I/O接口用于笔划段字形代码。
这样单片机只要把要显示的字形代码发送到接口电路就可以了,直到要显示新的数据时,再发送新的字形码。
使用这种方法CPU的开销小,控制程序简单,但占用较多的硬件资源。
2.动态扫描显示
动态扫描显示是单片机中应用最为广泛的一种显示方式。
其接口电路是把所有显示器的8个笔划段A~DP同名端连在一起,而每一个显示器的公共极COM各自独立地受I/O线控制。
CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是哪个显示器亮,则取决于COM端,而这一端是由I/O控制的,因此就可以自行决定何时显示哪一位了。
所谓动态扫描就是指采用分时的方法,轮流控制各个显示器的COM端,使各个显示器轮流点亮。
在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的,但由于人的视觉暂留现象与发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。
所以,就采用动态扫描显示。
我们选用4位共阳数码管这样用到了单片机的两个I/O接口P0和P2。
又因P2接口不能承受六位的数码管的电流,那就需要在P2接口上加上六个三极管来驱动。
四位共阳数码管总共有12个引脚,A~DP为段选,vcc1、vcc2和vcc3为位选,A~DP段选通过470Ω电阻与P0.0~P0.7相应对接,而四个位选与P2.3~P2.6相应对接,四位共阳数码管的驱动电路如图2.4.1所示。
图2.4
第3章系统软件设计
3.1软件总体设计思路
经过前几章的设计工作,系统的硬件电路设计已经完成了。
然而,对于一个完整的设计系统来说,只有硬件电路的设计完成是不够的,它必须通过软件的编程来实现系统的工作控制功能,从而实现电路应有的系统功能。
单片机系统的软件设计主要使用汇编语言或高级语言。
汇编语言与系统硬件关系密切,可方便实现诸如中断管理以与模拟/数字量的输入输出等功能,具有占用系统资源小、执行速度快的特点,但是,对于复杂的大型应用系统,其代码可读性差,不利于维护和升级。
高级语言的代码效率和长度都不如汇编语言,但其结构清晰、可读性好、开发周期短、有极强的可移植性,在多数应用方面执行效率与汇编语言差距不大,得到了极为广泛的应用。
而C语言既有高级语言的各种特点,又可对硬件进行操作,并可进行结构化程序设计。
用C语言编写的程序较容易移植,可生成简洁、可靠的目标代码。
本次软件设计采用C语言编写。
本软件整体设计思路为:
通过T2定时机器的自动重载功能,以与设置的软件计数器的计数来实现计时并显示出来。
本设计以单片机作为系统的核心控制单元,运用C语言进行编程工作,按照工作流程来实现设计要求的简易秒表计时的功能,并且通过软硬件的不断调整,来完善优化设计系统,从而实现结构化程序设计。
3.2主程序流程设计
通过之前的硬件系统设计,综合考虑各方面的因素,系统主控流程图3.1所示:
图3.1主程序流程图
3.3中断服务子程序流程图
由于采用T2十六位自动重载的方式,定时时间为10ms,通过多次中断实现功能。
中断服务子程序流程图3.2所示:
实习总结
〔包括:
实习质量分析、待完善和改进之处和心得体会〕
在本次实习过程中比较好的完成了各项任务。
在设计简易秒表时,采用定时器T2的自动重载方式通过多次中断实现计时。
在软硬件各方面做了充足的准备,可以说实习效果较好。
本次实习在参考了相关电路和他人的设计方法基础上自行设计完成的。
通过较少的集成器件,实现了计时启动、停止、继续和毫秒显示的功能。
该秒表具有准确度高、灵敏度好、成本低、低功耗等特点。
此外。
本设计单片机的很多资源还未使用,为以后的功能拓展提供了广泛的空间。
由于实验条件与自身所学知识的限制,本系统还存在有待进一步的完善和改进的地方。
例如,本次所用的LED为四位数码管但是没有冒号显示所以不是特别完整的显示秒表计时。
还有就是不能在毫秒挡实现暂停。
这需要在以后进一步完善。
通过对本次实习,使自己深刻的认识到自己的很多不足之处,在实际动手操作能力的不足,在进行程序编程时,自己需要,认真审题,看懂题目的要求!
对于软件编程不益太简单或者太难。
做到既能把课题完成又能锻炼自己的能力!
根据课题要求,复习相关的知识,查询相关的资料。
根据课程条件,找到适合的方案,找到需要的元器件与工具,准备课程。
根据课程设计的要求和自己所要增加的功能写好程序流程图,在程序流程图的基础上,根据芯片的功能写出相应的程序和增加额外的功能程序。
然后再进行程序调试和相应的修改,以达到能够实现所要求的功能的目的。
这次实习增长了我的实践意识,还促使我认真学习了单片机的内部设置,也让我了解到在实际电路中,很多细节上的问题必须要考虑清楚,怎么做才是对电路的优化设计是最好的,必须通过实际操作过程加以确认。
参考文献
[1]刘海成.单片机与应用原理教程[M].:
中国电力,2012.
[2]康华光.电子技术基础〔模拟部分〕[M].高等教育,2006.
[3]秦进平.数字电子与EDA技术[M].科学,2011.
附录
附录1总原理图
附录2源程序
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
sbits1=P2^2;
sbits2=P2^1;
sbits3=P2^0;
sbitwei1=P3^0;
sbitwei2=P3^1;
sbitwei3=P3^2;
sbitwei4=P3^3;
ucharfen,miao,haomiao,miaoge,miaoshi,fenge,fenshi,haomiaoge,haomiaoshi;
uinttimes1=0;
uinttimes2=0;
ucharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
voiddelay_1ms(void)
{
uinti;
for(i=0;
i<
124;
i++);
}
voidshurumiao(ucharmiao)
miaoshi=miao/10;
miaoge=miao%10;
voidshurufen(ucharfen)
fenshi=fen/10;
fenge=fen%10;
voidshuruhaomiao(uinttimes1)
{
haomiaoshi=times1/10;
haomiaoge=times1%10;
voiddisplay(void)
wei1=0;
P0=table[fenshi];
delay_1ms();
wei1=1;
wei2=0;
P0=table[fenge]&
0x7f;
wei2=1;
wei3=0;
P0=table[miaoshi];
wei3=1;
wei4=0;
P0=table[miaoge];
wei4=1;
voiddelay(uchari)
ucharj,k;
for(j=i;
j>
0;
j--)
for(k=125;
k>
k--);
voidanjian(void)
s1=1;
s2=1;
s3=1;
if(s1==0)
delay(20);
if(s1==0)
{
while(s1==0);
TR2=1;
}
}
if(s2==0)
while(s2==0);
TR2=0;
}
if(s3==0)
wei1=1;
wei2=1;
wei3=1;
wei4=1;
wei1=0;
P0=table[haomiaoshi];
P0=table[haomiaoge];
}
}
voidmain()
T2CON=0x00;
//T2MOD=0x01;
TH2=216;
TL2=240;
RCAP2H=216;
RCAP2L=240;
EA=1;
ET2=1;
TR2=0;
fen=0;
miao=0;
times1=0;
while
(1)
shurufen(fen);
shurumiao(miao);
shuruhaomiao(times1);
display();
anjian();
}
voidT2_ISR(void)interrupt5
{
TF2=0;
times1++;
times2++;
if(times1>
=100)
times1=0;
miao++;
if(miao>
59)
miao=0;
if(times2>
=6000)
times2=0;
fen++;
if(fen>
60)
fen=0;