您好,欢迎来到智榕旅游。
搜索
您的当前位置:首页单片机课程设计报告最终版

单片机课程设计报告最终版

来源:智榕旅游


单片机原理及其接口技术

课程设计报告

设计课题:基于MCS-51单片机的时钟秒表设计

专业班级: 08自动化 小组成员: 周剑(08118090) 指导教师: 阮海容

基于MCS-51单片机的时钟秒表设计

设计任务书 基本设计要求

(1)在ZY15MCU12BD型综合单片机实验箱的硬件结构上编写软件完成设计。

(2)程序的首地址应使目标机可以直接运行,即从0000H开端。在主程序的开端部分必须设置一个合适的栈底。程序放置的地址须持续且靠前,不要在中间留下大批的空间地址,以使目标机可以应用较少的硬件资源。

(3)6位显示器数码管从左到右分辨显示时. 分. 秒(各占用2位),采用24小时标准计时制。开端计时时为000000,到235959后变成000000.

(4)在4*4矩阵键盘上选定3个键分辨作为小时. 分. 秒的调校键。每按一次键,对应的显示值便加1。分. 秒加到59后变为00;小时加到23后再按键即变为00.再调校时均不向上一单位进位(例如分加到59后变为00;但小时不产生转变).

(5)软件设计必须应用8031片内定时器,采用定时中断结构,不得应用软件延时法

选作项目

(1)另设三个键,分别作小时、分、秒的减1调校。

(2)在以上设计的基础上,修改程序制作一个电子秒表。分、秒各占用

2位显示,1/10秒、1/100秒各占用1位显示。设定二个键分别作启动/ 停止、清零。

(3)在做完(2)后,将时钟与秒表合二为一,并且在同时使用时互不影 响。即可在时钟与秒表之间任意切换,而不影响走时、计秒。

.目录

第一章 设计阐明

1.1 设计内容 1.2 设计请求

1.3设备及工作环境 第二章 硬件计划 2.1 设计思路

2.2 原理电路图

2.3 硬件工作原理论述 第三章 软件计划 3.1 分析论证 3.2 程序流程图 3.3程序清单 第四章 调试过程及成果分析 第五章 设计总结 参考文献

第一章 设计阐明

1.1设计内容

用ZY15MCU12BD型综合单片机实验箱及串口电路设计实现显示时间并能够调校时间的时钟,还能够实现秒表的启动/暂停,复位功能 1.2设计请求

(1) 在ZY15MCU12BD型综合单片机实验箱的硬件结构上编写软件完成设计。

(2) 程序的首地址应使目标机可以直接运行,即从0000H开端。在主程序的开端部分必须设置一个合适的栈底。程序放置的地址须持续且靠前,不要在中间留下大批的空间地址,以使目标机可以应用较少的硬件资源。 (3) 6位显示器数码管从左到右分别显示时. 分. 秒(各占用2位),采用24小时标准计时制。开端计时时为000000,到235959后变成000000. (4) 在键盘上选定6个键分别作为小时. 分. 秒的调校键。每按一次键,对应的显示值便加1或减1。分. 秒加到59后变为00;小时加到23后再按键即变为00.再调校时均不向上一单位进位(例如分加到59后变为00;但小时不产生转变)再选一个键用作时钟的复位键.另外选一个键作为秒表的启动/暂停键,再选一个键作为秒表的复位键。

(5) 软件设计必须应用8031片内定时器,采用定时中断结构,不得应用

软件延时法。

(6) 上机调试程序。 (7) 写出设计报告。 1.3设备及工作环境

(1) 硬件:盘算机一台、ZY15MCU12BD型综合单片机实验箱一台、通信电缆一根。

(2) 软件:Windows操纵系统、Keil C51软件。

第二章 硬件计划 2.1 设计思路

电子时钟程序由显示模块、校时模块和时钟运算模块三大部分组成。其中校时模块和时钟运算模块要对时、分、秒的数值进行操作,并且秒算到60时,要自己清零并向分进1;分算到60时,要自己清零并向时进1;时算到24时,要清零。这样,才能循环记时。秒表程序也由显示模块,启动/暂停复位模块和时钟运算模块组成。其中校时模块和时钟模块要对1/100秒,1/10秒,秒,分的数值进行操作并且1/100秒算到10时,要自己清零并向1/10秒进1;1/10秒算到10时,要自己清零并向秒进1;秒时算到60时,要自己清零并向分进1,秒时算到60时,要自己清零。用按键决定是进入时钟程序还是秒表程序。 2.2 原理电路图

