单片机电子钟课程设计报告

更新时间:2024-05-31 23:26:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课程设计

课程名称传感器技术与应用 题目名称光电传感器的设计与制备 学生学院材料与能源学院 专业班级12电材 2 班 学 号 3112007277 学生姓名叶碧华 指导教师李瑜煜

2015年 01 月 09 日

基于单片机的“个性化电子钟”

课程设计任务书

一. 根据《单片机原理及接口技术》所学的内容及其他相关课程的知识,结合各生的基础,

充分发挥个人的特长,设计个性化数字电子钟。具体要求以下: 1. 2. 3.

AT89S51CPU,12MHZ时钟,常规上电和手动复位电路。

4位LED数码显示器(带钟点),分别显示“小时:分钟”或“分钟:秒” 3个独立试按键,具体功能描述如下:

[MODE]——模式转换键,具有“正常——小时(校准)——分钟(校准)——小时(闹铃)——分钟(闹铃)”等5种模式,每按一次,转换一种模式。假设当前处于正常模式,按一下此键,“小时”闪烁,表示进入“小时”调校模式,再按一次,转入分钟模式,如此类推,正常模式下不闪烁。

[UP]——加“1”键,按下此键,被选中的项目加“1” [DOWN]——减“1”键,按下此键,被选中的项目减“1” 4. 5.

设计1路蜂鸣器输出驱动电路,用于报警或按键声

电源:9V交流输入,全波整流,滤波,7805稳压电路,输出5V直流电源共给单片机系统。 6.

编写数字电字钟的所有软件,包括主程序,定时器中断计时程序,定时器中断扫描显示程序,键盘扫描及功能程序,BCD码转换程序,“二翻十﹑拆字﹑转码”程序,闹铃程序等等。将这些程序整合成一个完整的电子钟程序,在软件模拟器上调试,在MCS51学习机上调试,并测试其功能及性能。在设计软件时,学生可充分发挥自己的特长和想象力,自行扩充功能,如“秒表”功能,通信功能,钟控功能等。 7.

在程序调试通过后,测试计时精度,分析误差来源,提出补偿方法。

二. 设计报告要求:

每人一份设计报告,要求独立完成,用统一的封面装订,设计报告的内容包括以下部分: 1. 2. 3. 4. 5. 6. 7.

设计任务书

个性化电子钟功能要求

单片机系统原理图及工作原理描述 程序模块框图 程序清单

设计或调试过程中碰到的问题及决计方法

测试数据,误差分析,补偿方法,补偿前后精度比较

8. 完成课程设计后的收获或体会,对《单片机课程设计》提出改进意见。

三. 课程设计验收标准:

本次课程设计的成绩由3大部分组成:即硬件设计﹑软件设计和课程设计报告。硬件设计主要是电路图设计(可以用手工画或计算机辅助设计)。软件部分在答辩时验收,并结合答辩情况进行评定。 1.

电路原理图设计(20%),包括以下知识点: CPU及时钟,复位电路 显示接口电路 键盘接口电路 蜂鸣器驱动电路 电源部分 2.

软件设计及答辩(60%),包括以下知识点: 主程序及初始化程序 定时中断及计时程序 定时中断及显示程序 键盘程序 闹铃程序 按键声程序 3.

课程设计报告(20%),具体要求见上面所述.

四. 基础较好的学生可以结合实际应用自拟题目,题目和具体设计内容定好后

由指导老师比准。

指导老师:乐金松

2014,12,28

摘 要

本次课程设计为基于单片机的“个性化电子钟”。本设计中使用的单片机系统硬件部分CPU为AT89C52,包含时钟、复位电路、显示接口电路、键盘接口电路、蜂鸣器驱动电路和电源部分。软件部分使用Keil3编写程序,程序包含主程序及初始化程序、定时中断及计时程序、定时中断及显示程序、键盘程序、闹铃程序、按键声程序、LED程序和秒表程序。最终实现时钟、调时、闹铃、秒表等功能。 关键词:单片机系统,AT89C52,个性化电子钟。

