基于单片机的数字电子钟
序列号
论文题目: 基于单片机的数字电子钟
课程名称: 单片机原理机接口技术
LKH 1/21/2015 1
基于单片机的数字电子钟
目录1
1.
2.
3.
4.
5.
6.
7.
8.
9.
LKH 1/21/2015 2
基于单片机的数字电子钟
目录2
目录1 .............................................................................................................................................. 2
目录2 .............................................................................................................................................. 3
一、 课程设计任务书 ...................................................................................................... 4
1) 基本要求 .................................................................................................................. 4
2) 设计报告要求: ...................................................................................................... 4
3) 课程设计验收标准: .............................................................................................. 5
二、 个性化电子钟功能描述 .......................................................................................... 5
1. 基本计时功能: ...................................................................................................... 5
2. 校准功能 .................................................................................................................. 5
3. 闹钟模式 .................................................................................................................. 6
三、 单片机系统原理图及工作原理描述 ...................................................................... 6
1. 各模块介绍 .............................................................................................................. 6
2. 单片机系统总图 ...................................................................................................... 9
四、 程序模块框图 .......................................................................................................... 9
1. 功能框图 .................................................................................................................. 9
2. 程序框图 ................................................................................................................ 10
五、 程序清单 ................................................................................................................ 11
;变量定义....................................................................................................................... 11
;初始化 .......................................................................................................................... 12
;主要执行程序 ............................................................................................................... 12
;按键P3.7检测程序 ..................................................................................................... 13
;显示模式选择程序 ....................................................................................................... 13
; 中断服务程序 ............................................................................................................. 14
;闹钟显示及转码程序 ................................................................................................... 16
;检测闹钟程序 ............................................................................................................... 18
; 显示时分秒程序 ......................................................................................................... 18
; 显示年月日的程序 ..................................................................................................... 22
;年月日校准程序 ........................................................................................................... 26
;按键检测程序 ............................................................................................................... 28
;功能小程序................................................................................................................... 34
六、 设计或调试过程中碰到的问题及解决方法 ........................................................ 37
1. 存储错乱 ................................................................................................................ 37
2. 工作区的选择 ........................................................................................................ 38
3. 闹钟响的时间 ........................................................................................................ 38
4. 按键紊乱 ................................................................................................................ 39
七、 测试数据,误差分析,补偿方法,补偿前后精度比较 .................................... 39
a) 未考虑月份不同天数 ............................................................................................ 39
b) 中断服务程序造成的时间延迟 ............................................................................ 39
八、 收获及意见 ............................................................................................................ 40
九、 附录(完整电路图) ............................................................................................ 40
LKH 1/21/2015 3
基于单片机的数字电子钟
一、 课程设计任务书
1) 基本要求
根据《单片机原理及接口技术》所学的内容及其他相关课程的知识,结合各生的基础,充分发挥个人的特长,设计个性化数字电子钟。具体要求以下:
1. 基本电路
AT89S51CPU,12MHZ时钟,常规上电和手动复位电路。
2. 数码管显示模式
4位LED数码显示器(带钟点),分别显示“小时:分钟”或“分钟:秒”
3. 独立按键
3个独立试按键,具体功能描述如下:
[MODE]——模式转换键,具有“正常——小时(校准)——分钟(校准)——小时(闹铃)——分钟(闹铃)”等5种模式,每按一次,转换一种模式。假设当前处于正常模式,按一下此键,“小时”闪烁,表示进入“小时”调校模式,再按一次,转入分钟模式,如此类推,正常模式下不闪烁。
[UP]——加“1”键,按下此键,被选中的项目加“1”
[DOWN]——减“1”键,按下此键,被选中的项目减“1”
4. 蜂鸣器
设计1路蜂鸣器输出驱动电路,用于报警或按键声
5. 电源电路
电源:9V交流输入,全波整流,滤波,7805稳压电路,输出5V直
流电源共给单片机系统。
6. 软件
编写数字电字钟的所有软件,包括主程序,定时器中断计时程序,
定时器中断扫描显示程序,键盘扫描及功能程序,BCD码转换程序,“二翻十﹑拆字﹑转码”程序,闹铃程序等等。将这些程序整合成一个完整的电子钟程序,在软件模拟器上调试,在MCS51学习机上调试,并测试其功能及性能。在设计软件时,学生可充分发挥自己的特长和想象力,自行扩充功能,如“秒表”功能,通信功能,钟控功能等。
7. 精度分析
在程序调试通过后,测试计时精度,分析误差来源,提出补偿方法。
2) 设计报告要求:
每人一份设计报告,要求独立完成,用统一的封面装订,设计报告的内容包括以下部分:
1. 设计任务书
2. 个性化电子钟功能要求
3. 单片机系统原理图及工作原理描述
4. 程序模块框图
5. 程序清单
6. 设计或调试过程中碰到的问题及决计方法
7. 测试数据,误差分析,补偿方法,补偿前后精度比较
8. 完成课程设计后的收获或体会,对《单片机课程设计》提出改进意见。 LKH 1/21/2015 4
基于单片机的数字电子钟
3) 课程设计验收标准:
本次课程设计的成绩由3大部分组成:即硬件设计﹑软件设计和课程
设计报告。硬件设计主要是电路图设计(可以用手工画或计算机辅助设计)。软件部分在答辩时验收,并结合答辩情况进行评定。
1. 电路原理图设计(20%),
包括以下知识点:
CPU及时钟,复位电路
显示接口电路
键盘接口电路
蜂鸣器驱动电路
电源部分
2. 软件设计及答辩(60%),包括以下知识点:
主程序及初始化程序
定时中断及计时程序
定时中断及显示程序
键盘程序
闹铃程序
按键声程序
3. 课程设计报告(20%),具体要求见上面所述.
4) 基础较好的学生可以结合实际应用自拟题目,题目和具体设计内容定好后
由指导老师比准。
指导老师:乐金松 2014,12,28
二、 个性化电子钟功能描述
1. 基本计时功能:
①. 上电显示时钟、分钟、秒,时钟和分钟显示小数点以做区分
②. 当P3.7键按下,显示年月日,因为比较方便观察,并没有设置小数点以
作区分。
2. 校准功能
①. 上电显示为时分秒或年月日
②. 当P3.4按下一次,校准时钟位,时钟位闪烁
③. 当P3.4按下两次,校准分钟位,分钟位闪烁
④. 当P3.4按下三次,校准秒位,秒位闪烁,注意,此时若是显示年月日模
式,调整无效,数码管熄灭
⑤. 当P3.4按下四次,校准年的高位,年的高位闪烁
⑥. 当P3.4按下五次,校准年的低位,年的低位闪烁
⑦. 当P3.4按下六次,校准月份位,月份位闪烁
⑧. 当P3.4按下七次,校准日位,日位闪烁,此时若是显示时分秒模式,调
整无效,数码管熄灭,其中,若P3.5键按下,加1,若P3.6键按下,减1
LKH 1/21/2015 5
基于单片机的数字电子钟
⑨. 当P3.4按下八次或九次,为闹钟校准模式
⑩. 当P3.4按到十次,恢复显示年月日或者时分秒
3. 闹钟模式
①. 当P3.4按到八次,时钟和分钟位显示初始时间(12:00),设置小时闹
钟。若P3.5键按下,加1,若P3.6键按下,减1
②. 当P3.4按到九次,设置分钟闹钟,若P3.5键按下,加1,若P3.6键按
下,减1
③. 即使没有设置闹钟,在时间为12:00时,也会启动闹钟,闹钟声音为
十次简短的鸣声。
三、 单片机系统原理图及工作原理描述
1. 各模块介绍
a) CPU及时钟,复位电路
i. 复位电路
功能描述:上电时,单片机会自动复位,按下S1按键时,手动复位,
该电子钟系统会从0开始计时。
ii. 时钟
此电路系统配置的是12MHZ的晶振,拥有这个晶振,电路才会计时、
中断系统才会溢出。
LKH 1/21/2015 6
基于单片机的数字电子钟
iii.
CPU
此电子钟系统采用的是STC公司的89C52单片机,本电路主要使用其P0口(数码管)、P3口(按键)、和P1口(蜂鸣器),该单片机内部含有运算器、存储器、控制器、输入输出设备等。
b) 显示接口电路
LKH 1/21/2015 7
基于单片机的数字电子钟
这个开发板需要两个锁存器分别控制位选和断选,只有位选控制端置一,才能送位选信号,同理,断选控制端置一,才能送段选信号。 c) 键盘接口电路
d) 蜂鸣器驱动电路
此按键,按下为0,松开为1。
LKH 1/21/2015 8
基于单片机的数字电子钟
蜂鸣器送逻辑1的时候才能发出声音。
e) 电源部分
此电源用LM317芯片进行整流,进行滤波和稳压后,通过调节电位器,可以把输入的9V电压转变成5V的电压。
2. 单片机系统总图
(详见附录)
四、 程序模块框图
1. 功能框图
LKH 1/21/2015 9
基于单片机的数字电子钟
基于单片机的数字电子钟
五、 程序清单
;变量定义
LED1 EQU 7FH
LED2 EQU 7EH
LED3 EQU 7DH
LED4 EQU 7CH
LED5 EQU 7BH
LED6 EQU 7AH
LED1_2 EQU 6CH
LED2_2 EQU 6BH
LED3_2 EQU 6AH
LED4_2 EQU 69H
LED5_2 EQU 68H
LED6_2 EQU 67H
LED7_2 EQU 66H
LED8_2 EQU 65H
SCAN_COUNT2 EQU 64H
MODE2 EQU 60H
SCAN_COUNT3 EQU 5FH
SCAN_COUNT4 EQU 5EH
LED1_CLOCK_HOUR EQU 5DH
LED2_CLOCK_HOUR EQU 5CH
LED1_CLOCK_MIN EQU 5BH
LED2_CLOCK_MIN EQU 5AH
H_MEM_CLOCK EQU 59H
M_MEM_CLOCK EQU 58H
SCAN_COUNT5 EQU 57H
SCAN_COUNT EQU 77H ;扫描显示计数器
TEMP1 EQU 76H
TEMP2 EQU 75H
TEMP3 EQU 74H
H_MEM EQU 73H
M_MEM EQU 72H
S_MEM EQU 71H
D_MEM EQU 6DH
MON_MEM EQU 63H
Y_MEM_1 EQU 62H
Y_MEM_2 EQU 61H
MODE_REG EQU 6FH
TIMER_COUNT EQU 6EH ;定时器中断次数软件计数器 LKH 1/21/2015 11
基于单片机的数字电子钟
MODE EQU 70H
TEMP4 EQU 20H.1
;TEMP4 EQU 6CH
FLASH_FLAG EQU 20H.0 ;定义闪烁标志位
CLOCK_FLAG EQU 20H.2
;初始化
ORG 0000H
LJMP MAIN
ORG 0003H ;外部中断0的标志
RETI ;中断标志
ORG 000BH ;定时器中断0的标志
LJMP T0_INT
ORG 0013H ;外部中断1
RETI
;-------------------------------------------------------------
ORG 0030H ;好像一般都有这一句
MAIN:
MOV SP,#2FH
MOV TL0,#(65536-4608)MOD 256 ;MOD是取余数,初始化时间常数
MOV TH0,#(65536-4608)/256
MOV TMOD,#00000001B ;G=0,C/T取T(定时器),模式为模式1(16位定时器或计数器方式)
SETB ET0 ;T0(定时器0中断)中断允许
SETB TR0 ;定时器0控制位,置1 SETB EA ;CPU中断允许总开关
LCALL CLR_MEM
MOV MON_MEM,#1
MOV D_MEM,#1
;------------
MOV H_MEM_CLOCK,#12
CLR P1.4
;主要执行程序
;---------------------------------------------------------------
WAIT:
;LCALL CLOCK_CHOOSE
;LCALL DELAY_1S
LCALL KEY4_SCAN
LCALL CHOOSE
LCALL CHECK_TIME
SJMP WAIT
LKH 1/21/2015 12
基于单片机的数字电子钟
;按键P3.7检测程序
;------------------显示模式的选择程序--------------------------------
;------------------等待按键按下---------------------------
KEY4_SCAN:
NOKEY_4:
MOV C,P3.7
CPL C
JNC GATE4;CY为0跳转,没有按键,执行display程序 MOV C,P3.7
MOV TEMP4,C
LCALL DELAY_10MS
MOV C,P3.7
ORL C,TEMP4
JNC K4 ;按下跳转 ;没按下,返回
GATE4: RET
K4:
LCALL SOUND
INC MODE2
MOV A,MODE2
CJNE A,#2,K41 ;mode只能为0或者1 mode为1执行display2程序
MOV MODE2,#0
K41: JNB P3.7,$
RET
;显示模式选择程序
;----------无论如何都要选择一个模式-------------------------
CHOOSE:
MOV A,MODE2
CJNE A,#0,NOT_CLOCK0; MODE2为1,判断是模式8还是模式9
MOV A,MODE ;MODE2为0, 判断是否为8或者9 CJNE A,#8,NOT_CLOCK3;MODE2=0的情况下,不为模式8,判断是否为模式9
LCALL CONVERT_BCD3;为模式8,调用display——clock程序 LCALL CLOCK_DISPLAY ;为模式8
RET
NOT_CLOCK3:
CJNE A,#9,NOT_CLOCK4;判断是否为模式9
LCALL CONVERT_BCD3
LJMP CLOCK_DISPLAY
RET
NOT_CLOCK4:
LCALL CONVERT_BCD1 ;不为模式9,调用显示程序1 LCALL CHOOSE_DISPLAY1
LKH 1/21/2015 13
基于单片机的数字电子钟
RET
NOT_CLOCK0:
MOV A,MODE
CJNE A,#8,NOT_CLOCK1 ;MODE2为1时,不为模式8,判断是否为模式9
LCALL CONVERT_BCD3;为模式8,调用display——clock程序 LCALL CLOCK_DISPLAY
RET
NOT_CLOCK1:
CJNE A,#9,NOT_CLOCK2 ;不为模式9,显示mode2=0下的display程序
LCALL CONVERT_BCD3 ;为模式9,调用clockdisplay程序 LCALL CLOCK_DISPLAY
RET
NOT_CLOCK2:
LCALL CONVERT_BCD2; 此时为mode2模式为1的,选择闪烁模式,对DISPLAY程序经行选择
LCALL CHOOSE_DISPLAY2;模式0,display程序
RET
;-----------显示模式选择函数-----------------------
CHOOSE_DISPLAY1:
MOV A,MODE
CJNE A,#0,CH_1
LCALL DISPLAY1 ;模式为0,调用正常的显示程序
RET
CH_1:
LCALL DISPLAY1_2
RET
CHOOSE_DISPLAY2:
MOV A,MODE
CJNE A,#0,CH_2
LCALL DISPLAY2 ;模式为0,调用正常的显示程序
RET
CH_2:
LCALL DISPLAY2_2
RET
; 中断服务程序
;------------------------中断服务程序-------------------------------------
T0_INT:
PUSH ACC ;保护现场开始,保护A累加器
PUSH PSW ;保护程序状态字存储器
LKH 1/21/2015 14
基于单片机的数字电子钟
PUSH PUSH SETB MOV MOV LCALL INC MOV CJNE TO_INT1
MOV CPL 反闪烁标志位 ;CPL ; LCALL 位取反
JNB
INC MOV CJNE MOV
INC MOV CJNE MOV
INC MOV CJNE MOV
INC MOV CJNE MOV INC MOV CJNE MOV
INC
LKH DPL ;数据地址指针(低8位) DPH RS1 ;选择2区工作存储单元 TL0,#(65536-5000)MOD 256 ;恢复时间常数 TH0,#(65536-5000)/256 KEY_SCAN TIMER_COUNT A,TIMER_COUNT A,#100,T0_INT1 ;如果A不等于100,跳到 TIMER_COUNT,#0 FLASH_FLAG ;每5MS*100=500MS取 P1.4 FLASH ;CPL:Converse Position Logical FLASH_FLAG,T0_INT1 ;为0跳到TO_INT1 S_MEM A,S_MEM A,#60,T0_INT1 ;秒位 S_MEM,#0 M_MEM A,M_MEM A,#60,T0_INT1 ;分位 M_MEM,#0 A,H_MEM A,#24,T0_INT1 H_MEM,#0 ;时位 D_MEM A,D_MEM A,#32,T0_INT1 D_MEM,#1 ;天 MON_MEM A,MON_MEM A,#13,T0_INT1 MON_MEM,#1 ;月 Y_MEM_1 1/21/2015 15 H_MEM
基于单片机的数字电子钟
MOV A,Y_MEM_1
CJNE A,#100,T0_INT1
MOV Y_MEM_1,#0 ;低位年
INC Y_MEM_2
MOV A,Y_MEM_2
CJNE A,#100,T0_INT1
MOV Y_MEM_2,#0 ;高位年
T0_INT1:
POP DPH
POP DPL
POP PSW
POP ACC
RETI ;出栈
;闹钟显示及转码程序
;闹钟显示程序
;--------------------------时钟的显示函数---------------------------------
CLOCK_DISPLAY:
;SETB CLOCK_FLASH
MOV P0,#11111111B
SETB P2.7
NOP
NOP
CPL P2.7
MOV A,SCAN_COUNT5
ADD A,ACC
MOV R1,A
LCALL FLASH3 ;在flash函数中选择调用哪个表 ;MOV DPTR,#LED_SCAN_TABLE
MOV A,R1
MOVC A,@A+DPTR
SETB P2.7 ;位锁存
MOV P0,A
CLR P2.7
MOV A,SCAN_COUNT5
ADD A,ACC
INC A
MOVC A,@A+DPTR
MOV R0,A
MOV A,@R0
SETB P2.6
LKH 1/21/2015 16
基于单片机的数字电子钟
MOV P0,A
;LCALL DELAY_1S ;调试用
CLR P2.6 ;DB
3FH,06H,5BH,04FH,66H,6DH,7DH,07H
;DB
7FH,6FH,77H,7CH,39H,5EH,79H,71H,0FFH
INC SCAN_COUNT5
MOV A,SCAN_COUNT5
CJNE A,#4,DONE5
MOV SCAN_COUNT5,#0
DONE5:
RET
;闹钟闪烁及模式选择程序
;----------------时钟闪烁模式选择程序----------------------------
FLASH3:
JNB FLASH_FLAG,F31 ;若标志位位为0,显示闪烁程序,否则显示正常模式
;LCALL LIGHT_OFF
LJMP FLASH3
F31: MOV A,MODE
CJNE A,#8,F32
LJMP H_F_CLOCK;模式8,校准小时
F32: ;CJNE A,#0,F34;模式为0,则返回?
LJMP M_F_CLOCK;模式9,校准分钟
F34: RET ;
;----------------闪烁程序--------------------------
H_F_CLOCK:
MOV DPTR,#LED_SCAN_TABLE_CLOCK_1
RET
M_F_CLOCK:
MOV DPTR,#LED_SCAN_TABLE_CLOCK_2
RET
;闹钟BCD转码程序
;-----------------------为闹钟做BCD转码----------------
CONVERT_BCD3:
;第一个数码管
MOV R3,H_MEM_CLOCK
MOV R2,#0
LCALL BTID
MOV A,R6
ANL A,#0FH ;保留低四位
LKH 1/21/2015 17
基于单片机的数字电子钟
MOV DPTR,#LED_CODE
MOVC A,@A+DPTR
MOV LED1_CLOCK_HOUR,A
;第二个数码管
MOV A,R6
ANL A,#0F0H ;保留高四位
SWAP A
MOV DPTR,#LED_CODE
MOVC A,@A+DPTR
MOV LED2_CLOCK_HOUR,A
;第三个数码管
MOV R3,M_MEM_CLOCK
MOV R2,#0
LCALL BTID
MOV A,R6
ANL A,#0FH
MOV DPTR,#LED_CODE
MOVC A,@A+DPTR
MOV LED1_CLOCK_MIN,A
;第四个数码管
MOV A,R6
ANL A,#0F0H
SWAP A
;MOV DPTR,#LED_CODE
MOVC A,@A+DPTR
MOV LED2_CLOCK_MIN,A
RET
;检测闹钟程序
;----------------------检测是否到达闹钟时间---------------------------------
CHECK_TIME:
MOV A,H_MEM_CLOCK
CJNE A,H_MEM,OVER2
CHECK_NEXT:
MOV A,M_MEM_CLOCK
CJNE A,M_MEM,OVER2
MOV A,S_MEM;为了防止整一分钟都会叫,只在一秒的时候判断一次
CJNE A,#0,OVER2
LCALL CLOCK_SOUND
RET
OVER2:
RET
; 显示时分秒程序
;时分秒显示程序
LKH 1/21/2015 18
基于单片机的数字电子钟
;------------------------显示时分秒程序--------------------------------------
DISPLAY1:
MOV P0,#11111111B
SETB P2.7
NOP
NOP
;MOV P0,#0FFH
CPL P2.7
MOV A,SCAN_COUNT ;之前定义过:SCAN_COUNT EQU 7BH
ADD A,ACC
MOV DPTR,#LED_SCAN_TABLE
MOVC A,@A+DPTR
SETB P2.7 ;位锁存
MOV P0,A
CLR P2.7
MOV A,SCAN_COUNT
ADD A,ACC
INC A
MOVC A,@A+DPTR
MOV R0,A
MOV A,@R0
MOV R0,SCAN_COUNT
DOT: CJNE R0,#2,NOACT1
ACT: SETB P2.6
ORL A,#80H
MOV P0,A
SETB P0.7 ;调试用
CLR P2.6
SJMP GO_ON
NOACT1: CJNE R0,#4,NOACT2
SJMP ACT
NOACT2: SETB P2.6
MOV P0,A
CLR P2.6 ;DB
3FH,06H,5BH,04FH,66H,6DH,7DH,07H
;DB
7FH,6FH,77H,7CH,39H,5EH,79H,71H,0FFH
GO_ON: INC SCAN_COUNT
MOV A,SCAN_COUNT
CJNE A,#6,DONE
LKH 1/21/2015 19
基于单片机的数字电子钟
MOV SCAN_COUNT,#0
DONE:
RET
;时分秒BCD程序
;-----------------------------------------------------
CONVERT_BCD1:
;第一个数码管
MOV R3,S_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
MOV DPTR,#LED_CODE MOVC A,@A+DPTR
MOV LED2,A
;第三个数码管
MOV R3,M_MEM
MOV R2,#0
LCALL BTID
MOV A,R6
ANL A,#0FH
MOV DPTR,#LED_CODE MOVC A,@A+DPTR
MOV LED3,A
;第四个数码管
MOV A,R6
ANL A,#0F0H
SWAP A
;MOV DPTR,#LED_CODE MOVC A,@A+DPTR
MOV LED4,A
;第五个数码管
MOV R3,H_MEM
MOV R2,#0
LCALL BTID
LKH 1/21/2015 20
基于单片机的数字电子钟
MOV A,R6
ANL A,#0FH
MOV DPTR,#LED_CODE
MOVC A,@A+DPTR
MOV LED5,A
;第六个数码管
MOV A,R6
ANL A,#0F0H
SWAP A
MOVC A,@A+DPTR
MOV LED6,A
RET
;二翻十程序
;------------------二翻十程序----------------------------
BTID:
CLR A
MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,#16
IBTL:
CLR C
MOV A,R3
RLC A ;带进位循环左移,与LC指令的区别? MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R6
ADDC A,R6
DA A ;DA:十进制调整指令,将二进制结果 ;调整为十进制数
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4 ;在进行A+R4前,A的值是多少 DA A
LKH 1/21/2015 21
基于单片机的数字电子钟
MOV R4,A
DJNZ R7,IBTL ;减1为1跳转
RET
; 显示年月日的程序
;年月日显示程序
;-----------------显示年月日的程序-----------------
DISPLAY2:
MOV P0,#11111111B
SETB P2.7
NOP
NOP
;MOV P0,#0FFH
CPL P2.7
MOV A,SCAN_COUNT2 ;之前定义过:SCAN_COUNT EQU 7BH
ADD A,ACC
MOV DPTR,#LED_SCAN_TABLE2
MOVC A,@A+DPTR
SETB P2.7 ;位锁存
MOV P0,A
CLR P2.7
MOV A,SCAN_COUNT2
ADD A,ACC
INC A
MOVC A,@A+DPTR
MOV R0,A
MOV A,@R0
SETB P2.6
MOV P0,A
;LCALL DELAY_1S
CLR P2.6
INC SCAN_COUNT2
MOV A,SCAN_COUNT2
CJNE A,#8,DONE2
MOV SCAN_COUNT2,#0
DONE2:
RET
;年月日BCD转码程序
;--------------------------启用第二段转码程序------------------------
LKH 1/21/2015 22
基于单片机的数字电子钟
CONVERT_BCD2:
;第1_2个数码管
MOV R3,D_MEM
MOV R2,#0
LCALL BTID
MOV A,R6
ANL A,#0FH ;保留低四位 MOV DPTR,#LED_CODE
MOVC A,@A+DPTR
MOV LED1_2,A
;第2_2个数码管
MOV A,R6
ANL A,#0F0H ;保留高四位 SWAP A
MOV DPTR,#LED_CODE
MOVC A,@A+DPTR
MOV LED2_2,A
;第3_2个数码管
MOV R3,MON_MEM
MOV R2,#0
LCALL BTID
MOV A,R6
ANL A,#0FH
MOV DPTR,#LED_CODE
MOVC A,@A+DPTR
JNB FLASH_FLAG,MODE0_BCD1 到MODE0_BCD1
SETB ACC.7
MODE0_BCD1:
MOV LED3_2,A
;第4_2个数码管
MOV A,R6
ANL A,#0F0H
SWAP A
MOVC A,@A+DPTR
MOV LED4_2,A
;第5_2个数码管
MOV R3,Y_MEM_1
MOV R2,#0
LCALL BTID
MOV A,R6
ANL A,#0FH
MOV DPTR,#LED_CODE
LKH 1/21/2015 ;FLASH_FLAG为0跳23
基于单片机的数字电子钟
MOVC A,@A+DPTR
JNB FLASH_FLAG,MODE0_BCD2 ;FLASH_FLAG为0跳到MODE0_BCD1
SETB ACC.7
MODE0_BCD2:
MOV LED5_2,A
;第6_2个数码管
MOV A,R6
ANL A,#0F0H
SWAP A
MOVC A,@A+DPTR
MOV LED6_2,A
;第7_2个数码管
MOV R3,Y_MEM_2
MOV R2,#0
LCALL BTID
MOV A,R6
ANL A,#0FH
MOV DPTR,#LED_CODE
MOVC A,@A+DPTR
MOV LED7_2,A
;第8_2个数码管
MOV A,R6
ANL A,#0F0H
SWAP A
MOVC A,@A+DPTR
MOV LED8_2,A
RET
;显示时分秒校准程序
;时分秒校准显示程序
;-------------------第三个display函数,专门校准闪烁时用,节省内存------- DISPLAY1_2:
MOV P0,#11111111B
SETB P2.7
NOP
NOP
CPL P2.7
MOV A,SCAN_COUNT3 ;之前定义过:SCAN_COUNT EQU 7BH
ADD A,ACC
MOV R1,A
LCALL FLASH1 ;在flash函数中选择调用哪个表 ;MOV DPTR,#LED_SCAN_TABLE
MOV A,R1
LKH 1/21/2015 24
基于单片机的数字电子钟
MOVC A,@A+DPTR
SETB P2.7 ;位锁存
MOV P0,A
CLR P2.7
MOV A,SCAN_COUNT3
ADD A,ACC
INC A
MOVC A,@A+DPTR
MOV R0,A
MOV A,@R0
SETB P2.6
MOV P0,A
;LCALL DELAY_1S ;调试用
CLR P2.6 ;DB
3FH,06H,5BH,04FH,66H,6DH,7DH,07H
;DB
7FH,6FH,77H,7CH,39H,5EH,79H,71H,0FFH
INC SCAN_COUNT3
MOV A,SCAN_COUNT3
CJNE A,#2,DONE3
MOV SCAN_COUNT3,#0
DONE3:
RET
;时分秒闪烁模式选择程序
;-----------判断闪烁模式--------------------------------------
;----------------时分秒闪烁模式选择程序----------------------------
FLASH1:
JNB FLASH_FLAG,F1 ;若标志位位为0,显示闪烁程序,否则显示正常模式
;LCALL LIGHT_OFF
SJMP FLASH1
F1: MOV A,MODE
CJNE A,#1,F2
LJMP H_F;模式1,校准小时
F2:
CJNE A,#2,F7
LJMP M_F;模式2,校准分钟
F7: CJNE A,#3,F8;如果不等于3,也应该正常显示
LJMP S_F ;模式3,校准秒数
F8: CJNE A,#0,F10;如果变回模式0
LKH 1/21/2015 25
基于单片机的数字电子钟
RET
F10:; SJMP FLASH1
RET
;----------------闪烁程序--------------------------
H_F:
MOV DPTR,#LED_SCAN_TABLE_1
RET
M_F:
MOV DPTR,#LED_SCAN_TABLE_2
RET
S_F:
MOV DPTR,#LED_SCAN_TABLE_3
RET
;年月日校准程序
;年月日校准显示程序
;-------------------第四个display函数,专门校准闪烁时用(年月日),节省内存------- DISPLAY2_2:
MOV P0,#11111111B
SETB P2.7
NOP
NOP
;MOV P0,#0FFH
CPL P2.7
MOV A,SCAN_COUNT4 ;之前定义过:SCAN_COUNT EQU 7BH
ADD A,ACC
MOV R1,A
LCALL FLASH2 ;在flash函数中选择调用哪个表 ;MOV DPTR,#LED_SCAN_TABLE
MOV A,R1
MOVC A,@A+DPTR
SETB P2.7 ;位锁存
MOV P0,A
CLR P2.7
MOV A,SCAN_COUNT4
ADD A,ACC
INC A
MOVC A,@A+DPTR
MOV R0,A
MOV A,@R0
SETB P2.6
MOV P0,A
LKH 1/21/2015 26
基于单片机的数字电子钟
;LCALL DELAY_1S ;调试用
CLR P2.6 ;DB
3FH,06H,5BH,04FH,66H,6DH,7DH,07H
;DB
7FH,6FH,77H,7CH,39H,5EH,79H,71H,0FFH
INC SCAN_COUNT4
MOV A,SCAN_COUNT4
CJNE A,#2,DONE4
MOV SCAN_COUNT4,#0
DONE4:
RET
; 年月日闪烁模式选择程序
;----------------年月日闪烁模式选择程序----------------------------
FLASH2:
JNB FLASH_FLAG,F3 ;若标志位位为0,显示闪烁程序,否则显示正常模式
SJMP FLASH2
F3: MOV A,MODE
;CJNE A,#1,F12
;CJNE A,#2,F12
;CJNE A,#3,F12
CJNE A,#4,F4;模式4,校准 天数
LJMP D_F
F4:
CJNE A,#5,F5;模式5,校准 月份
LJMP MON_F
F5:
CJNE A,#6,F6;模式6,校准 低位年
LJMP Y_F1
F6: CJNE A,#7,F9
LJMP Y_F2 ;模式7,校准 高位年
F9: CJNE A,#0,F11;如果变回模式0,返回
RET
F11:; SJMP FLASH2
RET
;----------------闪烁程序--------------------------
D_F:
MOV DPTR,#LED_SCAN_TABLE21
RET
MON_F:
MOV DPTR,#LED_SCAN_TABLE22
LKH 1/21/2015 27
基于单片机的数字电子钟
RET
Y_F1:
MOV DPTR,#LED_SCAN_TABLE23
RET
Y_F2:
MOV DPTR,#LED_SCAN_TABLE24
RET
;按键检测程序
;检测是否按下程序
;----------------------按键程序2----------------------------
KEY_SCAN:
LCALL NOKEY_1;
LCALL NOKEY_2;
LCALL NOKEY_3;
NOKEY_1:
MOV C,P3.4
CPL C
JNC GATE1;CY为0跳转
MOV C,P3.4
MOV TEMP4,C
LCALL DELAY_10MS
MOV C,P3.4
ORL C,TEMP4
JNC K1;确定按下跳转
GATE1: RET
NOKEY_2:
MOV C,P3.5
CPL C
JNC GATE2;CY为0跳转
MOV C,P3.5
MOV TEMP4,C
LCALL DELAY_10MS
MOV C,P3.5
ORL C,TEMP4
JNC K2
GATE2: RET
;JNB P3.4,K1 ;为0跳转,按键按下为0 ;JNB P3.5,K2
;JNB P3.6,K3
; RET
LKH 1/21/2015 28
基于单片机的数字电子钟
; JNB P3.7,K4
;MODE键检测程序
;-----------------模式选择程序--------------------------
K1:
LCALL SOUND
INC MODE
MOV A,MODE
CJNE A,#10,K11
MOV MODE,#0
K11: JNB P3.4,$
RET
;up键检测程序
;--------------UP键的程序--------------------------
K2:
LCALL SOUND
MOV A,MODE
CJNE A,#0,K21;模式0,无操作
RET
K21:
CJNE A,#1,K22
LJMP H_INC;模式1,校准小时
K22:
CJNE A,#2,K27
LJMP M_INC;模式2,校准分钟
K27:
CJNE A,#3,K23 ;模式3,校准秒数
LJMP S_INC
K23:
CJNE A,#4,K24;模式4,校准 天数 LJMP D_INC
K24:
CJNE A,#5,K25;模式5,校准 月份
LJMP MON_INC
K25:
CJNE A,#6,K26;模式6,校准 低位年 LJMP Y_INC_1
K26: CJNE A,#7,K28
LJMP Y_INC_2 ;模式7,校准 高位年 K28:
CJNE A,#8,K29
LJMP H_CLOCK;模式8,闹钟时的时钟调整K29:
LJMP M_CLOCK;模式9,闹钟分钟位调整
LKH 1/21/2015 29
基于单片机的数字电子钟
H_CLOCK:
INC MOV CJNE MOV H_CLOCK1: JNB RET
M_CLOCK:
INC MOV CJNE MOV M_CLOCK1: JNB RET
H_INC:
INC MOV CJNE MOV H_INC1: JNB RET
M_INC:
INC MOV CJNE MOV M_INC1: JNB RET
S_INC:
INC MOV CJNE MOV S_INC1: JNB RET
Y_INC_1:
INC
LKH H_MEM_CLOCK A,H_MEM_CLOCK A,#24,H_CLOCK1 H_MEM_CLOCK,#0 P3.5,$;检测up键是否按下 M_MEM_CLOCK A,M_MEM_CLOCK A,#60,M_CLOCK1 M_MEM_CLOCK,#0 P3.5,$;检测up键是否按下 H_MEM A,H_MEM A,#24,H_INC1 H_MEM,#0 P3.5,$;检测up键是否按下M_MEM A,M_MEM A,#60,M_INC1 M_MEM,#0 P3.5,$;检测up键是否按下S_MEM A,S_MEM A,#60,S_INC1 H_MEM,#0 P3.5,$;检测up键是否按下Y_MEM_1 1/21/2015 30
基于单片机的数字电子钟
MOV A,Y_MEM_1
CJNE A,#100,Y_INC1
MOV Y_MEM_1,#0
Y_INC1: JNB P3.5,$;检测up键是否按下
RET
Y_INC_2:
INC Y_MEM_2
MOV A,Y_MEM_2
CJNE A,#100,Y_INC2
MOV Y_MEM_2,#0
Y_INC2: JNB P3.5,$;检测up键是否按下
RET
MON_INC:
INC MON_MEM
MOV A,MON_MEM
CJNE A,#13,MON_INC1
MOV MON_MEM,#1
MON_INC1: JNB P3.5,$;检测up键是否按下 RET
D_INC:
INC D_MEM
MOV A,D_MEM
CJNE A,#32,D_INC1
MOV D_MEM,#1 D_INC1: JNB P3.5,$;检测up键是否按下
RET
;----------------------OUT OF RANGE问题,K3键判断程序----------- NOKEY_3:
MOV C,P3.6
CPL C
JNC GATE3;CY为0跳转
MOV C,P3.6
MOV TEMP4,C
LCALL DELAY_10MS
MOV C,P3.6
ORL C,TEMP4
JNC K3
GATE3: RET
;done键检测程序
;----------------DONE键的程序-------------------------------
LKH 1/21/2015 31
基于单片机的数字电子钟
K3:
LCALL
MOV SOUND A,MODE CJNE
RET
K31:
CJNE
LJMP
K32:
CJNE
LJMP
K37:
CJNE
LJMP
K33:
CJNE
LJMP
K34:
CJNE
LJMP
K35:
CJNE
LJMP
K36:
CJNE
LJMP
K38:
CJNE
LJMP
K39:
LJMP
H_CLOCK_DEC:
DEC
MOV
CJNE
MOV
H_CLOCK1_DEC:
JNB
RET
M_CLOCK_DEC:
DEC
MOV
LKH A,#0,K31;模式0,无操作 A,#1,K32 H_DEC;模式2,校准小时 A,#2,K37 M_DEC;模式3,校准分钟 A,#3,K33 ;模式3,校准秒数 S_DEC A,#4,K34;模式4,校准高位年 D_DEC A,#5,K35;模式5,校准低位年 MON_DEC A,#6,K36;模式6,校准月份 Y_DEC_1 A,#7,K38 Y_DEC_2 ;模式7,校准天数 A,#8,K39 H_CLOCK_DEC;模式8,调整闹钟小时数 M_CLOCK_DEC;模式9,调整闹钟分钟数 H_MEM_CLOCK A,H_MEM_CLOCK A,#0FFH,H_CLOCK1_DEC H_MEM_CLOCK,#23 P3.6,$;检测up键是否按下 M_MEM_CLOCK A,M_MEM_CLOCK 1/21/2015 32
基于单片机的数字电子钟
CJNE MOV
M_CLOCK1_DEC: A,#0FFH,M_CLOCK1_DEC M_MEM_CLOCK,#59 JNB RET
H_DEC:
DEC MOV CJNE MOV H_DEC1: JNB RET
M_DEC:
DEC MOV CJNE MOV M_DEC1: JNB RET
S_DEC:
DEC MOV CJNE MOV S_DEC1: JNB RET
Y_DEC_1:
DEC MOV CJNE MOV Y_DEC1: JNB RET
Y_DEC_2:
DEC MOV CJNE MOV
LKH P3.6,$;检测up键是否按下 H_MEM A,H_MEM A,#0FFH,H_DEC1 H_MEM,#23 P3.6,$;检测up键是否按下 M_MEM A,M_MEM A,#0FFH,M_DEC1 M_MEM,#59 P3.6,$;检测DONE键是否按下 S_MEM A,S_MEM A,#0FFH,S_DEC1 S_MEM,#59 P3.6,$;检测up键是否按下 Y_MEM_1 A,Y_MEM_1 A,#0FFH,Y_DEC1 Y_MEM_1,#99 P3.6,$;检测DONE键是否按下 Y_MEM_2 A,Y_MEM_2 A,#0FFH,Y_DEC2 Y_MEM_2,#99 1/21/2015 33
基于单片机的数字电子钟
Y_DEC2: JNB P3.6,$;检测up键是否按下
RET
MON_DEC:
DEC MON_MEM
MOV A,MON_MEM
CJNE A,#0,MON_DEC1
MOV MON_MEM,#12
MON_DEC1: JNB P3.6,$;检测DONE键是否按下
RET
D_DEC:
DEC D_MEM
MOV A,D_MEM
CJNE A,#0,D_DEC1
MOV D_MEM,#31
D_DEC1: JNB P3.6,$;检测DONE键是否按下
RET
;-------------------------闹钟程序---------------------------------
;检测key按下的次数,根据不同的次数设置不同的模式
;模式8 调用第五个display函数,闪烁小时位,并记录调整的时间,再次调整到模式0
;模式9 调用第五个display函数,根据表的不同,闪烁分钟位,并记录此时的分钟数
;时间检测程序: 在主函数调用检测函数,到达指定时间,调用闹钟声音程序
;功能小程序
;软件延时程序
;----------------------软件延时程序------------------------
DELAY_10MS:
SETB RS0;选工作区1
MOV R1,#10
DELAY_1MS:
MOV R2,#249
DL: NOP
NOP
DJNZ R2,DL
DJNZ R1,DELAY_1MS
RET
;------------------------------------------------------------------
DELAY_100MS:
SETB RS1
MOV R6,#64H
LKH 1/21/2015 34
基于单片机的数字电子钟
D22:
MOV R5,#0F9H
D21:
DJNZ R5,D21
DJNZ R6,D22
RET
;----------------------------------------------------------------------- DELAY_1S:
SETB RS1
MOV R4,#0AH
D20: DJNZ R4,D19
D19: LCALL DELAY_100MS
CJNE R4,#0,D20
RET
;-------------------------------------------------------------------------- DELAY_500MS:
SETB RS1
MOV R3,#5
D17: DJNZ R3,D18
D18: LCALL DELAY_100MS
CJNE R3,#0,D17
RET
;清内存程序
;----------------------清内存------------------------------
CLR_MEM:
MOV R0,#40H
CLR_MEM1:
MOV @R0,#0
INC R0
CJNE R0,#80H,CLR_MEM1
RET
; 按键声程序
;-----------按键声音--------------------------------
SOUND:
SETB P1.4
LCALL DELAY_500MS
CLR P1.4
RET
; 闹钟声程序
;------------闹钟声音-------------------------------
CLOCK_SOUND:
MOV R0,#10
AGAIN:LCALL CLOCK1_SOUND
DJNZ R0,AGAIN
LKH 1/21/2015 35
基于单片机的数字电子钟
RET
CLOCK1_SOUND:
LCALL DELAY_500MS
LCALL SOUND
RET
; 字形码表
;---------字形码表------------------------------------------
LED_CODE:
DB 3FH,06H,5BH,04FH,66H,6DH,7DH,07H,7FH,6FH ;DB 7FH,6FH;,77H,7CH,39H,5EH,79H,71H,0H //17个?
LED_SCAN_TABLE:
DB 01111111B,LED1
DB 10111111B,LED2
DB 11011111B,LED3
DB 11101111B,LED4
DB 11110111B,LED5
DB 11111011B,LED6
LED_SCAN_TABLE_1: ;小时
DB 11110111B,LED5
DB 11111011B,LED6
LED_SCAN_TABLE_2: ;分钟
DB 11011111B,LED3
DB 11101111B,LED4
LED_SCAN_TABLE_3: ;秒
DB 01111111B,LED1
DB 10111111B,LED2
LED_SCAN_TABLE2:
DB 01111111B,LED1_2
DB 10111111B,LED2_2
DB 11011111B,LED3_2
DB 11101111B,LED4_2
DB 11110111B,LED5_2
DB 11111011B,LED6_2
DB 11111101B,LED7_2
DB 11111110B,LED8_2
LED_SCAN_TABLE21: ;日
DB 01111111B,LED1_2
LKH 1/21/2015 36
基于单片机的数字电子钟
DB 10111111B,LED2_2
LED_SCAN_TABLE22: ;月
DB 11011111B,LED3_2
DB 11101111B,LED4_2
LED_SCAN_TABLE23: ;年低位
DB 11110111B,LED5_2
DB 11111011B,LED6_2
LED_SCAN_TABLE24: ;年高位
DB 11111101B,LED7_2
DB 11111110B,LED8_2
LED_SCAN_TABLE_CLOCK_1: ;时钟
DB 11110111B,LED1_CLOCK_HOUR
DB 11111011B,LED2_CLOCK_HOUR
DB 11011111B,LED1_CLOCK_MIN
DB 11101111B,LED2_CLOCK_MIN
LED_SCAN_TABLE_CLOCK_2:
DB 11110111B,LED1_CLOCK_HOUR
DB 11111011B,LED2_CLOCK_HOUR
DB 11011111B,LED1_CLOCK_MIN
DB 11101111B,LED2_CLOCK_MIN
END
六、 设计或调试过程中碰到的问题及
1. 存储错乱
——例如在校准时分秒的程序中,我第一次编程时写的代码如下:
MOV P0,#11111111B
SETB P2.7
NOP
NOP
CPL P2.7
MOV A,SCAN_COUNT3
ADD A,ACC
LCALL FLASH1 ;在flash函数中选择调用哪个表 ;MOV DPTR,#LED_SCAN_TABLE
MOVC A,@A+DPTR
SETB P2.7 ;位锁存
MOV P0,A
CLR P2.7
LKH 1/21/2015 37
基于单片机的数字电子钟
FLASH1:
JNB FLASH_FLAG,F1 ;若标志位位为0,显示闪烁程序,否则显示正常模式
;LCALL LIGHT_OFF
SJMP FLASH1
F1: MOV A,MODE
CJNE A,#1,F2
LJMP H_F;模式1,校准小时
F2:
CJNE A,#2,F7
LJMP M_F;模式2,校准分钟
F7: CJNE A,#3,F8;如果不等于3,也应该正常显示
LJMP S_F ;模式3,校准秒数
F8: CJNE A,#0,F10;如果变回模式0
RET
F10:; SJMP FLASH1
RET
在执行程序,并不能得到想要的效果:单独时钟位(或分钟位、秒位)闪烁,相反程序会停滞,仅在一个数码管中显示数字零。
我研究了很久,终于发现,当display函数执行到“LCALL FLASH1”的时候,它跳转到FLASH1程序中执行,执行完FLASH1程序后A的值已经变化了,因为在FLASH1程序中,因为要对MODE进行判断,”MOV A,MODE”。而执行完FLASH1程序,返回原来的地方继续执行时,会把此中的A值进行变址寻址“MOVC A, @DPTR+A”,这样寻找到的数值就是错误的。
解决方法很简单,只需要在执行FLASH1程序之前,把A值存储在一个工作寄存器中,在执行完FLASH1程序的时候,再把之前存储的值取出来,这样就可以找到正确的数值了。
2. 工作区的选择
在CONVERT_BCD中的BTID中,把工作区0的工作寄存器几乎都用完了,所以,如果你在其他地方还需要工作寄存器存储数据,就要调用其他工作区的工作寄存器,控制的方法就是设置RS0和RS1的值,要确保存储的位置不冲突,才能保证程序无误。
3. 闹钟响的时间
CHECK_TIME:
MOV A,H_MEM_CLOCK
CJNE A,H_MEM,OVER2
CHECK_NEXT:
MOV A,M_MEM_CLOCK
CJNE A,M_MEM,OVER2
LCALL CLOCK_SOUND
RET
OVER2:
LKH 1/21/2015 38
基于单片机的数字电子钟
RET
上面的程序是我第一次编写闹钟的程序,烧到单片机调试的时候发现,它一上机就会叫。想了想,发现原因有两个。第一,闹钟的小时和分钟的默认值为0,也就是说默认00:00是闹钟时间,一到这个时间就会触发闹钟声音程序,而且在整个第一分钟,都满足0时0分的条件,所以闹钟第一分钟都会响。解决方法有两个步骤。第一,给闹钟赋初值“MOV H_MEM_CLOCK,#12”,这样这个电子钟到了12:00(正午)的时候会自动出发闹钟声响,而且加上“
MOV A,S_MEM
CJNE A,#0,OVER2”
这样,只有在设定时间的第一秒才满足条件,闹钟也只会响一次,而不会整一分钟都会鸣叫。
4. 按键紊乱
设计完按键程序第一次调试的时候,发现有时候只按了一下,却相当于
按了很多下,原来是没有设计消抖程序。键盘有时因为按下时会上下抖动,虽然你只按了一下,单片机却检测到多次低电平,所以会产生误差,所以后来我在每个按键检测程序中都设置了消抖程序:
NOKEY_1:
MOV C,P3.4
CPL C
JNC GATE1;CY为0跳转
MOV C,P3.4
MOV TEMP4,C
LCALL DELAY_10MS
MOV C,P3.4
ORL C,TEMP4
JNC K1;确定按下跳转
GATE1: RET
可以知道,在上述程序中,对按键进行了两次判断,第一次判断时,将
按键电平存储在一个寄存器中,延时100MS,再将此时的按键电平与寄存器中存储的电平进行比较,如果相等,则说明这个键按下无误,可以执行按键按下相对应的程序,如果没有按下,则返回继续检测。通过延时后再一次经行比较,可以提高按键检测的正确率。
七、 测试数据,误差分析,补偿方法,补偿前后精度比较
a) 未考虑月份不同天数
本人在设计程序的时候统一设定天数为21天,未考虑月份不同带来的天数不同问题。需要手动进行调节。
b) 中断服务程序造成的时间延迟
中断服务程序每100MS会执行一次,中断后继续赋初值、判断是否到1s,更新M_MEM、S_MEM、H_MEM等数据,做完这些步骤后才出栈执行下一次计时,其中会有时间延迟,所以渐渐地时间会不准确,会偏慢。也需LKH 1/21/2015 39
基于单片机的数字电子钟
要手动进行调节。
八、 收获及意见
1. 通过这次单片机课程设计,真的学到很多,以前用的不灵活的SJMP、
CJNZ等指令,还有经常搞不懂的JC、JB、JNB等指令,都因为用的多,所以印象深刻,还有display程序、BCD程序、按键程序(消抖、检测等)、中断程序等都因为课程设计的缘故被我研究了很多遍,最后预期效果得以呈现的时候内心自然是很开心的。实践出真知和熟能生巧这个2.
3.
九、
LKH 真理是不会过时的。 通过这个课程设计还回顾了CAD画图,通过软件硬件的学习,我对单片机的工作原理,内部结构,存储器的概念理解得更加深刻。同时我知道,光是这个电子钟都还有很多值得改进和完善的。很期待可以用单片机做出更多的东西,也很希望能够掌握更多的单片机知识。 意见。我希望在理论课的时候老师也能从简单到复杂布置一些任务给我们做,让我们逐步掌握各个指令的用法和编程序的格式。可以通过板书实际程序,从中讲解单片机的内部结构、指令系统,这样应该上手更快。很感谢老师,在我学单片机和做这个课程设计的过程中耐心地回答了我很多问题,很感激! 1/21/2015 40