2.3 硬件工作原理论述

硬件由8031芯片、74LS373锁存器、8255A串口芯片、74LS240驱动器、显示器数码显示管和4*4键盘组成.由8031片内定时器定时中断,并取一存储单元作为计数器应用,每中断一次,在中断服务程序中使计数器加1、用8031片内定时器T0定时中断服务程序完成秒、分、时的运算即计时功效,T1定时中断服务程序完成1/100秒、1/10秒、秒,分的运算即秒表功效。8255A负责将内存里的时位、分位和秒位数值或1/100秒、1/10秒、秒,分位数值输出到数码管。同时按键01键、02键、03键是分别对时、分、秒的加1校订;05键、06键、07键时分别对时、分、秒的减1校订;00键是清零键。并且开机时时钟时从000000开端计时的,到235959时在回到000000.09键实现秒表的启动/暂停,0A0键实现秒表的复位。

第三章 软件计划

3.1 分析论证

此时钟秒表的设计与实现,主要采用了6只显示器数码管,8031内部二进制16位定时器/计数器,可编程并行I/O接口8255芯片和矩阵键盘等,包含显示模块,运算模块和校时模块三大功效模块。 3.1.1、显示模块:

用8255,数码管的显示功效来设计。显示部分硬件用六只显示器为显示管,这些显示器发光二极管的阳极是互相连接在一起的,所以称为共阳极数码管。通过在这8只发光二极管的阴极加-5 V或0 V的电压使不同的二极管发光,形成不同的数字。该模块重要是将运算模块和校时模块运算出来并存放在内存单元里的十六进制表现的时位、分位和秒位或或1/100秒、1/10秒、秒,分数值转化为十进制,并通过6只数码管显示出来。该模块实现的硬件是实验箱中的显示器单元,采用软件译码,即在程序中设置一个段选码表。CPU直接往显示器输出八段代码,省去了硬件译码器。只要做到每送一次段选码时也送一次位扫描码,并且每送一次位扫描码后,位码中的0右移一位作为下一次的位扫描码,即可实现由左向右使6只显示器依次呈现数字显示。 3.1.2、运算模块:

该模块的重要功效是对时、分、秒或或1/100秒、1/10秒、秒,分的运算,并把运算出的终极成果存到事先已经开辟的内存单元里,以便显示模块即时地显示出来。该模块可以细分为定时模块和运算模块。定时模块负责供给中断信号,由于CPU运算模块中的指令耗费必定的时间,所以中断信号最好通过硬件来实现。本实验中用8031定时器/计数器,但由于8031供的信号的周期是毫秒级的,因此必须通过软件的方法在运算模块中设置一个统计中断次数的变量,并且这一变量必须事先在内存里开辟存储单元。中断信号是8031工作方法为方法1,产生一个50ms的脉冲信号。运算模块负责时、分、秒或或1/100秒、1/10秒、秒,分的计算,在中断服务程序里,必须对秒、分和时的单元内的数值进行判断,当秒加到60时,分必须加1 、秒清零;当分加到60时,时加1、分清零。当时加到

24时,直接清零,然后转到调用处。秒表也是如此。 3.1.3、校时模块:

该模块重要功效是修正时、分、秒内存单元的数值。每按一次键,对应的显示值便加1。分、 秒加到59后变为00;小时加到23后再按键即变为00.再调校时均不向上一单位进位(例如分加到59后变为00;但小时不产生转变)。要注意在主程序中对时间进行调校前应封闭中断,以防在调校过程中定时中断服务程序也对时间进行修正而造成混杂。 3.1.4、启动/暂停,复位模块

该模块的功能是实现秒表的启动/暂停,复位。本实验中第一次按下09键进入秒表程序,开始跑时,第二次按下09键暂停秒表,按下0A0键秒表清零并返回到主程序 3.1.5、整体功效:

在6块显示器数码管上能实现数字时钟的时、分、秒显示和秒表,并能对时、分、秒进行加1校订、减1校订和清零。本实验中01键、02键、03键是分别对时、分、秒的加1校订;05键、06键、07键时分别对时、分、秒的减1校订;00键是清零键。并且开机时时钟时从000000开端计时的,到235959时在回到000000. 3.2 程序流程图

开始 初始化( 定时器、显示区、 中断系统、计数单元等) 开中断 调用显示子程序 调用键盘扫描子程序 有键按下? Y 关中断 Y 09键? N 进入秒表程序 暂停 09键?

