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 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++; } 因篇幅问题不能全部显示,请点此查看更多更全内容