基于单片机电子秒表系统设计课程设计毕业论文说明书.doc
测控仪器设计课程设计说明书设计题目: 基于单片机电子秒表系统设计 院 系: 机械与材料工程学院 专 业: 测控技术与仪器 班 级: A1121 班 学 号: X X 姓 名: X X 指导教师: X X 二零一四 年 十一月目录一、设计要求 .1二、设计方案分析 .12.1方案设计 .12.2背景知识介绍 .2三、硬件分析 .53.1单片机简介 .53.2电源电路 .53.3晶体振荡电路 .53.4复位电路 .53.5显示电路 .63.6键盘电路 .6四、硬件主电路图设计 .7五、软件设计 75.1软件设计概述 .75.2主程序流程图 .7六、测试数据及设计结果 .8七、总结 .8附录1 程序 .9附录2 protues电路图 .16附录3仿真图 .17参考文献 .18课程设计 电子秒表系统设计 薛萍一、设计要求设计一个电子秒表,与通用秒表功能类似,有启动,暂停、复位等键。计时长长度为300秒,需显示百分秒。二、 设计方案分析2.1方案设计数字电子秒表具有显示直观、读取方便、精度高等优点,在计时中广泛使用。本设计用单片机组成数字电子秒表,力求结构简单、精度高为目标。本系统采用C51系列单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合硬件电路如电源电路,晶振电路,复位电路,显示电路,以及一些按键电路等来设计计时器,将软、硬件有机地结合起来。其中软件系统采用汇编语言编写程序,硬件系统利用PROTEUS强大的功能来实现,简单切易于观察,在仿真中就可以观察到实际的工作状态。本设计利用AT89C51单片机的定时器/计数器定时和计数的原理,使其能精确计时。利用中断系统使其能实现开始暂停的功能。根据要求知道秒表设计主要实现的功能是计时和显示。因此设置了两个按键和LCD显示时间,两个按键分别是开始、停止和复位按键。利用这两个建来实现秒表的全部功能,而LCD则能显示最多4.59.99秒的计时。电路原理图设计最基本的要求是正确性,其次是布局合理,最后在正确性和布局合理的前提下力求美观。硬件电路图按照图1.1进行设计。AT89C51单片机控制器复位电路开关电路LCD显示图1.1 数字秒表硬件电路基本原理图本设计中,数码管显示的数据存放在内存单元31H33H中。其中31H存放分钟变量,32H存放秒钟变量,33H存放10ms计数值,即存放毫秒位数据,每一地址单元内均为十进制BCD码。由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中。显示时,先取出31H33H某一地址中的数据,然后查得对应的显示位,并从P1口输出,就能显示该地址单元的数据值。计时通过中断完成,定时溢出中断周期为1ms,当一处中断后向CPU发出溢出中断请求,每发出一次中断请求就对毫秒计数单元进行加一,达到10次就对十毫秒位进行加一,依次类推,直到4.59.99秒重新复位。 再看按键的处理。这两个键可以采用中断的方法,也可以采用扫描的方法来识别。复位键主要功能在于数值复位,对于时间的要求不是很严格。而开始和停止键则是用于对时间的锁定,需要比较准确的控制。因此可以对复位按键采取扫描的方式。而对开始和停止键采用外部中断的方式。设计中包括硬件电路的设计和系统程序的设计。其硬件电路主要有主控制器,显示电路和回零、启动、查看、停表电路等。主控制器采用单片机STC89C52,显示电路采用LCD显示计时时间,两个按键均采用触点式按键。 2.2背景知识介绍2.2.1 单片机相关知识本课题在选取单片机时,充分借鉴了许多成形产品使用单片机的经验,并根据自己的实际情况, 选择了AT89C51。AT89C51单片机采用40引脚的双列直插封装方式。图1.2为引脚排列图, 40条引脚说明如下:主电源引脚Vss和Vcc Vss接地 Vcc正常操作时为+5伏电源外接晶振引脚XTAL1和XTAL2 XTAL1内部振荡电路反相放大器的输入端,是外接晶体的一个引脚。当采用外部振荡器时,此引脚接地。 XTAL2内部振荡电路反相放大器的输出端。是外接晶体的另一端。当采用外部振荡器时,此引脚接外部振荡源。 1.2 STC89C51单片机引脚图控制或与其它电源复用引脚RST/VPD,ALE/,和/Vpp RST/VPD 当振荡器运行时,在此引脚上出现两个机器周期的高电平(由低到高跳变),将使单片机复位在Vcc掉电期间,此引脚可接上备用电源,由VPD向内部提供备用电源,以保持内部RAM中的数据。 ALE/正常操作时为ALE功能(允许地址锁存)提供把地址的低字节锁存到外部锁存器,ALE 引脚以不变的频率(振荡器频率的1/6)周期性地发出正脉冲信号。因此,它可用作对外输出的时钟,或用于定时目的。但要注意,每当访问外部数据存储器时,将跳过一个ALE脉冲,ALE 端可以驱动(吸收或输出电流)八个LSTTL电路。对于EPROM型单片机,在EPROM编程期间,此引脚接收编程脉冲(功能) 外部程序存储器读选通信号输出端,在从外部程序存储取指令(或数据)期间,在每个机器周期内两次有效。同样可以驱动八LSTTL输入。 /Vpp、/Vpp为内部程序存储器和外部程序存储器选择端。当/Vpp为高电平时,访问内部程序存储器,当/Vpp为低电平时,则访问外部程序存储器。对于EPROM型单片机,在EPROM编程期间,此引脚上加21伏EPROM编程电源(Vpp)。输入/输出引脚P0.0 - P0.7,P1.0 - P1.7,P2.0 - P2.7,P3.0 - P3.7。 P0口(P0.0 - P0.7)是一个8位漏极开路型双向I/O口,在访问外部存储器时,它是分时传送的低字节地址和数据总线,P0口能以吸收电流的方式驱动八个LSTTL负载。 P1口(P1.0 - P1.7)是一个带有内部提升电阻的8位准双向I/O口。能驱动(吸收或输出电流)四个LSTTL负载。 P2口(P2.0 - P2.7)是一个带有内部提升电阻的8位准双向I/O口,在访问外部存储器时,它输出高8位地址。P2口可以驱动(吸收或输出电流)四个LSTTL负载。 P3口(P3.0 - P3.7)是一个带有内部提升电阻的8位准双向I/O口。能驱动(吸收或输出电流)四个LSTTL负载。AT89C51具有以下标准功能:8k字节Flash,256字节RAM,32 位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89C52可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。CPU是单片机的核心部件。它由运算器和控制器等部件组成。(1) 运算器运算器的功能是进行算术运算和逻辑运算。可以对半字节(4位)、单字节等数据进行操作。例如能完成加、减、乘、除、加1、减1、BCD码十进制调整、比较等算术运算和与、或、异或、求补、循环等逻辑操作,操作结果的状态信息送至状态寄存器。89C51运算器还包含有一个布尔处理器,用来处理位操作。它是以进位标志位C为累加器的,可执行置位、复位、取反、等于1转移、等于0转移、等于1转移且清0以及进位标志位与其他可寻址的位之间进行数据传送等位操作,也能使进位标志位与其他可移位寻址的位之间进行逻辑与、或操作。(2) 程序计数器PC程序计数器PC用来存放即将要执行的指令地址,共16位,可对64K程序存储器直接寻址。执行指令时,PC内容的低8位经P0口输出,高8位经P2口输出。(3) 令寄存器指令寄存器中存放指令代码。CPU执行指令时,由程序存储器中读取的指令代码送入指令寄存器,经译码后由定时与控制电路发出相应的控制信号,完成指令功能。本设计采用ATMEL的AT89C51微处理器,主要基于以下几个因素: AT89C52为51内核,仿真调试的软硬件资源丰富。 性价比高,货源充足。 功耗低,功能强,灵活性高。 DIP40封装,体积小,便于产品小型化。 为EEPROM程序存储介质,1000次以上擦写周期,便于编程调试。 工作电压范围宽:2.7V6V,便于交直流供电。2.2.2 TC1602LCD 的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面。比CRT要好的多,但是价钱较其贵。1)LCD的特点低压微功耗 平板型结构 被动显示型(无眩光,不刺激人眼,不会引起眼睛疲劳) 显示信息量大(因为像素可以做得很小) 易于彩色化(在色谱上可以非常准确的复现) 无电磁辐射(对人体安全,利于信息保密) 长寿命(这种器件几乎没有什么劣化问题,因此寿命极长,但是液晶背光寿命有限,不过背光部分可以更换)三、硬件设计本系统中,硬件电路主要有电源电路,晶振电路,复位电路,显示电路,以及一些按键电路等。3.1单片机简介本系统设计采用C51系列单片机。AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容(由于在微机原理中学过C-51的具体知识,这里不再详细说明)。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,AT89C51是一种高效的微控制器。3.2电源电路电源电路是系统最基本的部分,任何电路都离不开电源部分,由于三端集成稳压器件所组成的稳压电源线路简单,性能稳定,工作可靠,调整方便,已逐渐取代分立元件,在生产中被广泛采用,由于是小系统,我们采用7809电源提供+5V稳压电压。3.3晶体振荡电路MCS-51单片机内部的振荡电路是一个高增益反相放大器,引线 XTAL1和XTAL2分别为反向振荡放大器的输入及内部时钟工作电路的输入和来自反向振荡器的输出,该反向放大器可以配置为片内振荡器。这里,我们选用51单片机12MHZ的内部振荡方式,电路如下:电容器C1,C2起稳定振荡频率,快速起振的作用,C1和C2可在20-100PF之间取,这里取30P,接线时要使晶体振荡器X1尽可能接近单片机。图2 晶体振荡电路3.4复位电路采用上电+按键复位电路,上电后,由于电容充电,使RST持续一段高电平时间。当单片机已在运行之中时,按下复位键也能使用使RST持续一段时间的高电平,从而实现上电加开关复位的操作。这不仅能使单片机复位,而且还能使单片机的外围芯片也同时复位。当程序出现错误时,可以随时使电路复位。电路图如下:图3 复位电路3.5显示电路显示电路既可以选用液晶显示器,也可以选用数码管显示。我们采用的是数码管显示电路。用2个共阳极LED显示,LED是七段式显示器,内部有7个条形发光二极管和1个小圆点发光二极管组成,根据各管的亮暗组合成字符。在用数码管显示时,我们有静态和动态两种选择,静态显示程序简单,显示稳定,但是占用端口比较多;动态显示所使用的端口比较少,可以节省单片机的I/O口。在设计中,我们采用LED动态显示,用P0口驱动显示。由于P0口的输出级是开漏电路,用它驱动时需要外接上拉电阻才能输出高电平。电路图如下所示:图4 显示电路3.6键盘电路在按键电路中,我们可以在I/O口上直接接按键,或者通过I/O口设计一个键盘,然后通过键盘扫描程序判断是否有键按下等。键盘扫描电路节省I/O口,但编程有些复杂,在这里,由于我们所用的按键较少,且系统是一个小系统,有足够的I/O口可以使用,为了使程序简化,我们采用按键电路,用部分P3口做开关,P3.3为开始停止,P3.4为清零,用外部中断INT1开始,另外用软件法消除抖动。电路图如下所示:图5 键盘电路四、硬件主电路图设计用pretues画出其硬件主电路图详见附录。五、软件设计5.1软件设计概述在软件设计中,一般采用模块化的程序设计方法,它具有明显的优点。把一个多功能的复杂的程序划分为若干个简单的、功能单一的程序模块,有利于程序的设计和调试,有利于程序的优化和分工,提高了程序的阅读性和可靠性,使程序的结构层次一目了然。应用系统的程序由包含多个模块的主程序和各种子程序组成。各程序模块都要完成一个明确的任务,实现某个具体的功能,在具体需要时调用相应的模块即可。功能描述:用LCD1602液晶显示"秒表",显示时间为0.00.004.59.99秒,每秒自动加1;一个"开始""暂停"键,一个"清零"键。5.2主程序流程图这里采用顺序结构,通过对按键的扫描,判断要实现什么功能。如下所示:赋初始值开始LCD1602显示复位键P3.3是否按下查看键P3.3是否二次按下调用最终缓存区数据进行显示否 是是否否是查看键P3.4是否按下LCD清零六、测试数据及设计结果详见附录。七、总结通过此次设计,我学到了很多知识,将学习的理论知识通过实验融会贯通,让我对它的理解更加深刻。对于Proteus及Keil软件及系统运行及操作又有了更进一步的了解和运用,并增强了我们的动手能力,也更深刻的接触所学与实物的结合。由于这次课程设计不仅设计编程方面的知识,还涉及了其它学科的知识,例如PROTEUS等的基本知识。总之,通过这次课程设计,不仅加深了我对单片机理论方面的理解,将理论更好的运用的实践方面,而且锻炼了我们各方面的能力,培养了坚强的毅力和做事的耐心和细心,同时也认识到在团队工作中需要有合作精神,我想这会为今后自己踏上工作岗位、更好地融入新的团队打下良好的基础。附录1:(程序); 定义计时单元地址 MIN EQU 31H ;存放分钟变量 SEC EQU 32H ;存放秒钟变量 DEDA EQU 33H ;存放10ms计数值 ; 按键端口状况值 K1_N EQU 34H ;存放按键当前端口状况值 K1_P EQU 35H ;存放按键上次端口状况值 K1_C EQU 37H ;存放按键计数单元 X EQU 36H ;LCD 地址变量 ; 按键引脚定义 K1 EQU P3.3 ;按键1引脚定义 K2 EQU P3.4 ;按键2引脚定义;LCD 引脚定义 RS EQU P3.5 ;LCD RS引脚定义 RW EQU P3.6 ;LCD RW引脚定义 E EQU P3.7 ;LCD RS引脚定义 ORG 0000H ;程序由地址0开始执行 JMP MAIN ORG 0BH ;定时器0中断地址设置 JMP T0_INT ; 主程序 MAIN: ;开始 MOV SP,#60H ;堆栈指针指向60H CLR E ;E=0,禁止读/写LCD ACALL SET_LCD ;调LCD控制子程序 ACALL INIT ;初始化变量 MOV K1_P,#01H ;按键上次端口设置1 ACALL INIT_TIMER ;调用初始化定时器 ACALL MEU ;调用工作菜单子程序 LOOP:ACALL CONV ;时间计数处理 ACALL LOOP1 ;调用清零键子程序 ACALL KEY ;判断是否有键按下 JZ LOOP ;无键按下转LOOP MOV K1_P,K1_N ;交换数据 ACALL KEY0 ;调用按键功能子程序 JMP LOOP ;跳LOOP处循环 ; 初始变量清零子程序 INIT: ;初始变量清零 CLR A ;A清为零 MOV K1_C,A ;K1_C 初始为0 MOV DEDA,A ;百分秒DEDA初始为0 MOV SEC,A ;秒SEC初始为0 MOV MIN,A ;分MIN初始为0 MOV K1_N,A ;K1_N初始为0 MOV K1_P,A ;K1_P初始为0 CLR TR0 ;启动中断 RET ; ;定时器初始化设置子程序 INIT_TIMER: ;定时器初始化 MOV TMOD,#00000001B ;定时器0模式1 MOV IE, #10000010B ;开通中断 MOV TL0,#LOW(65536-10000);定时初值装入低位 MOV TH0,#HIGH(65536-10000);定时初值装入高位 RET ;中断服务程序 T0_INT: ;定时器T0中断程序 PUSH ACC ;入栈保护 MOV TL0,#LOW(65536-10000) ;重加载 MOV TH0,#HIGH(65536-10000) INC DEDA MOV A,DEDA ;10ms 计数值加1 CJNE A,#100,TT MOV DEDA,#0 INC SEC ;秒加1 MOV A,SEC CJNE A,#60,TT INC MIN ;分加1 MOV SEC,#0 MOV A,MIN CJNE A,#05,TT MOV DEDA,#0 ;百、分、秒单元清0 MOV SEC,#0 MOV MIN,#0 TT: POP ACC ;出栈 RETI ;中断程序返回 ; ;判断键是否按下子程序LOOP1: JB K2,LOOP2 ;判清零键是否按下 JMP MAIN ;跳转主程序处 LOOP2: RET ; 判断K1键是否按下 KEY: CLR A ;A清零 MOV K1_N,A ;A值送入K1_N MOV C,K1 ;K1值送入C RLC A ;同进位标志左移一位 ORL K1_N,A ;两个位作逻辑OR运算 MOV A,K1_N ;K1_N值送入A XRL A,K1_P ;有键按下,A 中内容不为零 RET ;功能键子程序 ;K1键第一次按功能子程序 KEY0: MOV A, K1_P ;K1_P值送入A JB ACC.0,KEY3 ;A的0位是1,转KEY3 INC K1_C ;K1_C加1 MOV A, K1_C ;K1_C值送入A CJNE A,#01H,KEY1 ;K1键是否第一次按? MOV DPTR,#MENU1 ;是,存入MENU1信息 MOV A,#1 ;设置第一行显示 CALL LCD_PRINT ;调用显示字符子程序 SETB TR0 ;启动中断 RET ;K1键第二次按功能子程序 KEY1: MOV A,K1_C ;K1_C值送入A CJNE A,#02H,KEY2 ;K1键是否第二次按? MOV DPTR,#MENU2 ;是,存入MENU2信息 MOV A,#1 ;设置第一行显示 CALL LCD_PRINT ;调用显示字符子程序 CLR TR0 ;停止中断 RET ; ;K1键第三次按功能子程序KEY2: MOV A, K1_C ;K1_C值送入A CJNE A, #03H,KEY3 ;K1键是否第三次按? MOV DPTR,#MENU3 ;是,存入MENU3信息 MOV A, #1 ;设置第一行显示 CALL LCD_PRINT ;调用显示字符子程序 SETB TR0 ;启动中断 RET ;K1键第四按功能子程序KEY3: MOV A,K1_C ;K1_C值送入A CJNE A,#04H,KEY4 ;K1键是否第四次按? MOV DPTR,#MENU4 ;是,存入MENU4信息 MOV A,#1 ;设置第一行显示 CALL LCD_PRINT ;调用显示字符子程序 CLR TR0 ;启动中断 KEY4: RET ;子程序返回 ; LCD显示 ; LCD控制子程序 SET_LCD: ; CLR E ACALL INIT_LCD ;初始化 LCD MOV R5,#10 ACALL DELAY MOV DPTR,#LMESS1 ;指针指到显示消息1 MOV A,#1 ;显示在第一行 ACALL LCD_PRINT ;调用显示字符子程序 MOV DPTR,#LMESS2 ;指针指到显示消息2 MOV A,#2 ;显示在第二行 ACALL LCD_PRINT ;调用显示字符子程序 RET LMESS1: DB " ",0 ;LCD 第一行显示消息 LMESS2: DB "TIME ",0 ;LCD 第二行显示消息 ;LCD初始化子程序 INIT_LCD: MOV A,#38H ;设置8位、2行、5x7点阵 ACALL WR_COMM ; 调用写指令子程序 ACALL DELAY1 ;调用延时子程序 MOV A,#0CH ;开显示,光标不闪烁 ACALL WR_COMM ;调用写指令子程序 ; ACALL DELAY1 ;调用延时子程序 MOV A,#01H ;清除 LCD 显示屏 ACALL WR_COMM ;调用写指令子程序 ; ACALL DELAY1 ;调用延时子程序 RET ;写指令子程序 WR_COMM: MOV P1,A CLR RS ;RS=0,选择指令寄存器 CLR RW ;RW=0,选择写模式 SETB E ;E=1,允许读/写LCM ACALL DELAY1 ;调用延时子程序 CLR E ;E=0,禁止读/写LCM RET ;写数据子程序 WR_DATA: MOV P1,A SETB RS ;RS=1,选择数据寄存器 CLR RW ;RW=0,选择写模式 SETB E ;E=1,允许读/写LCD ACALL DE ;调用延时子程序 CLR E ;E=0,禁止读/写LCD ACALL DE ;调用延时子程序 RET ;清除该行 LCD 的字符 CLR_LINE: MOV R0,#24 CL1: MOV A,#' ' ACALL WR_DATA DJNZ R0,CL1 RET ;LCD 存入工作菜单 MEU: MOV DPTR,#MENU0 ;存入工作菜单 MOV A,#1 ;第一行CALL LCD_PRINT RET; 工作菜单 MENU0: DB " SECOND-CLOCK 0 ",0 MENU1: DB " BEGIN COUNT 1 ",0 MENU2: DB " PAUST COUNT 2 ",0 MENU3: DB " BEGIN COUNT 3 ",0 MENU4: DB " PAUST COUNT 4 ",0 ;菜单显示子程序 ;一行、二行显示字符 LCD_PRINT: CJNE A,#1,LINE2 ;判断是否为第一行 LINE1: ACALL CLR_LINE ;清除该行字符数据 MOV A, #80H ;设置 LCD 的第一行地址 ACALL WR_COMM ;写入命令 JMP FILL LINE2: ACALL CLR_LINE ;清除该行字符数据 MOV A,#0C0H ;设置 LCD 的第二行地址 ACALL WR_COMM FILL: CLR A ;填入字符 MOVC A,A+DPTR ;由消息区取出字符 CJNE A,#0,LC1 ;判断是否为结束码 RET ;写入数据 LC1: ACALL WR_DATA INC DPTR ;指针加1 JMP FILL ;继续填入字符 RET ;转换数据子程 CONV: ;转换为 ASCII 码并显示 MOV X,#5 ;设置位置 ACALL SKOW_LINE2 ;显示数据 INC X ; MOV A,#':' ; MOV B,X ; ACALL LCDP2 ; MOV A,MIN ;加载分钟数据 INC X ;设置位置 ACALL SKOW_LINE2 ;显示数据 INC X ; MOV A,#':' ; MOV B,X ; ACALL LCDP2 ; MOV A,SEC ;加载秒数数据 INC X ;设置位置 ACALL SKOW_LINE2 ;显示数据 INC X ; MOV A,#':' ; MOV B,X ; CALL LCDP2 ; MOV A,DEDA ;加载秒数数据 INC X ;设置位置 ACALL SKOW_LINE2 ;显示数据 RET ; ;在 LCD 的第二行显示数字 SKOW_LINE2: MOV B,#10