您的当前位置:首页正文

单片机计时秒表的设计(正确无误)

2024-02-18 来源:榕意旅游网
实习任务书 学生姓名 指导教师姓名 题目名称 一、设计的内容、目的和意义 本次实习主要完成具备基本功能的计时秒表的理论和实践设计。 计时秒表是重要的计时工具,广泛运用于各行各业中。作为一种测量工具,计时秒表相对其它一般的记时工具具有便捷、准确、可比性高等优点。不仅可以提高精确度,而且可以大大减轻操作人员的负担,降低错误率。因此计时秒表常常用于体育竞赛及各种其他要求有较精确时间的各领域中。人们在日常生活中,有很多时候也要精确地计算时间,但往往因为人为因素造成人们不愿意看到的误差。秒表的出现,解决了传统的由于人为因素造成的误差和不公平性。通过实习加深对单片机课程的全面认识复习和掌握,对单片机课程的应用进一步的了解。 通过此次实习能够将单片机软硬件结合起来,对程序进行编辑,校验。实习通过单片机的定时器/计数器定时和计数原理,设计简单的计时器系统,拥有正确的计时、暂停、清零,并同时可以用数码管显示,在现实生活中应用广泛,具有现实意义。 系部 职称 电气与信息工程学院 讲师 计时秒表的设计 专业 班级 是否外聘 自动化11-1班 □是否 二、设计的技术指标要求 1、研究方法 (1)总体按照最优化的方法进行软件设计和硬件设计,走软件实现电路; (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

复位电路 时钟电路 单片机 AT89S52 数码管显示 图 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所示。 2.1.2 时钟电路

时钟电路产生单片机工作所需要的时钟信号,电路应在唯一的时钟信号控制下严格的按时序进行工作。 在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所示:

开始 初始化定时器T2为16为自动重载方式 设定初始值为55535,定时10ms 开启总中断和定时器中断 对分进行计数并分离十位、个位 对秒进行计数并分离十位、个位 对毫秒进行计数并分离十位、个位 显示子程序 按键子程序

图3.1 主程序流程图

3.3 中断服务子程序流程图

由于采用T2十六位自动重载的方式,定时时间为10ms,通过多次中断实现功能。中断服务子程序流程图3.2所示:

进入中断 清零中断标志 软件计数器time1++、time2++ NO time1>=100? YES time=0,miao++ miao>59? YES miao=0 NO 返回主程序 time2>=6000? YES time2=0,fen++ NO fen>60? YES fen=0 NO

实习总结

(包括:实习质量分析、待完善和改进之处和心得体会) 在本次实习过程中比较好的完成了各项任务。在设计简易秒表时,采用定时器T2的自动重载方式通过多次中断实现计时。在软硬件各方面做了充足的准备,可以说实习效果较好。 本次实习在参考了相关电路和他人的设计方法基础上自行设计完成的。通过较少的集成器件,实现了计时启动、停止、继续和毫秒显示的功能。该秒表具有准确度高、灵敏度好、成本低、低功耗等特点。此外。本设计单片机的很多资源还未使用,为以后的功能拓展提供了广泛的空间。 由于实验条件及自身所学知识的限制,本系统还存在有待进一步的完善和改进的地方。例如,本次所用的LED为四位数码管但是没有冒号显示所以不是特别完整的显示秒表计时。还有就是不能在毫秒挡实现暂停。这需要在以后进一步完善。 通过对本次实习,使自己深刻的认识到自己的很多不足之处,在实际动手操作能力的不足,在进行程序编程时,自己需要,认真审题,看懂题目的要求!对于软件编程不益太简单或者太难。做到既能把课题完成又能锻炼 自己的能力!根据课题要求,复习相关的知识,查询相关的资料。根据课程条件,找到适 合的方案,找到需要的元器件及工具,准备课程。根据课程设计的要求和自己所要增加的功能写好程序流程图,在程序流程图的基础上,根据芯片的功能写出相应的程序和增加额外的功能程序。然后再进行程序调试和相应的修改,以达到能够实现所要求的功能的目的。这次实习增长了我的实践意识,还促使我认真学习了单片机的内部设置,也让我了解到在实际电路中,很多细节上的问题必须要考虑清楚,怎么做才是对电路的优化设计是最好的,必须通过实际操作过程加以确认。 参考文献

[1]刘海成.单片机及应用原理教程[M].北京:中国电力出版社,2012. [2]康华光.电子技术基础(模拟部分)[M].高等教育出版社,2006. [3]秦**.数字电子与EDA技术[M].科学出版社,2011.

附录1 总原理图

附录

附录2 源程序

#include #define uchar unsigned char #define uint unsigned int sbit s1=P2^2; sbit s2=P2^1; sbit s3=P2^0; sbit wei1=P3^0; sbit wei2=P3^1; sbit wei3=P3^2; sbit wei4=P3^3;

uchar fen,miao,haomiao,miaoge,miaoshi,fenge,fenshi,haomiaoge,haomiaoshi; uint times1=0; uint times2=0;

uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; void delay_1ms(void) { uint i;

for(i=0;i<124;i++); }

void shurumiao(uchar miao) {

miaoshi=miao/10; miaoge=miao%10; }

void shurufen(uchar fen) {

fenshi=fen/10; fenge=fen%10; }

void shuruhaomiao(uint times1) {

haomiaoshi=times1/10;

haomiaoge=times1%10; }

void display(void) { wei1=0; P0=table[fenshi]; delay_1ms(); wei1=1; wei2=0;

P0=table[fenge]&0x7f; delay_1ms(); wei2=1; wei3=0;

P0=table[miaoshi]; delay_1ms(); wei3=1; wei4=0;

P0=table[miaoge]; delay_1ms(); wei4=1; }

void delay(uchar i) {

uchar j,k;

for(j=i;j>0;j--)

for(k=125;k>0;k--); }

void anjian(void) {

s1=1; s2=1;

s3=1;

if(s1==0)

{

delay(20);

{

while(s1==0); TR2=1; }

if(s1==0)

}

if(s2==0) {

delay(20);

{

while(s2==0); TR2=0; }

if(s2==0)

}

if(s3==0) {

delay(20);

{

wei1=1; wei2=1; wei3=1; wei4=1; wei1=0;

if(s3==0)

P0=table[haomiaoshi]; delay_1ms(); wei1=1; wei2=0;

P0=table[haomiaoge]; delay_1ms(); wei2=1;

}

}

}

void main() {

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);

void T2_ISR(void) interrupt 5 { TF2=0; times1++;

shurumiao(miao); shuruhaomiao(times1); display(); anjian();

}

}

times2++;

if(times1>=100) {

times1=0; if(miao>59) miao=0;

miao++;

}

if(times2>=6000) {

times2=0; if(fen>60) fen=0; }

fen++;

}

因篇幅问题不能全部显示,请点此查看更多更全内容