1、学号: 课程设计报告 基于秒表设计 院 系 电子信息工程学院 专 业 通信工程 班 级 1 姓 名 指导老师 2014 年6月合肥师范学院课程设计报告摘 要随着电子技术的发展,电子技术在各个领域的运用也越来越广泛,人对它的认识也逐步加深。秒表计时器秒表计时器常常用于体育竞赛及各种其他要求有较精确时间的各领域中。其中启/停开关的使用方法与传统的机械计时器相同,即按一下启/停开关,启动计时器开始计时,再按一下启/停开关计时终止。而复位开关可以在任何情况下使用,即使在计时过程中,只要按一下复位开关,计时应立即终止,并对计时器清零。本设计就是利用所学到的电子元器件将脉冲源用数码管显示出来,以制承诺简易
2、的秒表。以单片机为核心,设计一个秒表,具有计时功能,按键有启动计时、数据清零、停止、时间显示。采用2个LED数码管显示时间,计时范围设置为099秒,即精确到1秒,用按键控制秒表的“开始”、“暂停”、“归零”、“复位”,按“开始”按键,开始计时;按“暂停”按键,系统暂停计时;再按“开始”键,系统继续计时;按“归零”按键,系统归零;按“复位”按键,系统清零。关键词: STC12C5A60S2单片机 Visual Basic 串口通信I目 录摘 要I1 绪论11.1课题设计目的及其意义11.2 秒表的设计原理11.2.1秒表设计原理11.2.2 秒表设计原理框图12 课题的方案设计与论证22.1 系
3、统整体方案的设计22.2 系统整体方案的论证33 系统的硬件结构设计33.1 单片机的功能特点33.2 秒表实现所要求的功能的主电路43.3 实现秒表复位功能的复位电路以及外部中断开关电路和晶振电路53.3.1 外部晶振电路53.3.2 外部中断开关电路图53.3.3复位电路图64 系统软件的设计74.1 系统主程序的流程图74.2 系统软件的主程序74.3 系统的软件调试114.3.1 利用Protues仿真秒表原理图114.3.2 电路检测114.3.3 利用Protues软件对所编写程序进行编译124.3.4 通过Protues软件对设计的电路进行仿真124.3.5 调试结果135硬件设
4、计135.2 计时器和定时器的结构和工作原理145.3 硬件实物156 总结177指导老师意见198 参考书目19附录一 程序清单20附录二 元件清单23II1 绪论1.1课题设计目的及其意义 随着科技的发展,各行各业逐渐趋向于高精度,高准确性发展。精确计时存在于社会上各个领域。而我们日常生活中常常用到的各种电子电器的定时计时都是秒表应用的缩影。可以说秒表的应用是十分广泛的。秒表计时器是电器制造,工业自动化控制,国防,实验室及科研单位的理想的计时器。它广泛应用于各种继电器,电磁开关,控制器,延时器,定时器等的时间测试。毋庸置疑,随着科学技术的进一步提高,秒表将会从单一的功能逐步转化为多功能的计
5、时工具。当然,它的精度也会更高。1.2 秒表的设计原理1.2.1秒表设计原理 秒表的设计主要是以AT89C52芯片为核心器件,外接一个两位一体的共阳极八段数码管和一个10K的排阻,外接晶振电路和复位电路,以及在P2口外接开关。通过基于单片机语言来编写软件控制单片机实现秒表的工作,单片机输出通过P0口连接两位一体共阳极数码管来控制数码管的显示。另外要实现秒表的复位功能,通过外接的开关复位电路来实现。秒表的开始,停止,和清零三个按钮功能通过连接芯片上的P2口来实现的。KEY1开始KEY2停止KEY3清零KEY4复位 1.2.2 秒表设计原理框图 单片机接上电源工作后,通过P0口输出信号在数码管上显
6、示0-99动态数字。另外,通过复位电路改变芯片的电平,即按下复位键使RST持续一段时间的高电平,从而实现上电复位的功能。除此之外,通过P2口外接开关分别控制秒表的开始计数,停止计数,计数清零的功能。原理框图如下:02 课题的方案设计与论证2.1 系统整体方案的设计电子秒表具有显示直观,读取方便,精度高等优点,在计时中广泛使用。本设计用基于单片机52系列芯片组成电子秒表,力求结构简单,精度高为目标,设计中包括硬件电路的设计和系统程序的设计。其硬件电路主要有主控制器,计时与显示电路和回零,启动和停表电路等。主控制器采用单片机51系列芯片,显示电路采用共阳极LED数码显示管计时时间。本设计利用52系
7、列芯片单片机的定时器|计数器定时和计数原理,使其能精确计时。利用中断系统使其能实现开始暂停功能。P口输出段码数据,P1.0、P1.1、P1.2口接三个按钮开关,分别实现开始,暂停,清零功能。系统原理图设计最基本的要求是正确性,其次是布局合理,最后在正确性和布局合理下力求完美。根据要求秒表设计主要实现的功能是计时和显示。因此设计四个按钮和两位一体数码管显示时间,四个按钮分别是开始,暂停,清零,复位按键。利用这四个按键来实现秒表的全部功能,而两位一体数码显示管能显示最多99秒的时间。计时器采用T0中断完成,定时溢出中断周期为1ms,当一处中断后向cpu发出溢出中断请求,每发出一次中断请求就对秒计数
8、单元加一到达十次就对十秒位进行加一,依此类推,直到99秒重新复位。设计中包括对硬件电路的设计和系统程序的设计。其硬件电路主要有主控制器和显示电路,回零,启动,复位,停止电路。主控制器采用51系列芯片,显示电路采用两位一体共阳极数码管显示计时时间。三个按键均采用点触式。2.2 系统整体方案的论证本实验利用单片机的定时器/计数器定时和记数的原理,通过采用proteus仿真软件来模拟实现。利用52系列单片机、LED数码管以及控件来控制秒表的计数以及计数的开启/暂停/清零与复位! 其中有两位一体共阳极数码管用来显示数据,数码管显示秒(两位),满十进一后显示秒的数码管的数字加一。计秒数码管采用两位的数码
9、管,当计数超过范围(99秒)是数码管全部清零重新计数。3 系统的硬件结构设计3.1 单片机的功能特点本课题在选取单片机时,充分借鉴了许多成形产品使用单片机的经验,并根据自己的实际情况, 选择了STC89C52。STC89C52单片机采用40引脚的双列直插封装方式。下图为引脚排列图, 40条引脚说明如下:主电源引脚Vss和Vcc Vss接地 Vcc正常操作时为+5伏电源外接晶振引脚XTAL1和XTAL2 XTAL1内部振荡电路反相放大器的输入端,是外接晶体的一个引脚。当采用外部振荡器时,此引脚接地。 XTAL2内部振荡电路反相放大器的输出端。是外接晶体的另一端。当采用外部振荡器时,此引脚接外部振
10、荡源。3.2 秒表实现所要求的功能的主电路 该电路主要由52系列的单片机芯片为核心的,外部晶振电路,上拉电压排阻,外接复位电路,两位一体共阳极数码管,以及开始,停止和清零外部控制按钮。主电路图如下该电路的秒表计时精度为1秒,有四个按钮分别为开始,停止,清零,以及外部复位按钮。3.3 实现秒表复位功能的复位电路以及外部中断开关电路和晶振电路3.3.1 外部晶振电路我们选用52单片机12MHZ的内部振荡方式,电路如下:电容器C1,C2起稳定振荡频率,快速起振的作用,C1和C2可在20-100PF之间取,这里取30P,接线时要使晶体振荡器X1尽可能接近单片机。3.3.2 外部中断开关电路图为了使程序
11、简化,我们采用按键电路,用部分P1口做开关,P1.0为开始停止,P1.1为停止,用P1.2为清零,用外部中断INT1开始,另外用软件法消除抖动。电路图如下所示:3.3.3复位电路图 采用上电+按键复位电路,上电后,由于电容充电,使RST持续一段高电平时间。当单片机已在运行之中时,按下复位键也能使用使RST持续一段时间的高电平,从而实现上电加开关复位的操作。这不仅能使单片机复位,而且还能使单片机的外围芯片也同时复位。当程序出现错误时,可以随时使电路复位。电路图如下:4 系统软件的设计4.1 系统主程序的流程图4.2 系统软件的主程序实验程序清单如下:/*秒表*因为51单片机没有看门狗特殊寄存器所
12、以在本次设计里面我们采用手动按键复位符合本次试验的要求*/#include#define uchar unsigned char#define uint unsigned intsbit key1=P10; /开始sbit key2=P11; /暂停sbit key3=P12; /归零/sbit key4=P13; /复位/sfr ISP_CONTR=0xe7;/定义ISP/IAP控制寄存器uint num=0;uint shijian=0; uchar code table= /共阳段码0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90, 0x
13、88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff;void delayms(uint m);/延时函数void display(uint one);/显示函数void init(); /定时器初始化void key_sacan();/按键扫描程序void init() TMOD=0x01; TH0=(65535-1000)/256; /12M晶振定时1ms TL0=(65535-1000)%256; EA=1; ET0=1; TR0=0;/先关闭定时器void main() init(); while(1) display(shijian);/始终
14、显示 key_sacan(); void T0_time() interrupt 1 TH0=(65535-1000)/256; TL0=(65535-1000)%256;num+;if(num=1000) shijian+;num=0; if(shijian=100) shijian=0; void display(uint one) /one是形参 P2=tableone/10; /送段数据delayms(1); P3=tableone%10;/送段数据delayms(1);void key_sacan()/按键扫描程序 if(key1=0) delayms(5);/软件消抖 if(key
15、1=0) TR0=1;/计时开始 while(!key1); /等待 if(key2=0) delayms(5);/软件消抖 if(key2=0) TR0=0;/计时暂停 while(!key2); /等待 if(key3=0) delayms(5);/软件消抖 if(key3=0) shijian=0;/归零 TR0=0;/关了 while(!key3); /等待 /*if(key4=0) delayms(10);/软件消抖 if(key4=0) ISP_CONTR=0x20;/用软件复位到用户应用程序区(AP区),重新开始执行程序。 while(!key4); /等待 */void del
16、ayms(uint m)/延时函数 uint i,j; for(i=m;i0;i-) for(j=110;j0;j-); 4.3 系统的软件调试4.3.1 利用Protues仿真秒表原理图通过按下key1,key2,key3,key4四个按键对所设计的电路进行调试,按下key1键秒表开始从零计时,按下key2秒表停止计时,按下key3秒表计时归零,key4按钮为复位。4.3.2 电路检测电路连接完毕后,单击运行按钮(如下图)检测电路是否有误,如果电路如果无误进行软件检测。4.3.3 利用Protues软件对所编写程序进行编译4.3.4 通过Protues软件对设计的电路进行仿真仿真之后的图如下
17、:4.3.5 调试结果本装置将实现0-99的计数,每一秒钟,计数器将加1,在数码管上显示当前计数值,并可用键盘按制计数的起始,以及归零。具体要求如下:1. 开机时数码管显示00。2. 每一秒钟,计数器自动加1。3. 按键控制计数,分别控制开始计时、停止计时和归零,功能分配如下: 按KEY1开始计时数码管显示从00开始计时到99结束再从00开始循环; 按KEY2 停止计时数码管显示当前数值; 按KEY3归零; 按KEY4复位.5硬件设计5.1 数码管显示原理我们最常用的是七段式和八段式LED数码管,八段比七段多了一个小数点,其他的基本相同。所谓的八段就是指数码管里有八个小LED发光二极管,通过控
18、制不 同的LED的亮灭来显示出不同的字形。数码管又分为共阴极和共阳极两种类型,其实共阴极就是将八个LED的阴极连在一起,让其接地,这样给任何一个LED 的另一端高电平,它便能点亮。而共阳极就是将八个LED的阳极连在一起。其原理图如下。 其中引脚图的两个COM端连在一起,是公共端,共阴数码管要将其接地,共阳数码管将其接正5伏电源。一个八段数码管称为一位,多个数码管并列在一起可构成 多位数码管,它们的段选线(即a,b,c,d,e,f,g,dp)连在一起,而各自的公共端称为位选线。显示时,都从段选线送入字符编码,而选中哪个位选 线,那个数码管便会被点亮。数码管的8段,对应一个字节的8位,a对应最低位
19、,dp对应最高位。所以如果想让数码管显示数字0,那么共阴数码管的字符编码 为00111111,即0x3f;共阳数码管的字符编码为11000000,即0xc0。可以看出两个编码的各位正好相反。如下图。共阳极的数码管0f的段编码是这样的:unsigned char code table= /共阳极0f数码管编码0xc0,0xf9,0xa4,0xb0,/030x99,0x92,0x82,0xf8,/470x80,0x90,0x88,0x83,/8b0xc6,0xa1,0x86,0x8e /cf;共阴极的数码管0f的段编码是这样的:unsigned char code table=/共阴极0f数码管编
20、码0x3f,0x06,0x5b,0x4f, /030x66,0x6d,0x7d,0x07,/470x7f,0x6f,0x77,0x7c,/8b0x39,0x5e,0x79,0x71/cf5.2 计时器和定时器的结构和工作原理实质是计数器,脉冲每一次下降沿,计数寄存器数值将加1。计数的脉冲如果来源于单片机内部的晶振,由于其周期极为准确,这时称为定时器。计数的脉冲如果来源于单片机外部的引脚,由于其周期一般不准确,这时称为计数器。定时/计数器方式寄存器TMOD(1) M1和M0:方式选择位。(2) c/T :功能选择位。时,设置为定时器工作方式;时,设置为计数器工作方式。(3) GATE:门控位。当
21、GATE=0时,软件控制位TR0或TR1置1即可启动定时器;当GATE=1时,软件控制位TR0或TR1须置1,同时还须(P3.2)或(P3.3)为高电平方可启动定时器,即允许外中断、启动定时器。定时器/计数器控制寄存器TCON(1) TCON.7 TF1:定时器1溢出标志位。当定时器1计满数产生溢出时,由硬件自动置TF1=1。在中断允许时,向CPU发出定时器1的中断请求,进入中断服务程序后,由硬件自动清0。在中断屏蔽时,TF1可作查询测试用,此时只能由软件清0。(2) TCON.6 TR1:定时器1运行控制位。由软件置1或清0来启动或关闭定时器1。当GATE=1,且为高电平时,TR1置1启动定
22、时器1;当GATE=0时,TR1置1即可启动定时器1。(3) TCON.5 TF0:定时器0溢出标志位。其功能及操作情况同TF1。(4) TCON.4 TR0:定时器0运行控制位。其功能及操作情况同TR1。(5) TCON.3 IE1:外部中断1( )请求标志位。(6)TCON.2 IT1:外部中断1触发方式选择位。(7)TCON.1 IE0:外部中断0 ( )请求标志位。(8) TCON.0 IT0:外部中断0触发方式选择位5.3 硬件实物6 总结 本次电子课程设计主要是对已学习的电路等知识,模拟电子技术、数字电子技术和单片机的综合应用,设计完成了利用软件模拟的秒表。 我们小组一块儿讨论设计
23、了此次试验,在设计过程中动手能力这方面得到了很大的提高。同时,通过网络,书籍查找资料,让我们扩宽了视野。单片机课程设计不仅给我们提供了一个很好的展现应用自己所掌握的知识的平台,又是对自己所学知识的一次考核。 我们运用各自在各方面的优势,组成了一个团队.通过团队力量,使设计得以完成.可以说,我们组每一个人都是不可或缺的。在这组中我主要负责画电路图。我们选用的是89C52在前面也介绍了一点关于这个器件的内容,在这次学习中了解了这个软件。89C52是INTEL公司MCS-51系列单片机中基本的产品,它采用ATMEL公司可靠的CMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产
24、品。它结合了CMOS的高速和高密度技术及CMOS的低功耗特征,它基于标准的MCS-51单片机体系结构和指令系统,属于89C51增强型单片机版本,集成了时钟输出和向上或向下计数器等更多的功能,适合于类似马达控制等应用场合。89C52内置8位中央处理单元、512字节内部数据存储器RAM、8k片内程序存储器(ROM)32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。此外,89C52还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。在空闲模式下冻结CPU而RAM定时器、串行口和中断系统维持其功能。掉电模式下,保存RAM数据,时钟振
25、荡停止,同时停止芯片内其它功能。89C52有PDIP(40pin)和PLCC(44pin)两种封装形式。秒表实现所要求的功能的主电路。VCC:供电电压。 GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8个TTL门电流。当P0口的管脚第一次写“1”时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4个TTL门电流。P1口管脚写入“1”后,被内部上拉为高,
26、可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位
27、地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口作为AT89C51的一些特殊功能口,管脚 备选功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(计时器0外部输入)P3.5 T1(计时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)RST:复位输入。当振荡器复位
28、器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的底位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。/PSEN:外部程序存储器的选通信号。在由外部程序存储器
29、取指期间,每个机器周期两/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。/EA / VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。这次学习后对89C51有了更深的认识了,对以后运用这个软件也会更加熟练。通过这次的课程设计,我们也发现了不少自己不了解的知识,通过查询各方面资料,我们也了解了更多,有学会了很多上课时没掌握的东西, 最后在调试结果出来后,我
30、们更是无比的兴奋,无比的自豪。总之,通过这次电子课程设计,我不仅对自己的知识有了更好的掌握和应用,更了解到团队精神的力量.在以后的学习和生活中受用终身.7指导老师意见在这次实验的过程中,我们遇到许多困难的。许多事并不是一开始想象的那么简单和一帆风顺的。不过幸好在这个过程中有我们敬爱的指导老师在时刻给我们帮助,给我们一些指导意见。因此,我们才完成这个课程设计的。8 参考书目【1】.51单片机学习网 http:/ http:/ 程序清单/*秒表*因为51单片机没有看门狗特殊寄存器所以在本次设计里面我们采用手动按键复位符合本次试验的要求*/#include#define uchar unsigned
31、 char#define uint unsigned intsbit key1=P10; /开始sbit key2=P11; /暂停sbit key3=P12; /归零/sbit key4=P13; /复位/sfr ISP_CONTR=0xe7;/定义ISP/IAP控制寄存器uint num=0;uint shijian=0; uchar code table= /共阳段码0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff;void delaym
32、s(uint m);/延时函数void display(uint one);/显示函数void init(); /定时器初始化void key_sacan();/按键扫描程序void init() TMOD=0x01; TH0=(65535-1000)/256; /12M晶振定时1ms TL0=(65535-1000)%256; EA=1; ET0=1; TR0=0;/先关闭定时器void main() init(); while(1) display(shijian);/始终显示 key_sacan(); void T0_time() interrupt 1 TH0=(65535-1000)
33、/256; TL0=(65535-1000)%256;num+;if(num=1000) shijian+;num=0; if(shijian=100) shijian=0; void display(uint one) /one是形参 P2=tableone/10; /送段数据delayms(1); P3=tableone%10;/送段数据delayms(1);void key_sacan()/按键扫描程序 if(key1=0) delayms(5);/软件消抖 if(key1=0) TR0=1;/计时开始 while(!key1); /等待 if(key2=0) delayms(5);/软
34、件消抖 if(key2=0) TR0=0;/计时暂停 while(!key2); /等待 if(key3=0) delayms(5);/软件消抖 if(key3=0) shijian=0;/归零 TR0=0;/关了 while(!key3); /等待 /*if(key4=0) delayms(10);/软件消抖 if(key4=0) ISP_CONTR=0x20;/用软件复位到用户应用程序区(AP区),重新开始执行程序。 while(!key4); /等待 */void delayms(uint m)/延时函数 uint i,j; for(i=m;i0;i-) for(j=110;j0;j-); 附录二 元件清单23