基于at89c51单片机的多功能秒表系统设计--20xx毕业论文

目录

1 概述.......................................................................................................................... 3

1.1单片机简介……………………………………………………………………3

1.2设计任务………………………………………………………………………3

1.3设计要求………………………………………………………………………3 2 系统总体方案及硬件设计 ................................................................................................. 4

2.1、复位电路 ..................................................................................................... 5

2.2、晶体振荡电路 ............................................................................................. 6

2.3、键盘电路 ..................................................................................................... 6

2.4、显示电路 ..................................................................................................... 7

3 软件设计 ................................................................................................................. 7

3.1、设计思想 ..................................................................................................... 7

3.2、系统流程图 ................................................................................................. 8

3.3源程序代码及注解 ……………………………………………………10

4 Proteus软件仿真 ................................................................................................. 15 5 课程设计体会 ……………………………………………… ………… ………………16 6 参考文献 ……………………………… ………………………………… …… ….17

附录1:源程清单 ...................................................................................................... 18

附录2:系统原理图 .................................................................................................. 24

1 概述

1.1单片机简介

单片机是性能价格比高、体积小、对国民经济渗透力大、最有前途的微控制器。单片机自20世纪70年代初研制成功并发展至今,已进入第四代。它主要是在一块芯片上集成了CPU、存储器以及输入输出电路,在工业过程中被广泛应用在控制电路中。从单片机的系列来看,国内外已超过50个系列、近500个品种,当前正处于更新换代、百花齐放的时期。新的系列和专用系列正在不断涌现。按位数分类有4位、8位、16位以及32位单片机等,4位单片机由于价格低和出现的早得到了广泛的应用,特别是在家电应用领域中其还有很大的优势,为了抵御8位机的竞争,4位机在结构和功能上都有很大的改进。8位机的生产厂家以及品种都很多,在实际的生产中应用也最为广泛,其中Intel公司的8051系列单片机在我国应用最为广泛,另外8位单片机也在其功能和内部结构上不断的进行改进,目前功能是越来越强大。16位单片机在数据处理以及单片机的性能上有了很大的改进。32位单片机是随着高科技产业的发展而产生的。

1.2设计任务:

设计一个单片机控制的多功能秒表系统,利用单片机的定时器/计数器定时和记数的原理,结合显示电路、用两个阴极LED数码管以及按键来设计00~99秒计时器。将软、硬件有机地结合起来,使得系统能够正确地进行加计时,同时数码管能够正确地显示时间。

1.3设计要求:

1、能同时记录四个相对独立的时间并分别显示 。

2、两位LED动态显示,显示时间为00~99秒。

3、每秒自动加1。

4、一个开始按键、一个复位按键、一个暂停按钮

2 系统总体方案

本设计的最主要的元器件就是MCS-51单片机。MCS-51单片机在一块芯片上集成了CPU,存储器RAM,ROM以及输入与输出接口电路,这种芯片习惯 - 1 -

上被称为单片微型计算机,简称单片机。MCS-51单片机是INTEL公司在19xx年推出的高档8位单片机。它的典型产品有:8051,8031,8751,80C51,80C31,87C51。

AT89C51(图1)单片机由CPU,振荡器与时序电路, 4个8位的I/O端口(P0,P1,P2,P3),串行口等组成。

P01线(如图中的口)。

2器时,当做数据总为数据总线接

器时,当作地址总为地址总线接

线(如图中的口)。

3P1口只做拉电阻。

P21、扩展外部存储线使用;

做一般的I/O使阻,作为输入或输电阻。

使用:其内部有上

器时,当作地址总

2、做一般I/O口使用,其内部有上拉电阻; P3口有两个功能:

除了作为I/O使用外(其内部有上拉电阻),还有一些特殊功能,由寄存器来设置。

ALE:地址锁存控制信号

PSEN:外部程序存储器读选通信号 EA/VPP:访问和序存储器控制信号

RST:复位信号XTAL1和XTAL2 外接晶振引脚VCC:电源+5V输入VSS:GND接地。