进入时钟程序 小时+1Y 分+1? N 0A键? 复位 小时加1处理 分加1处理 秒+1? 秒加 1 处理 时-1? 时减1处理 分-1? 秒-1? 分减1处理 秒减1处理

主程序流程图

定时器中断处理 重送初值 保护现场 计数单元加1 N 到1秒? 秒加1 N 秒到60? 秒清0、分加1 N 分到60? 分清0、小时加1 N 小时到24? 小时清0 恢复现场 中断返回 图2 定时器 T0中断程序流程图

3.3程序清单…

ORG 0000H LJMP START ORG 000BH LJMP INTT0 ORG 001BH LJMP INTT1

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 主 程 序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;

START: MOV SP, #60H MOV R0, #5 LOOP1: MOV R1, #200 LOOP2: MOV R2, #250 DJNZ R2, $ DJNZ R1, LOOP2

DJNZ R0,LOOP1 ;延时0.5S MOV DPTR,#4003H ;8255初始化 MOV A, #81H MOVX @DPTR, A MOV R0, #20H MOV R7, #07H CLEAR: MOV @R0, #00H MOV @R1, #00H INC R0

DJNZ R7,CLEAR ;20H-26H 30H-36H清零 MOV TMOD,#11H ;选择方法. MOV TH1, #0D8H MOV TL1, #0F0H MOV TH0, #3CH

MOV TL0,#0B0H ;赋初值 LOOP: SETB EA SETB ET0

SETB TR0 ;启动T0计数

LCALL DISPLAY1 ;调用时钟显示程序 LCALL KEYSCAN ;键盘扫描

CJNE A,#0FFH, CHOOSE ;若有键按下,则CHOOSE SJMP CLOCK ;无键按下,则转LOOP CHOOSE: CJNE A, #09H,CLOCK

LJMP SECONDS ;若秒表启动键按下,则进入秒表 CLOCK: LCALL DISPLAY1

LCALL KEYSCAN ;再次扫描键盘

CJNE A,#0FFH,SET_A;若有键按下则进入调校 SJMP LOOP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 秒表 程 序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SECONDS: MOV 30H, #00H MOV 31H, #00H MOV 32H, #00H MOV 33H, #00H MOV 34H, #00H MOV 35H, #00H SETB TR1

LOOP3: SETB ET1

LCALL DISPLAY2 LCALL KEYSCAN

CJNE A,#0FFH,PAUSE;若有键按下,则PAUSE SJMP LOOP3

PAUSE:CLR ET1 ;关中断

CJNE A, #09H, RESET1 CPL TR1;暂停 SJMP LOOP3

RESET1: CJNE A, #0AH, LOOP5 MOV TH1, #0D8H MOV TL1, #0F0H SETB TR1 MOV 30, #00H MOV 31, #00H MOV 32, #00H MOV 33, #00H MOV 34, #00H MOV 35,#00H;清零 CLR TR1

LCALL DISPLAY2 LJMP LOOP LOOP5: AJMP LOOP3

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 加1子 程 序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;

SET_A: CLR ET0 ;关中断

CJNE A,#03H,ADDMM ;按下的键为秒键往下履行 INC 25H MOV A, 25H

CJNE A, #10, LOOP4

MOV 25H, #0 INC 24H MOV A, 24H

CJNE A, #6, LOOP4 MOV 24H, #0 SJMP LOOP

ADDMM: CJNE A,#02H,ADDHH ;按下的键为分键往下履行 INC 23H MOV A, 23H

CJNE A, #10, LOOP4 MOV 23H, #0 INC 22H MOV A, 22H

CJNE A, #6, LOOP4 MOV 22H, #0 LJMP LOOP

ADDHH: CJNE A,#01H,REST ;按下的键为小时键往下履行 INC 21H MOV A, 21H

CJNE A, #10, A_HOUR MOV 21H, #0 INC 20H

REST: CJNE A,#00H,DECSS MOV 20H, #00H MOV 21H, #00H MOV 22H, #00H MOV 23H, #00H MOV 24H, #00H MOV 25H, #00H A_HOUR: MOV A, 20H SWAP A ORL A, 21H

CJNE A, #24H, LOOP4 MOV 20H, #0 MOV 21H, #0 LOOP4: LJMP LOOP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 减1子 程 序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;

SET_D: LJMP LOOP

DECSS: CJNE A,#07H,DECMM MOV A, 25H DEC 25H

CJNE A, #0, SET_D MOV 25H, #9 MOV A, 24H DEC 24H

CJNE A, #0, SET_D MOV 24H, #5 SJMP SET_D