1. 个性化电子钟功能要求

1) 模式:模式0,时/分显示或分/秒显示。

模式1,小时校准,处于此模式时小时闪烁。

模式2,分钟校准,处于此模式时分钟闪烁。 模式3,闹铃小时校准,处于此模式时闹铃小时闪烁。 模式4,闹铃分钟校准,处于此模式时闹铃分钟闪烁。 模式5,秒表显示。

2) 按键:P3.2,模式加1。

P3.3,模式0时,闹铃开关;模式5时,秒表开始/暂停。

P3.4,模式0时,时分/分秒显示切换;模式5时,秒表复位。 P3.5,时/分加1。 P3.6,时/分减1。

3) LED:P0.0~P0.5,对应模式0~模式5。P0.7,对应闹铃开关。

4) 4位LED数码显示器(带钟点),分别显示“小时:分钟”或“分钟:秒”。 5) 继电器每秒取反一次。

6) 当有按键按下或闹铃时间到时,蜂鸣器响。

2. 单片机系统原理图及工作原理描述

2.1 CPU及时钟电路

本次设计以AT89C52单片机为CPU。单片机的时钟信号通常有两种方式得到:内部振荡和外部振荡。以下使用内部振荡,频率为11.0592MHZ,电路如图1。

图1CPU及时钟电路

2.2 复位电路

当复位引脚出现两个机器周期以上的高电平时,单片机内部就执行复位操作。复位信号变低电平时,单片机开始执程序。复位电路分为上电复位和手动复位,本次使用手动复位,电路如图2。

图2 复位电路

2.3 数码管显示电路

显示接口电路有4位带钟点的LED数码显示器组成,由P2口控制数码管的各段二极管的导通。P1.4~P1.7分别对应四个数码管,当其中的位置0时,对应的数码管就会被点亮。电路如图3:

图3 数码管显示电路

2.4 键盘接口电路

本单片机系统设有6个独立按键,对应P3.2~P3.7,输入低电平有效。电路如图4.

图4 键盘接口电路

2.5 LED驱动电路

单片机系统中设有8个LED灯,每个LED灯占用一个IO口线,由P0口控制,低电平有效。电路如图5。

图5 LED驱动电路

2.6 蜂鸣器驱动电路

本系统使用P1.2口驱动蜂鸣器,当输入低电平是蜂鸣器发出响声。电路如图6

图6蜂鸣器驱动电路

2.7 电源部分

电源部分使用9V交流输入,全波整流,滤波,7805稳压电路,输出5V直流电源供给单片机系统。电路如图7。

图7 电源电路

3. 程序模块框图

3.1 模式扫描框图

模式1时,小时闪烁。模式2时,分钟闪烁。模式3,闹铃小时闪烁。模式4,闹铃分钟闪烁。

3.2 闹铃程序框图

闹铃程序中,变量ARM控制闹铃开关,变量H_ARM为闹铃小时,变量M_MEM为闹铃分钟。

开始 TIMER_COUNT加1 3.3 中断服务程序框图

否 TIMER_COUNT为2的整数倍? 0 1 STOP值?

否 是 XS_MEM加1 X_MEM=100? 是 TS_MEM加1 TIMER_COUNT =100? 否 是 秒加1 秒=60? 否 是 秒清零,分加1 分=60? 否 是 分清零,时加1 时=24? 否 是 时清零 结束

中断服务中包含了秒表程序和时钟运行程序。其中,XS_MEM为秒表程序的LED1、LED2显示变量,单位为10MS。TS_MEM为秒表程序的秒单元,在LED3、LED4中显示。定时器每隔5MS产生一次中断,中断初值TL0=(65536-N)MOD256,TH0=(65536-N)/256。其中N=5000/(12/11.0592)=4608。

3.4 按键扫描程序框图

各按键功能如要求所述,按键扫描流程如下。

有键按下? 否 开始

调用按键声程序 K1处理 K2处理 K3处理 K4处理 K5处理 是 按键判断

是 按键释放? 否

返回