- 2 -

基于at89c51单片机的多功能秒表系统设计20xx毕业论文

图2:整体设计框图

2.1 复位电路:采用上电加按钮复位。

这个系统中的复位电路是采用上电加按钮来实现的。因为MCS-51单片机的复位是靠外部电路实现的。MCS-51单片机工作之后,只要在他的RST引线上加载10ms以上的高点平,单片机就能有效地进行复位。MCS-51单片机通常采用上电自动复位、按键复位、以及上电加按键复位等,我们采用的是上电加按键复位方式,这样做的优点是上电后可以直接进入复位状态,当程序出现错误时,可以随时使电路复位。

基于at89c51单片机的多功能秒表系统设计20xx毕业论文

图3:复位电路

2.2晶体振荡电路: 通过XTAL1和XTAL2外接晶体振荡器构成内部振荡方式。

由于单片机内部有一个高增益反相放大器,当外接晶振后,就构成了自激振荡器并产生振荡时钟脉冲。MCS--51单片机内部的振荡电路是一个高增益反相放大器,引线 XTAL1和XTAL2分别为 反向振荡放大器的输入及内部时钟工作电路的输入和来自反向振荡器的输出,该反向放大器可以配置为片内振荡器。

基于at89c51单片机的多功能秒表系统设计20xx毕业论文

- 3 -

图4:晶振震荡电路

2.3键盘电路:用部分P1口做开始开关,P2口开始,P3口复位,

基于at89c51单片机的多功能秒表系统设计20xx毕业论文

图5:键盘电路

基于at89c51单片机的多功能秒表系统设计20xx毕业论文

- 4 -

2.4显示电路:采用LED动态显示,用P2口驱动显示。

基于at89c51单片机的多功能秒表系统设计20xx毕业论文

图6:显示电路

3 软件设计

3.1 设计思想

因为秒表设计相对较为简单,因此在软件设计中我们一般采用模块化程序设计的方法。模块是一个具有独立功能的程序,可以单独设计、调试与管理,模块可分为功能模块和控制模块两类。我们通过模块化程序设计可按适当的原则把一个情况复杂、规模较大的程序系统划分为一个个较小的、功能相关而又相对独立的模块。每个小的模块完成一个确定的功能,在这些小的模块之间建立必要的联系,互相协作完成整个程序要完成的功能。它具有明显的优点,把一个多功能的复杂的程序划分为若干个简单的、功能单一的程序模块,有利于程序的设计和调试,有利于程序的优化和分工,提高了程序的阅读性和可靠性,使程序的结构层次一目了然。

其中的模块即为子程序,子程序是功能独立的程序段。子程序的基本思想是编写一次,可以重复使用。子程序的形式可以是一个程序文件,也可以是一个过 - 5 -

程或函数。子程序总被其他程序调用而不单独执行,这与主程序相对。

这个主程序也是由多个子程序模块组成,各程序模块都要完成一个明确的任务,实现某个具体的功能,、快加、复位,计数和显示等,在具体需要时调用相3.2

定时器流程图

- 6 -

基于at89c51单片机的多功能秒表系统设计20xx毕业论文

加1子程序流程图:

基于at89c51单片机的多功能秒表系统设计20xx毕业论文

- 7 -

基于at89c51单片机的多功能秒表系统设计20xx毕业论文

3.3程序代码及注解

ORG 0000H ;程序开始

AJMP START ;跳转到主程序START

ORG 000BH ;定时器0中断的地址入口

AJMP TIME0 ;定时器0溢出,跳转到中断程序TIME0 START: ;主程序

MOV P3,#0FFH ;输入端口P3全写1

MOV P0,#3FH ;

MOV P1,#3FH ;

MOV P2,#0BFH ;数码管初始化

MOV 30H,#00H ;

MOV R0,#00H ;

MOV R1,#0AH ;

MOV R2,#00H ;工作寄存器初始化

MOV TMOD,#01H ;定时器0工作于方式1

基于at89c51单片机的多功能秒表系统设计20xx毕业论文