DECMM: CJNE A, #06H, DECHH MOV A, 23H DEC 23H

CJNE A, #0H, SET_D MOV 23H, #9 MOV A, DEC 22H

CJNE A, #0, SET_D MOV 22H, #5 SJMP SET_D

DECHH: CJNE A,#05H,SET_D MOV A, 21H

CJNE A, #0, D_HOUR1 MOV A, 20H

CJNE A, #0,D_HOUR2 MOV 21H, #3 MOV 20H, #2 SJMP SET_D D_HOUR1: DEC 21H LJMP SET_D D_HOUR2: DEC 20H MOV 21H, #9 LJMP SET_D

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 时钟显示程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; 显示数据在20H-25H单元内,用六位LED共阳数码管显示, DISPLAY1: MOV PSW, #08H MOV R0, #20H MOV R2, #0FEH LD0: MOV A,@R0

MOV DPTR, #DTAB

MOVC A,@A+DPTR ;查字形代码

MOV DPTR,#4001H ;字形代码送B段口 MOVX @DPTR, A MOV A, R2

MOV DPTR,#4000H ;字形代码送A位口

MOVX @DPTR, A MOV R1, #250 DJNZ R1, $

MOV A,#0FFH ;封闭所有的显示位即位口置高电平 MOVX @DPTR, A MOV A, R2 RL A

MOV R2, A INC R0

CJNE R0, #26H,LD0 RET

DTAB: DB 0C0H, 0F9H, 0A4H, 0B0H, 99H DB 92H, 82H, 0F8H, 80H, 90H DB 88H, 83H, 0C6H, 0A1H, 86H DB 8EH, 40H, 79H, 24H, 30H DB 19H, 12H, 02H, 78H, 00H DB 80H, 08H, 03H, 46H, 21H DB 06H, 0EH, 0BFH, 0FFH

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 秒表显示程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; 显示数据在30H-35H单元内,用六位LED共阳数码管显示, DISPLAY2: MOV PSW, #08H MOV R0, #30H MOV R2, #0FEH LD1: MOV A,@R0

MOV DPTR, #DTAB1

MOVC A,@A+DPTR ;查字形代码

MOV DPTR,#4001H ;字形代码送B段口 MOVX @DPTR, A MOV A, R2

MOV DPTR,#4000H ;字形代码送A位口 MOVX @DPTR, A MOV R1, #250 DJNZ R1, $

MOV A,#0FFH ;封闭所有的显示位即位口置高电平 MOVX @DPTR, A MOV A, R2 RL A

MOV R2, A INC R0

CJNE R0, #36H,LD1 RET

DTAB1: DB 0C0H, 0F9H , 0A4H, 0B0H, 99H DB 92H, 82H, 0F8H, 80H, 90H DB 88H, 83H, 0C6H, 0A1H, 86H DB 8EH, 40H, 79H, 24H, 30H DB 19H, 12H, 02H, 78H, 00H DB 80H, 08H, 03H, 46H, 21H DB 06H, 0EH, 0BFH, 0FFH

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 键盘扫描程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEYSCAN: MOV DPTR, #4002H MOV A, #0FH MOVX @DPTR, A MOVX A,@DPTR ANL A, #0FH

CJNE A, #0FH,NEXT SJMP DONE NEXT: MOV R2, #0EFH KEYSM1: MOV A, R2

MOV DPTR, #4002H MOVX @DPTR, A MOVX A,@DPTR ANL A, #0FH

CJNE A, #0FH, NEXT1 KEYSM2: MOV A, R2 RL A

MOV R2, A

JB ACC.0, KEYSM1 DONE: MOV A, #0FFH RET

NEXT1: MOV R6, A MOV R3, #100 LOOP9: MOV R4, #100 DJNZ R4, $ DJNZ R3, LOOP9 MOVX A,@DPTR ANL A, #0FH XRL A, R6 JNZ KEYSM2 LOOP20: MOVX A,@DPTR ANL A, #0FH

CJNE A, #0FH, LOOP20 MOV A, R6 ANL A, #0FH

MOV R6, A MOV A, R2 ANL A, #0F0H ORL A, R6 CALL KEY20 RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 查键值程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KEY20: PUSH ACC MOV R1, #00H KEY21: JNB ACC.4, KEY22 RR A INC R1 SJMP KEY21 KEY22: MOV A, R1 MOV B, #4 MUL AB MOV R1, A POP ACC

KEY23: JNB ACC.0,KEY24 RR A INC R1 SJMP KEY23