3.5 LED指示灯程序框图

开 闹铃开关? 关 开始

3.6 主程序框图

P0.0点亮 P0.1点亮 模式0 模式1 模式2 P0.7点亮 模式判断 模式3 模式4 模式5 P0.2点亮 P0.3点亮 P0.4点亮 P0.5点亮 开始 调用清内存程序 设定时器初值 中断初始化 调用闹铃程序

调用扫描显示程序 调用LED扫描程序 调用按键扫描程序 4. 程序清单

LED1 LED2 LED3 LED4

EQU EQU EQU EQU

7FH 7EH 7DH 7CH

7BH ;扫描显示计数器 7AH 79H

SCAN_COUNT EQU TIMER_COUNT EQU MODE_REG TEMP S_MEM M_MEM H_MEM

EQU

EQU EQU

78H 77H

76H 75H

;秒表变量,10MS

;秒表变量,S

EQU EQU

XS_MEM TS_MEM M_ARM H_ARM

EQU 74H EQU EQU EQU

73H 72H 71H

;闹铃分钟

;闹铃小时

FLASH_FLAG EQU 20H.0 ARM EQU 20H.1 STOP

EQU

20H.2

;闹铃开关标志

;秒表暂停标志

;时分/分秒切换标志

CHANGE ORG

0000H

EQU 20H.3

LJMP MAIN ORG 000BH LJMP TO_INT0 ORG

0030H

;--------------主程序-------------------- MAIN: LCALL CLR_MEM MOV SP,#2FH

MOV TL0,#(65536-4608) MOD 256

;清除内存

MOV TH0,#(65536-4608)/256

MOV TMOD,#00010001B SETB ET0 SETB ET1

SETB EA SETB TR0 SETB TR1 SETBPT0

MOV TIMER_COUNT,#0

;--------------闹铃程序------------------ ALARMSCAN:

JNB ARM,CLOSE MOV A,H_ARM

CJNE A,H_MEM,CLOSE MOV A,M_ARM CJNE A,M_MEM,CLOSE CLR P1.2 LJMP KEYSCAN

CLOSE:

SETB P1.2

;--------------键盘扫描程序------------- KEYSCAN:

JNB P3.2,K1 JNB P3.3,K2 JNB P3.4,K3

JB P3.5,J36 LJMP K4

J36:JB

P3.6,WAIT

LJMP K5

WAIT:

LCALL LED LCALL

;-------------按键功能------------------ K1: MOV TEMP,P3

LCALL D10ms MOV A,P3 CJNE A,TEMP,K1 LCALL RING

;调用按键声程序

;去抖动

CONVERT_BCD

SJMP ALARMSCAN

INC MODE_REG

;模式寄存器+1

MOV A,MODE_REG

CJNE A,#6,K11 MOV MODE_REG,#0

K11: LCALL CONVERT_BCD K2:

MOV TEMP,P3 LCALL D10ms MOV A,P3 CJNE A,TEMP,K2 LCALL RING

JNB P3.2,K11 RET

MOV A,MODE_REG

CJNE A,#0,K21 LJMP ARM_SWIT

K21:CJNE A,#5,K22 LJMP STOP_WATCH K22:RET

ARM_SWIT:

;闹铃开关

CPL ARM SETB P1.2

JNB P3.3,$ RET

STOP_WATCH:

;秒表暂停

CPL STOP

JNB P3.3,$

RET

K3: MOV TEMP,P3 LCALL D10ms MOV A,P3 CJNE A,TEMP,K3

LCALL RING

MOV A,MODE_REG CJNE A,#0,K31

LJMP HM_MS

K31:CJNE A,#5,K32 LJMP RST K32:RET

HM_MS:

CPL CHANGE JNB P3.4,$

RET

RST:MOV XS_MEM,#0 MOV TS_MEM,#0 JNB P3.4,$

RET

;显示切换

;秒表复位

K4: MOV TEMP,P3

LCALL D10ms MOV A,P3 CJNE A,TEMP,K4 LCALL RING