- 8 -

MOV TH0,#0D8H ;

MOV TL0,#0FEH ;定时器0预置数(D8FEH=55550D)

SETB EA ;开总中断允许

SETB ET0 ;开定时器0中断允许

READ: ;读键程序

L1:JB P3.2,L2 ;

LCALL DELAY ;按键延时防抖

JB P3.2,L1 ;

AJMP RUN ;确认计时键被按下,开始/继续计时

L2:JB P3.3,L3 ;

LCALL DELAY ;按键延时防抖

JB P3.3,L2 ;

AJMP PAUSE ;确认暂停键被按下,暂停计时

L3:JB P3.4,L1 ;

LCALL DELAY ;按键延时防抖

JB P3.4,L3 ;

AJMP STOP ;确认清零键被按下,秒表重置

RUN: ;计时键按下,跳转至此

SETB TR0 ;定时器0开始/继续运行

AJMP READ ;

PAUSE: ;暂停键按下,跳转至此

CLR TR0 ;

AJMP READ ;

TIME0: ;定时器0溢出,中断,跳转至此

INC 30H ;

MOV A,30H ;

CJNE A,#0AH,TIME1 ;30H单元中的值到10了吗?(计时到10毫秒了吗,也就是说,该向毫秒位送数了吗?)

MOV DPTR,#TAB ;30H中的值到10了,顺序执行

MOV A,R0 ;

INC R0 ;

CJNE R0,#0AH,GET ;R0中的值到10了吗?(该向秒位进位了吗?)

MOV R0,#00H ;

LCALL SECOND ;到了,R0清零,调用进位子程序SECOND,向秒位进位 GET: ;没到,跳过进位子程序

MOVC A,@A+DPTR ;

MOV P1,A ;查表并向数码管毫秒位送数

MOV 30H,#00H ;重置30H单元

TIME1: ;

MOV TH0,#0D8H ;

MOV TL0,#0FEH ;给定时器0重新预置数

RETI ;中断返回

SECOND: ;秒位进位子程序

PUSH ACC ;

- 9 -

PUSH PSW ;将ACC和PSW推入堆栈保护

MOV A,R1 ;

INC R1 ;

CJNE R1,#14H,GET1 ;R1中的值到20了吗,也就是说,该向十秒位进位了吗? MOV R1,#0AH ;

LCALL SECOND1 ;到了。R1重置,调用进位子程序SECOND1,向十秒位进位 GET1: ;没到,跳过进位子程序

MOVC A,@A+DPTR ;

MOV P2,A ;查表并向数码管秒位送数

POP PSW ;

POP ACC ;PSW,ACC出栈

RET ;子程序返回

SECOND1: ;十秒位进位子程序

PUSH ACC ;

PUSH PSW ;将ACC和PSW推入堆栈保护

MOV A,R2 ;

INC R2 ;

CJNE R2,#0AH,GET2 ;R2中的值到10了吗,也就是说,该将此位归零了吗? MOV R2,#00H ;到了,R2清零

GET2: ;没到,跳过清零程序

MOVC A,@A+DPTR ;

MOV P0,A ;查表并向数码管十秒位送数

POP PSW ;

POP ACC ;PSW,ACC出栈

RET ;子程序返回

STOP: ;清零键按下,跳转至此

MOV P3,#0FFH ;

MOV P0,#3FH ;

MOV P1,#3FH ;

MOV P2,#0BFH ;数码管清零

MOV 30H,#00H ;

MOV R0,#00H ;

MOV R1,#0AH ;

MOV R2,#00H ;工作寄存器初始化

CLR TR0 ;计时器0停止计时

MOV TH0,#0D8H ;

MOV TL0,#0FEH ;定时器0预置数

AJMP READ ;

DELAY: ;延时10ms子程序

MOV R3,#50D ;

D1:MOV R4,#100D ;

D2:DJNZ R4,D2 ;

DJNZ R3,D1 ;

RET ;子程序返回

- 10 -

TAB: DB 06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,3FH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH,0BFH ;数码管段选码数表

