基于AT89C51单片机的电子秒表设计

版权申诉
0 下载量 108 浏览量 更新于2024-07-07 收藏 415KB DOC 举报
本次课程设计是关于使用AT89C51单片机设计一个电子秒表,秒表能够显示00到99秒的时间,具备开始计时、时间锁定和复位功能。通过定时器T0每10ms产生中断来实现计时,每100个中断增加1秒。设计中,"开始计时/时间锁定"键用于启动或停止计时,而"复位"键则可重置计时。整个系统在Keil uVision4环境下编程,并通过Proteus进行仿真和调试。 **硬件选择与设计** 8051单片机是设计的基础,它是一个8位CPU,拥有32条I/O线、4KB ROM、12KB RAM、两个16位定时/计数器、五个中断源以及一个全双工串行通信口。8051单片机的引脚包括VCC(供电电压)、GND(接地)等,这些管脚对于系统的正常运行至关重要。 **软件设计** 软件部分主要涉及对8051单片机的编程,使用Keil uVision4作为开发环境。程序中,定时器T0被配置为中断源,每10ms触发一次中断。在中断服务子程序中,计数值每100次中断递增1秒。此外,还需要编写键盘扫描程序来检测"开始计时/时间锁定"和"复位"键的状态,以便根据用户输入控制秒表的运行。 **功能实现** 秒表的主功能包括: 1. **计时**:在开始计时/时间锁定键被按下后,通过设置TR0标志启动定时器T0,开始计时。再次按下此键,会停止计时。 2. **时间锁定**:计时过程中,若需锁定当前时间,只需保持“开始计时/时间锁定”键按下。 3. **复位**:按下“复位”键,不仅会关闭计时器,还会将存储的时间变量清零,实现秒表的重置。 **调试与验证** 设计完成后,通过Proteus软件进行仿真,可以验证秒表的功能是否符合设计要求。在完成所有测试并确保无误后,课程设计宣告成功。 **关键词** 秒表,51单片机,MAX7219,定时,中断,8051,Keil uVision4,Proteus 这个课程设计涵盖了单片机基础、中断系统、定时器操作、键盘接口设计以及软件编程等多个方面的知识,是学习单片机应用和嵌入式系统开发的一个实践性很强的项目。
101 浏览量
课程设计报告 课程名称:单片机原理与接口技术课程设计 设计题目:秒表的设计 院 系:机电工程学院 班 级: 姓 名: 学 号: 指导教师: 设计时间:2011年12月10日 一 设计方案描述 通过软件计时实现秒表功能。该秒表程序可通过按键实现暂停/开始计时功能,每6 0秒进1,可以复位。 二 选定方案的论证及整体电路的工作原理 提示:画出你的系统原理图,可参考桌面的单片机指导书中内容。 指 运算器 输入 输出 程 令 ALU 数据存储器 数据 设备 序 寄 RAM I O 计 存 数 程序存储器 器 控制器 器 EPROM IR ID 工作原理: 编写秒表程序,使其通过I/O口的输出在数码管上显示秒表的计时情况,通过定义I /O口的输入与中断程序级按键程序实现INT中断功能和控制秒表的"停"与"走"。 三 系统资源分配表(地址分配表) " " " "寄存器 "地址 " "W_TEMP "71H " "STATUS_TEMP "72H " "INTCON "0BH " "STATUS "03H " "PORTD "08H " "PORTB "06H " "TRISD "88H " "TRISB "86H " 四 程序流程框图 五 源程序清单 list p=16f877A ; list directive to define processor #include <p16f877A.inc> ; processor specific variable definitions __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _LVP_OFF & _DEBUG_ON & _CPD_OFF ;***** VARIABLE DEFINITIONS w_temp EQU 0x71 ; variable used for context saving status_temp EQU 0x72 ; variable used for context saving ;********************************************************************** ORG 0x000 ; processor reset vector clrf PCLATH ; ensure page bits are cleared goto MAIN ; go to beginning of program ORG 0x004 ; interrupt vector location movwf w_temp ; save off current W register contents movf STATUS, w ; move status register into W register movwf status_temp ; save off contents of STATUS register BCF INTCON, INTF INCF 53H ; isr code can go here or be located as a call subroutine elsewhere movf status_temp,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapf w_temp, f Swapf w_temp, w ; restore pre-isr W register contents retfie ; return from interrupt MAIN ; remaining code goes here ABB EQU 63H ABC EQU 62H COUNTER EQU 66H MOVLW .000 MOVWF 60H MOVLW 00H MOVWF 43H MOVLW B'10010000' MOVWF INTCON CLRF 53H LOOP1 MOVF 60H, W MOVWF ABC MOVLW 0FFH MOVWF 20H LOOP BSF STATUS, RP0 CLRF TRISD CLRF TRISB BCF STATUS, RP0 MOVLW 0DFH MOVWF PORTB MOVF 43H, W CALL CHAIBIAO MOVWF PORTD CALL DELAY MOVLW 0F7H MOVWF PORTB MOVF ABC, W MOVWF 61H MOVLW 00H MOVWF ABB QS MOVLW .100 SUBWF 61H INCF