;(时分秒加1)

MOV A,MODE_REG CJNE A,#0,K41

LCALL CONVERT_BCD RET

K41:CJNE A,#1,K42 LJMP H_INC

K42:CJNE A,#2,K43

H_INC: INC

H_MEM

LJMP M_INC K43:CJNE A,#3,K44 LJMP H1_INC K44:LJMP M1_INC

MOV A,H_MEM

CJNE A,#24,H_INC1 MOV H_MEM,#0

CONVERT_BCD

H_INC1: LCALL

M_INC: INC

JNB P3.5,H_INC1 RET

M_MEM

MOV A,M_MEM

CJNE A,#60,M_INC1 MOV M_MEM,#0

CONVERT_BCD

M_INC1: LCALL

JNB P3.5,M_INC1 RET

H1_INC: INC H_ARM

MOV A,H_ARM

CJNE A,#24,H1_INC1 MOV H_ARM,#0

CONVERT_BCD

H1_INC1:LCALL M1_INC:

INC

JNB P3.5,H1_INC1 RET

M_ARM

MOV A,M_ARM

CJNE A,#60,M1_INC1 MOV M_ARM,#0

M1_INC1:LCALL CONVERT_BCD

K5: MOV TEMP,P3

LCALL D10ms MOV A,P3 CJNE A,TEMP,K5 LCALL RING

JNB P3.5,M1_INC1 RET

MOV A,MODE_REG CJNE A,#0,K51

LCALL CONVERT_BCD RET

K51:CJNE A,#1,K52 LJMP H_DEC

K52:CJNE A,#2,K53

LJMP M_DEC K53:CJNE A,#3,K54 LJMP H1_DEC K54:LJMP M1_DEC

H_DEC: DEC H_MEM

MOV A,H_MEM

CJNE A,#0FFH,H_DEC1 MOV H_MEM,#23

CONVERT_BCD

H_DEC1: LCALL

M_DEC:DEC

JNB P3.6,H_DEC1 RET

M_MEM

MOV A,M_MEM

CJNE A,#0FFH,M_DEC1 MOV M_MEM,#59

M_DEC1: LCALL CONVERT_BCD JNB P3.6,M_DEC1

H1_DEC: DEC

H_ARM

RET

MOV A,H_ARM

CJNE A,#0FFH,H1_DEC1 MOV H_ARM,#23

H1_DEC1: LCALL CONVERT_BCD

M1_DEC:DEC

M_ARM

JNB P3.6,H1_DEC1 RET

MOV A,M_ARM

CJNE A,#0FFH,M1_DEC1 MOV M_ARM,#59

M1_DEC1:LCALL CONVERT_BCD JNB P3.6,M1_DEC1

;---------------指示灯程序------------ LED:

JNB ARM,OFF

RET

CLR P0.7

LJMP MODE_LED

OFF:SETB P0.7

MODE_LED:

MOV A,MODE_REG CJNE A,#0,LEDA

ORL P0,#03FH CLR P0.0 RET

LEDA:CJNE A,#1,LEDB ORL P0,#03FH CLR P0.1

RET

LEDB:CJNE A,#2,LEDC ORL P0,#03FH

CLR P0.2 RET

LEDC:CJNE A,#3,LEDD ORL P0,#03FH

CLR P0.3 RET

LEDD:CJNE A,#4,LEDE

ORL P0,#03FH

CLR P0.4 RET

LEDE:ORL P0,#03FH CLR P0.5 RET

;--------------定时中断程序-------------------- TO_INT0:MOV TL0,#(65536-4608) MOD 256

MOV TH0,#(65536-4608)/256 PUSH ACC PUSH PSW PUSH DPL PUSH DPH

LCALL DISPLAY INC

TIMER_COUNT

;秒表程序

;保护现场

;重新赋初值

JNB STOP,CNT MOV

A,TIMER_COUNT

MOV B,#2 DIV AB MOV A,B JNZ CNT INC XS_MEM MOV A,XS_MEM CJNE A,#100,CNT MOV XS_MEM,#0 INC TS_MEM