END ;程序结束

4 ISIS7Professionl软件仿真

利用Keilu Vision软件对源程序进行编译,编译成功后,把编译结果保存。然后根据我们的软件在PROTEUS中设计出相应的硬件电路,并将该电路保存到与WAVE程序相同的文件夹中,最后将程序装载到单片机中,通过ISIS7Professionl仿真,看程序是否能够实现预想的功能.

- 11 -

仿真图如下图所示:

ORG 0000H ;程序开始

AJMP START ;跳转到主程序START

ORG 000BH ;定时器0中断的地址入口

AJMP TIME0 ;定时器0溢出,跳转到中断程序TIME0 START: ;主程序

MOV P3,#0FFH ;输入端口P3全写1

MOV P0,#3FH ;

MOV P1,#3FH ;

MOV P2,#0BFH ;数码管初始化

基于at89c51单片机的多功能秒表系统设计20xx毕业论文

- 12 -

MOV 30H,#00H ;

MOV R0,#00H ;

MOV R1,#0AH ;

MOV R2,#00H ;工作寄存器初始化

MOV TMOD,#01H ;定时器0工作于方式1

MOV TH0,#0D8H ;

MOV TL0,#0FEH ;定时器0预置数(D8FEH=55550D)

SETB EA ;开总中断允许

SETB ET0 ;开定时器0中断允许

READ: ;读键程序

L1:JB P3.2,L2 ;

LCALL DELAY ;按键延时防抖

JB P3.2,L1 ;

AJMP RUN ;确认计时键被按下,开始/继续计时

L2:JB P3.3,L3 ;

LCALL DELAY ;按键延时防抖

JB P3.3,L2 ;

AJMP PAUSE ;确认暂停键被按下,暂停计时

L3:JB P3.4,L1 ;

LCALL DELAY ;按键延时防抖

JB P3.4,L3 ;

AJMP STOP ;确认清零键被按下,秒表重置

RUN: ;计时键按下,跳转至此

SETB TR0 ;定时器0开始/继续运行

AJMP READ ;

PAUSE: ;暂停键按下,跳转至此

CLR TR0 ;

AJMP READ ;

TIME0: ;定时器0溢出,中断,跳转至此

INC 30H ;

MOV A,30H ;

CJNE A,#0AH,TIME1 ;30H单元中的值到10了吗?(计时到10毫秒了吗,也就是说,该向毫秒位送数了吗?)

MOV DPTR,#TAB ;30H中的值到10了,顺序执行

MOV A,R0 ;

INC R0 ;

CJNE R0,#0AH,GET ;R0中的值到10了吗?(该向秒位进位了吗?)

MOV R0,#00H ;

LCALL SECOND ;到了,R0清零,调用进位子程序SECOND,向秒位进位 GET: ;没到,跳过进位子程序

MOVC A,@A+DPTR ;

MOV P1,A ;查表并向数码管毫秒位送数

MOV 30H,#00H ;重置30H单元

TIME1: ;

- 13 -

MOV TH0,#0D8H ;

MOV TL0,#0FEH ;给定时器0重新预置数

RETI ;中断返回

SECOND: ;秒位进位子程序

PUSH ACC ;

PUSH PSW ;将ACC和PSW推入堆栈保护

MOV A,R1 ;

INC R1 ;

CJNE R1,#14H,GET1 ;R1中的值到20了吗,也就是说,该向十秒位进位了吗? MOV R1,#0AH ;

LCALL SECOND1 ;到了。R1重置,调用进位子程序SECOND1,向十秒位进位 GET1: ;没到,跳过进位子程序

MOVC A,@A+DPTR ;

MOV P2,A ;查表并向数码管秒位送数

POP PSW ;

POP ACC ;PSW,ACC出栈

RET ;子程序返回

SECOND1: ;十秒位进位子程序

PUSH ACC ;

PUSH PSW ;将ACC和PSW推入堆栈保护

MOV A,R2 ;

INC R2 ;