KEY24: MOV DPTR, #KEYTAB MOV A, R1

MOVC A,@A+DPTR RET

KEYTAB: DB 0FH, 0BH, 07H, 03H DB 0EH, 0AH, 06H, 02H DB 0DH, 09H, 05H, 01H DB 0CH, 08H ,04H, 00H

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; T1中断服务程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;

INTT1: PUSH ACC PUSH PSW

MOV TH1, #0D8H MOV TL1, #0F0H INC 35H MOV A, 35H

CJNE A,#10,OUTT1;未到1秒,则转RETURN MOV 35H, #00H

INC 34H ;到1秒,秒单元的个位加1 MOV A, 34H

CJNE A, #10, OUTT1; MOV 34H, #00H INC 33H MOV A, 33H

CJNE A,#10,OUTT1;未到60秒,则转 MOV 33H , #00H

INC 32H ; 分单元个位加1 MOV A, 32H

CJNE A , #06,OUTT1 MOV 32H, #00H INC 31H MOV A, 31H

CJNE A,#10H,CCC ;若未到60分,则转 MOV A, 30H

CJNE A, #06H, CCC MOV 31H, #00H MOV 30H, #00H CCC: CJNE A, #10, OUTT1 MOV 31H, #00H INC 30H MOV A, 30H OUTT1: POP PSW POP ACC RETI

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; T0中断服务程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;T0中断服务程序 INTT0: PUSH ACC PUSH PSW

MOV TH0, #3CH MOV TL0, #0B0H INC 26H MOV A, 26H

CJNE A,#20,OUTT0 ;未到1秒,则转RETURN MOV 26H, #00H

INC 25H ;到1秒,秒单元的个位加1 MOV A, 25H

CJNE A, #10, OUTT0; MOV 25H, #00H INC 24H MOV A, 24H

CJNE A,#6,OUTT0;未到60秒,则转 MOV 24H, #00H

INC 23H ; 分单元个位加1 MOV A, 23H

CJNE A, #10, OUTT0 MOV 23H, #00H INC 22H MOV A, 22H

CJNE A,#06H,OUTT0 ;若未到60分,则转 MOV 22H, 00H INC 21H MOV A, 21H

CJNE A, #4H, CCCC MOV A, 20H

CJNE A, #2H, CCCC MOV 21H, #00H MOV 20H, #00H CCCC: CJNE A, #10, OUTT0 MOV 21H, #00H INC 20H MOV A, 20H OUTT0: POP PSW POP ACC RETI END

第四章 调试过程及分析

编写好的源程序在 Keil 编译后呈现很多错误,这些错误有很多时平时的实验碰到过的,例如:字母开头忘加0,零和字母O弄混杂了,有些标号用了几次,CJNE写成了CJNZ等等,幸好这些错误在平时的实验中碰到了,所以改错误很轻易,。除了常见的错误外,还有几条错误时在前几次实验都没有出现过,如:AJMP跳转指令跳不回指定的地位,是由于跳转的长度大于AJMP跳转的长度,最后只好用LJMP跳转后才跳到指定的地位。在前期的程序编写和几天的上机调试,使我又获得了很多新的知识,由于前期编写程序时查了很多材料学到了很多知识,这几天的调试更时获得很新的知识,由于程序中又很多的错误,为了修正错误必须看书或向别人请教,在这个过程中无意识的获得了很多知识。同时也使我对单片

机更感兴趣了,这点我感到很重要,相信这会对以后的学习有所帮助

第五章 设计总结

本次课程设计是用ZY15MCU12BD综合单片机实验箱及串口电路设计一个时钟秒表,经过一个星期的调试,成果满足基本设计请求,验证无误。设计重要用到了多种芯片,程序也比较长,比较麻烦,同时也碰到了不少艰苦,尤其是关于校时模块和时钟与秒表之间切换的设计实现。关于显示模块,在以前的实验中做过,所以题目很轻易解决。

通过本次设计,我懂得了时钟的设计流程,尤其是硬、软件的设计方法以及键盘显示电路的基础功效及编程方法和键盘电路和显示电路的一般原理,也进一步了解了8031定时器的应用和中断CPU程序的编程方法,开辟了思路,,提高了分工协作才能和分析题目,解决题目的能力.

参 考 文 献

1.胡汉才编著,《单片机原理及其接口技术》清华大学出版社,2004。

2.楼然苗等编著,《51系列单片机设计实例》北京航空航天大学出版社,2006。

3.汪道辉编著,《单片机系统设计与实践》 电子工业出版社 2005

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- zrrp.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务