;时钟运行

CNT:MOV A,TIMER_COUNT

CJNE A,#100,EXIT0 MOV

TIMER_COUNT,#0

CPL FLASH_FLAG

JNB FLASH_FLAG,EXIT0 INC

S_MEM A,S_MEM

MOV

CJNE A,#60,EXIT0 MOV INC

S_MEM,#0 M_MEM A,M_MEM

MOV

CJNE A,#60,EXIT0 MOV INC

M_MEM,#0 H_MEM A,H_MEM

MOV

CJNE A,#24,EXIT0 MOV

H_MEM,#0

EXIT0: POP DPH

POP POP POP RETI

DPL PSW ACC

;--------扫描显示程序-------- DISPLAY:MOV

MOV ADD

A,SCAN_COUNT A,ACC

ANL

P1,#00001111B P1,A

;不改变P1低4位

MOV ADD

P2,#11111111B A,SCAN_COUNT A,ACC

DPTR,#LED_SCAN_TABLE

;消鬼影

MOV

MOVC A,@A+DPTR

ORL

INC A

MOVC A,@A+DPTR ;读取第二字节地址

MOV MOV R0,A A,@R0 ;间接寻址读取缓冲区的显示内容

LED1的内容传给P2

MOV P2,A

INC SCAN_COUNT

MOV

A,SCAN_COUNT

CJNE A,#4,DISPLAY1

MOV SCAN_COUNT,#0

DISPLAY1: RET

;-----------BCD码转换程序-------------- CONVERT_BCD:

MOV A,MODE_REG CJNE A,#0,C_BCD1

LJMP M0_DISP

C_BCD1:CJNE A,#1,C_BCD2 LJMP M1_DISP C_BCD2:CJNE A,#2,C_BCD3 LJMP M2_DISP C_BCD3:CJNE A,#3,C_BCD4 LJMP M3_DISP

C_BCD4:CJNE A,#4,C_BCD5 LJMP M4_DISP C_BCD5:LJMP M5_DISP

M0_DISP:JB CHANGE,M01_DISP MOV R3,M_MEM

;4位显示

;闹铃小时闪烁

;闹铃分钟闪烁

;秒表显示

;显示判断

MOV R2,#0

LCALL BTID

MOV A,R6 ANL A,#0FH

MOV DPTR,#LED_CODE MOVC A,@A+DPTR MOV LED1,A MOV A,R6 ANL A,#0F0H SWAP A

MOVC A,@A+DPTR MOV LED2,A

MOV R3,H_MEM MOV R2,#0 LCALL BTID

MOV A,R6

ANL A,#0FH

MOVC A,@A+DPTR

JNB FLASH_FLAG,BCD1

CLR ACC.7

BCD1:MOV LED3,A MOV A,R6 ANL A,#0F0H SWAP A

MOVC A,@A+DPTR MOV LED4,A

M01_DISP:

MOV R3,S_MEM

RET

MOV R2,#0

LCALL BTID MOV A,R6 ANL A,#0FH

MOV DPTR,#LED_CODE MOVC A,@A+DPTR MOV LED1,A MOV A,R6 ANL A,#0F0H SWAP A

MOVC A,@A+DPTR MOV LED2,A

MOV R3,M_MEM

MOV R2,#0 LCALL BTID

MOV A,R6

ANL A,#0FH

MOVC A,@A+DPTR

CLR ACC.7

MOV LED3,A

MOV A,R6 ANL A,#0F0H SWAP A

MOVC A,@A+DPTR MOV LED4,A

M1_DISP:MOV R3,M_MEM MOV R2,#0 LCALL BTID MOV A,R6 ANL A,#0FH

RET

MOV DPTR,#LED_CODE MOVC A,@A+DPTR MOV LED1,A MOV A,R6 ANL A,#0F0H SWAP A

MOVC A,@A+DPTR MOV LED2,A

JNB FLASH_FLAG,LOOP1 MOV R3,H_MEM

MOV R2,#0 LCALL BTID