CJNE R2,#0AH,GET2 ;R2中的值到10了吗,也就是说,该将此位归零了吗? MOV R2,#00H ;到了,R2清零

GET2: ;没到,跳过清零程序

MOVC A,@A+DPTR ;

MOV P0,A ;查表并向数码管十秒位送数

POP PSW ;

POP ACC ;PSW,ACC出栈

RET ;子程序返回

STOP: ;清零键按下,跳转至此

MOV P3,#0FFH ;

MOV P0,#3FH ;

MOV P1,#3FH ;

MOV P2,#0BFH ;数码管清零

MOV 30H,#00H ;

MOV R0,#00H ;

MOV R1,#0AH ;

MOV R2,#00H ;工作寄存器初始化

CLR TR0 ;计时器0停止计时

MOV TH0,#0D8H ;

MOV TL0,#0FEH ;定时器0预置数

AJMP READ ;

DELAY: ;延时10ms子程序

- 14 -

MOV R3,#50D ;

D1:MOV R4,#100D ;

D2:DJNZ R4,D2 ;

DJNZ R3,D1 ;

RET ;子程序返回

TAB: DB 06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,3FH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH,0BFH ;数码管段选码数表

END ;程序结束

基于at89c51单片机的多功能秒表系统设计20xx毕业论文

图7:系统仿真结果1

5 课程设计体会

经过一周的不懈努力,单片机的课程设计终于完成了。在这期间我们学会了很多,也学到了很多,同时,对单片机这门课程有了更深一步的理解和掌握。

1、本次课程设计使我加深了对单片机课程的全面认识,复习和掌握,对MC-51单片机有了更深入的了解,对I/O口的使用,晶振电路的接法,以及复位电路等的掌握都有了很大程度的提高,这为以后的实践打下了良好的基础。

2、掌握了定时器、外部中断的设置和编程原理。

3、通过此次课程设计能够将单片机软硬件结合起来,对程序进行编辑,校验。

4、还要根据实验的实际情况,添加些额外程序来使系统更加的稳定,如开 - 15 -

关的消震荡(采用延迟)。

5、程序要尽量做到由各个子程序组成,在有些程序后面最好加注释,这样在程序出错的检查过程中可以更容易查找的到,也更简洁,更明白易懂。

6、我在编程过程中还有好多不理解的地方,经过同学的帮助终于完成了这次设计。在这个过程中体会到了合作的好处,更了解的互相帮助的重要性。

由于编程能力的有限和所学知识的局限性,在这个程序和设计系统中虽然实现了所有的基本要求和部分的高级要求,但是这其中还有许多不完善的地方,有时在上翻和下翻时会出现一些问题,这说明我在这方面还存在着很多不足,知识不够完备和系统,在以后的学习中还有待提高。另外,在实践中虽然焊接好了硬件电路,却没能实践成功,希望老师能在以后的学习和生活中对我多加指导,促使我能取得更大的进步。

6参考文献

【1】余发山编著.单片机原理及应用技术徐州:中国矿业大学出版社,20xx年

【2】杨凌霄编著.微型计算机原理及应用.徐州:中国矿业大学出版社,20xx年

【3】杨宁编著.单片机与控制技术.北京:北京航空航天大学出版社,20xx年

【4】王闪编著.AT89系列单片机原理与接口技术.北京:北京航空航天大学出版社,20xx年

- 16 -

附录:程序清单:

ORG 0000H ;程序开始

AJMP START ;跳转到主程序START

ORG 000BH ;定时器0中断的地址入口

AJMP TIME0 ;定时器0溢出,跳转到中断程序TIME0 START: ;主程序

MOV P3,#0FFH

MOV P0,#3FH

MOV P1,#3FH

MOV P2,#0BFH

MOV 30H,#00H

MOV R0,#00H

MOV R1,#0AH

MOV R2,#00H

MOV TMOD,#01H

MOV TH0,#0D8H

MOV TL0,#0FEH

SETB EA

SETB ET0

READ:

L1:JB P3.2,L2

LCALL DELAY

JB P3.2,L1

AJMP RUN

L2:JB P3.3,L3

LCALL DELAY

JB P3.3,L2

AJMP PAUSE

L3:JB P3.4,L1

LCALL DELAY

JB P3.4,L3

AJMP STOP

RUN:

SETB TR0

AJMP READ

PAUSE:

CLR TR0

AJMP READ

TIME0:

INC 30H

MOV A,30H

;输入端口P3全写1 ; ; ;数码管初始化 ; ; ; ;工作寄存器初始化 ;定时器0工作于方式1 ; ;定时器0预置数(D8FEH=55550D) ;开总中断允许 ;开定时器0中断允许 ;读键程序 ; ;按键延时防抖 ; ;确认计时键被按下,开始/继续计时 ; ;按键延时防抖 ; ;确认暂停键被按下,暂停计时 ; ;按键延时防抖 ; ;确认清零键被按下,秒表重置 ;计时键按下,跳转至此 ;定时器0开始/继续运行 ; ;暂停键按下,跳转至此 ; ; ;定时器0溢出,中断,跳转至此 ; ; - 17 -

CJNE A,#0AH,TIME1 ;30H单元中的值到10了吗?(计时到10毫秒了吗,也就是说,该向毫秒位送数了吗?)

MOV DPTR,#TAB ;30H中的值到10了,顺序执行

MOV A,R0 ;

INC R0 ;

CJNE R0,#0AH,GET ;R0中的值到10了吗?(该向秒位进位了吗?)

MOV R0,#00H ;

LCALL SECOND ;到了,R0清零,调用进位子程序SECOND,向秒位进位 GET: ;没到,跳过进位子程序

MOVC A,@A+DPTR ;

MOV P1,A ;查表并向数码管毫秒位送数

MOV 30H,#00H ;重置30H单元

TIME1: ;

MOV TH0,#0D8H ;

MOV TL0,#0FEH ;给定时器0重新预置数

RETI ;中断返回

SECOND: ;秒位进位子程序

PUSH ACC ;

PUSH PSW ;将ACC和PSW推入堆栈保护

MOV A,R1 ;

INC R1 ;

CJNE R1,#14H,GET1 ;R1中的值到20了吗,也就是说,该向十秒位进位了吗? MOV R1,#0AH ;

LCALL SECOND1 ;到了。R1重置,调用进位子程序SECOND1,向十秒位进位 GET1: ;没到,跳过进位子程序

MOVC A,@A+DPTR ;

MOV P2,A ;查表并向数码管秒位送数

POP PSW ;

POP ACC ;PSW,ACC出栈

RET ;子程序返回

SECOND1: ;十秒位进位子程序

PUSH ACC ;

PUSH PSW ;将ACC和PSW推入堆栈保护

MOV A,R2 ;

INC R2 ;

CJNE R2,#0AH,GET2 ;R2中的值到10了吗,也就是说,该将此位归零了吗? MOV R2,#00H ;到了,R2清零

GET2: ;没到,跳过清零程序

MOVC A,@A+DPTR ;

MOV P0,A ;查表并向数码管十秒位送数

POP PSW ;

POP ACC ;PSW,ACC出栈

RET ;子程序返回

STOP: ;清零键按下,跳转至此

- 18 -

MOV P3,#0FFH ;

MOV P0,#3FH ;

MOV P1,#3FH ;

MOV P2,#0BFH ;数码管清零

MOV 30H,#00H ;

MOV R0,#00H ;

MOV R1,#0AH ;

MOV R2,#00H ;工作寄存器初始化

CLR TR0 ;计时器0停止计时

MOV TH0,#0D8H ;

MOV TL0,#0FEH ;定时器0预置数

AJMP READ ;

DELAY: ;延时10ms子程序

MOV R3,#50D ;

D1:MOV R4,#100D ;

D2:DJNZ R4,D2 ;

DJNZ R3,D1 ;

RET ;子程序返回

TAB: DB 06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,3FH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH,0BFH ;数码管段选码数表

END ;程序结束

- 19 -

相关推荐