MOV A,R6

ANL A,#0FH

MOVC A,@A+DPTR CLR ACC.7

MOV LED3,A MOV A,R6 ANL A,#0F0H SWAP A

MOVC A,@A+DPTR MOV LED4,A

RET

LOOP1: MOV LED4,#0FFH

M2_DISP:JNB FLASH_FLAG,LOOP2 MOV R3,M_MEM MOV R2,#0 LCALL BTID

MOV LED3,#0FFH RET

MOV A,R6 ANL A,#0FH

MOV DPTR,#LED_CODE MOVC A,@A+DPTR MOV LED1,A MOV A,R6 ANL A,#0F0H SWAP A

MOVC A,@A+DPTR MOV LED2,A

LJMP CON

LOOP2: MOV LED2,#0FFH

MOV LED1,#0FFH

CON: MOV R3,H_MEM MOV R2,#0

LCALL BTID

MOV A,R6 ANL A,#0FH

MOVC A,@A+DPTR

CLR ACC.7

MOV LED3,A

MOV A,R6 ANL A,#0F0H SWAP A

MOVC A,@A+DPTR MOV LED4,A RET

M3_DISP:MOV R3,M_ARM MOV R2,#0 LCALL BTID

MOV A,R6 ANL A,#0FH

MOV DPTR,#LED_CODE MOVC A,@A+DPTR MOV LED1,A MOV A,R6 ANL A,#0F0H SWAP A

MOVC A,@A+DPTR MOV LED2,A

JNB FLASH_FLAG,LOOP3 MOV R3,H_ARM

MOV R2,#0 LCALL BTID

MOV A,R6

ANL A,#0FH

MOVC A,@A+DPTR CLR ACC.7

MOV LED3,A MOV A,R6 ANL A,#0F0H SWAP A

MOVC A,@A+DPTR MOV LED4,A

RET

LOOP3: MOV LED4,#0FFH

M4_DISP:JNB FLASH_FLAG,LOOP4 MOV R3,M_ARM

MOV LED3,#0FFH RET

MOV R2,#0 LCALL BTID MOV A,R6 ANL A,#0FH

MOV DPTR,#LED_CODE MOVC A,@A+DPTR MOV LED1,A MOV A,R6 ANL A,#0F0H SWAP A

MOVC A,@A+DPTR MOV LED2,A

LJMP CON1

LOOP4: MOV LED2,#0FFH

MOV LED1,#0FFH

CON1: MOV R3,H_ARM MOV R2,#0

LCALL BTID

MOV A,R6 ANL A,#0FH

MOVC A,@A+DPTR

CLR ACC.7

MOV LED3,A

MOV A,R6 ANL A,#0F0H SWAP A

MOVC A,@A+DPTR MOV LED4,A RET

M5_DISP:MOV R3,XS_MEM

MOV R2,#0 LCALL BTID MOV A,R6 ANL A,#0FH

MOV DPTR,#LED_CODE MOVC A,@A+DPTR MOV LED1,A MOV A,R6 ANL A,#0F0H SWAP A

MOVC A,@A+DPTR MOV LED2,A

MOV R3,TS_MEM

MOV R2,#0 LCALL BTID

MOV A,R6

ANL A,#0FH

MOVC A,@A+DPTR

CLR ACC.7

MOV LED3,A

MOV A,R6 ANL A,#0F0H SWAP A

MOVC A,@A+DPTR MOV LED4,A

;-------二翻十,拆字,转码程序------------- BTID: CLR A MOV R4,A MOV R5,A

RET

MOV R6,A MOV R7,#16 IBTL: CLR C MOV A,R3 RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A MOV A,R6 ADDC A,R6 DA A MOV R6,A MOV A,R5 ADDC A,R5 DA A MOV R5,A MOV A,R4 ADDC A,R4 DA A MOV R4,A DJNZ R7,IBTL RET

;返回到主程序,等待下一个5ms

;------------------按键声程序------------------- RING:CLR P1.2 MOV R6,#10 D10: MOV R5,#10 D1: MOV R4,#249 DL1:DJNZ R4,DL1

DJNZ R5,D1 DJNZ R6,D10 SETB P1.2 RET

;-----------------延时程序----------------------- D10ms: MOV R5,#10

D1ms:MOV R4,#249

DL:DJNZ R4,DL NOP NOP

DJNZ R5,D1ms SETB P1.2 RET

;-----------------清除内存子程序--------------- CLR_MEM:MOV CLR_MEM1:

MOV INC

R0

@R0,#0 R0,#40H

;从40H单元开始至7FH单元

CJNE R0,#80H,CLR_MEM1 RET

;--------------------TABLE---------------------- LED_CODE:

DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H

DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH

LED_SCAN_TABLE:

DB 01110000B,LED1

DB 10110000B,LED2 DB 11010000B,LED3 DB 11100000B,LED4

END

5. 设计过程问题总结

电子钟的设计贯穿了一整个学期。在设计的过程中,遇到了各种各样的问题,这些问题通过思考和与同学之间的讨论,最终得到了解决。以下是设计个性化电子钟过程中遇到的重要问题和解决方法。

1) 秒单元加到60后,数码管显示“0256”

在设计电子钟的初期阶段,遇到了电子钟秒单元加到60后,数码管显示0256,然后继续加1。这是因为当时将秒单元和分单元用一个二翻十程序进行转换,当秒单元为60时,秒清零,分加1,则下一次二翻十的结果就是0100H的十进制数,即256。

解决方法:在老师还未讲解此问题时,我将双字节二翻十程序修改成单字节二翻十程序,并成功在扫描显示程序中将秒单元和分开调用单字节二翻十并在同一个显示程序中显示。此次设计利用的是老师讲解的方法,将秒单元和分单元分开显示,在调用二翻十程序时将高字节清零。

2) 调时模式下,调时按键按下时,相应的单元停止闪烁

出现这个问题的原因是在按键按下时,单片机执行按键功能程序,此时扫描程序被中断,数码管就会出现停止闪烁或灭掉的情况。

解决方法:在按键功能程序中,执行完按键功能后,先调用扫描显示程序,COVERT_BCD,

再判断按键有无释放。

3) 按键音问题

在编写按键音程序的时候,一开始使用的是按键按下将P1.2置0,松开按键将其置1的方法。而如果使用这种方法,在按键一直按着的情况下蜂鸣器就会一直响,不方便使用。

解决方法:一开始使用的方法是利用防抖动程序中的延时,将蜂鸣器置0之后延时再置1。但因为防抖动的时间是10MS,按键音时间过短而且很微弱,在存在按键抖动时还会发出两次响声。最后使用的方法是再编一个程序,将蜂鸣器置0,延时100MS后再置1,在按键防抖动程序之后再调用此按键音程序。这样就不会被去抖动程序干扰。

4) 闹铃开关问题

因为闹铃程序的变量初始是0,和时钟的变量是一样的,如果不设开关,那么一开机闹铃就会开启。所以在编写了闹铃程序后,就存在一个开关的问题:假如用一个标志位控制闹铃变量的判断,按下某个按键将其取反,那么在闹铃还没开启时,可以将标志位取反使闹铃开启。但闹铃开启后是将P1.2置0,取反标志位只是不再判断闹铃变量是否与时钟变量相等,而不会改变P1.2的值,即闹铃会一直响。

解决方法:如果在取反按键中加上CPL P1.2这条语句,会影响闹铃的正常运行。最终的解决方法是在取反标志位的前面加上SETB P1.2这条语句,这样不管开启还是关闭闹铃,都不会和闹铃程序有冲突,并且能够控制闹铃声。

5) 秒表时间与时钟运行时间冲突的问题

在设计秒表时,是和时钟运行共用同一个定时器计时。如果过秒表和时钟运行程序使用同一个秒单元,虽然能够正常计时,但秒表的使用就会影响时钟的正常运行。

解决方法:定义一个秒表的秒单元变量TS_MEM,此变量不受TIMER_COUNT控制,只有当XS_MEM为100时才会加1。这样秒表的时间就不会和时钟运行时间冲突。

6) 复位按钮不能使用的问题

在设计好程序之后,我发现复位按钮按下并不会改变电子钟的数值。复位按钮的作用是使单片机进入初始化状态,让程序从头开始执行,但不会改变变量的值。因此必须在程序的开头清除内存。

解决方法:在主程序的开始部分,调用用于清除内存的子程序,将40H到7FH单元的内容全部清零。

6. 数据测试和误差校准

6.1 数据测试和误差分析

经测定,10小时后电子钟比实际时间慢57.5秒。虽然记数初值是按照电子钟的晶振频率来计算的,但在程序处理过程中。中断服务执行的结果要显示到数码管上是存在时差的,对于误差存在的原因,我认为有以下几点:

1) 电子钟的晶振频率为11.0592MHZ,计算计数初值的结果只是精确到个位,并不是准确值。

2) 程序指令的执行需要时间,中断服务程序、扫描显示程序和BCD码转换程序的执行都可能影响时间的准确度。 3) 手动测试数据的时候会存在误差。

6.2 数据校准

由于10小时慢了57.5秒,则每秒慢了57.5/36000=1.5972ms。

每次中断的时间为5ms,200次中断为1秒,则每次中断慢了1.5972/200=0.007986ms 计数初值的公式中N的理论值为5ms/(12/11.0592)us=4608

则实际值N=(5-0.007986)ms/(12/11.0592)us=4601,所以应将N改为4601 以下是校准前后测试10小时误差对比

测试时间 校准前 校准后

电子钟实际时间 10:00:00 10:00:00 手机秒表显示时间 10:00:57.5

7. 心得体会与建议

7.1 心得体会

在本次课程设计的过程中,我遇到了很多困难,有些困难还花费了我大量的时间,所幸这些问题最后都得到了解决,并且在问题解决后,我得到了巨大的成就感。我很庆幸自己学习了单片机这门课程,让我发现了编程的乐趣,从而确定了人生的方向。这次课程设计,真的让我学会了很多。我觉得做设计的意义不在于你做出了什么,而在于学到了多少。每次问题的解决,都让我对单片机有了更深的了解,都为下次问题的解决提供了很好的思路。虽然一开始做起来会困难重重,而随着对变成技术的提高,到后面就越做越轻松,并且越能感受到编程的乐趣。这门课对于我来说,是一个受益终生的,宝贵的财富。

7.2 建议

关于对这门课的建议,我希望老师可以多提供几个课程设计的题目选择,并且每一个都能有具体要求。因为这样就不会使每个学生做出来的都千篇一律,能让学生更加自由地发挥。而且虽然有些同学想做做不一样的题目,但因为对于单片机了解还不是很深所以就无从选择了。我在做课程设计的时候,虽然想做很多创新的东西,但是因为当时买的开发板功能太少,很多东西都做不出来,只能放弃了。所以也希望老师能够给我们推荐一个功

能齐全的开发板,让我们能够作更多的创新。

参考文献

【1】 李全利主编.《单片机原理与接口技术》.第2版. 高等教育出版社,2009年1月 【2】 李丽荣、张常全、郑建红主编.《51单片机应用设计》.北京理工大学出版社,2012

年 8月

【3】 郑锋、王巧芝、李英健、刘瑞国编著.二

版.中国铁道出版社,2011年7月

51单片机应用系统典型模块开发大全》.第

能齐全的开发板,让我们能够作更多的创新。

参考文献

【1】 李全利主编.《单片机原理与接口技术》.第2版. 高等教育出版社,2009年1月 【2】 李丽荣、张常全、郑建红主编.《51单片机应用设计》.北京理工大学出版社,2012

年 8月

【3】 郑锋、王巧芝、李英健、刘瑞国编著.二

版.中国铁道出版社,2011年7月

51单片机应用系统典型模块开发大全》.第

本文来源:https://www.bwwdw.com/article/sxs6.html

Top