单片机电子时钟设计
一、作品功能介绍
该作品是个性化电子钟设计,技术上主要用单片机(AT89S52)主控,6位LED数码显示,分别显示“小时:分钟:秒”。该作品主要用于24小时计时显示,能整时报时,能作为秒表使用,能定时闹铃1分钟。
功能介绍:
(1)上电以后自动进入计时状态,起始于00:00:00。
(2)设计键盘调整时间,完成时间设计,并设置闹钟。
(3)定时时间为1/100秒,可采用定时器实现。
(4)采用LED数码管显示,时、分,秒采用数字显示。
(5)采用24小时制,具有方便的时间调校功能。
(6)具有时钟和秒表的切换功能。
使用方法:
开机后时钟在00:00:00起开始计时。
(1)长按P3.2进入调分状态:分单元闪烁,按P3.2加1,按P3.3减1.再长按P3.2进入 时调整状态,时单元闪烁,加减调整同调分.按长按退出调整状态。
(2)(2)按P3.3进入设定闹时状态: 12:00: ,可进行分设定,按P3.4分加1,再按P3.2为时调整,按P3.4时加1,按P3.3调闹钟结束.在闹铃时可按P3.2停闹,不按闹铃1分钟。
(3)按下P3.4进入秒表状态:再按P3.4秒表又启动,按P3.4暂停,再按P3.4秒表清零,按P3.4退出秒表回到时钟状态。
二、电路原理图
如原理图所示,硬件系统主要由单片机最小应用系统、LED数码管显示模块、电源模块、晶振模块、按键模块等组成。
电子时钟原理图
各个模块设计
1.单片机系统 AT89S52 AT89S52概述:是一款非常适合单片机初学者学习的单片机,它完全兼容传统的8051,8031的指令系统,他的运行速度要比8051快最高支持达33MHz的晶体震荡器,在此系统中使用12MHz的晶振。
AT89S52具有以下标准功能: 8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止……
主要性能:与MCS-51单片机产品兼容 、8K字节在系统可编程Flash存储器、 1000次擦写周期、 全静态操作:0Hz~33Hz 、 三级加密程序存储器 、 32个可编程I/O口线 、三个16位定时器/计数器 八个中断源 、全双工UART串行通道、 低功耗空闲和掉电模式 、掉电后中断可唤醒、看门狗定时器 、双数据指针 、掉电标识符 。
2、显示模块
LED数码管是由发光二极管构成的,亦称半导体数码管。将条状发光二极管按照共阴极(负极)或共阳极(正极)的方法连接,组成“8”字,再把发光二极管另一电极作笔段电极,就构成了LED数码管。若按规定使某些笔段上的发光二极管发光,就能显示从0~9的…系列数字。同荧光数码管(VFD)、辉光数码管(NRT)相比,它具有:体积小、功耗低、耐震动、寿命长、亮度高、单色性好、发光响应的时间短,能与TTL、CMOS电路兼容等的数显器件。+、-分别表示公共阳极和公共阴极。a~g是7个笔段电极,DP为小数点。另有一种字高为7.6mm的超小型LED数码管,管脚从左右两排引出,小数点则是独立的。
本系统利用6位LED数码管显示时间,共阴极结构。LED数码管由7段发光二极管组成,当要显示某个数字时只要将数字所对应的引脚送入低电平。
3.按键模块
本设计中主要有三个控制按键,按键功能为:
(1)P3.2为调时间模式,长按P3.2进入调分状态:分单元闪烁,按P3.2加1,按P3.3减1.再长按P3.2进入时调整状态,时单元闪烁,加减调整同调分.按长按退出调整状态。
(2)按P3.3进入设定闹时状态: 12:00: ,可进行分设定,按P3.4分加1,再按P3.2为时调整,按P3.4时加1,按P3.3调闹钟结束.在闹铃时可按P3.2停闹,不按闹铃1分钟。
(3)按下P3.4进入秒表状态:再按P3.4秒表又启动,按P3.4暂停,再按P3.4秒表清零,按P3.4退出秒表回到时钟状态。
4.晶振模块
在AT89S51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2。而在芯片内部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。
晶振电路
三、程序设计
源程序代码
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; AT89S52时钟程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
*****************************************************************定时器T0、T1溢出周期为50MS,T0为秒计数用, T1为调整时闪烁及秒表定时用,
P3.2、P3.3、P3.4为调整按钮,P0口为字符输出口,P2为扫描口,P1.2为蜂呜器口,采
用共阳显示管。
50H-55H为闹钟定时单元,60H-65H为秒表计时单元,70H-75H为显示时间单元,76H-79H
为分时计时单元。
03H标志=0时钟闪烁,=1秒表, 05H=0,不闹铃,=1要闹铃. 07H每秒改变一次,
用作间隔呜叫.
*****************************************************************
DISPFIRST EQU 30H ;显示首址存放单元
BELL EQU P1.2
CONBS EQU 2FH ;存放报时次数
CLOCK EQU 2DH
****************************************
中断入口程序
****************************************
ORG 0000H ;程序执行开始地址
LJMP START ;跳到标号START执行
ORG 0003H ;外中断0中断程序入口
RETI ;外中断0中断返回
ORG 000BH ;定时器T0中断程序入口
LJMP INTT0 ;跳至INTTO执行
ORG 0013H ;外中断1中断程序入口
RETI ;外中断1中断返回
ORG 001BH ;定时器T1中断程序入口
LJMP INTT1 ;跳至INTT1执行
ORG 0023H ;串行中断程序入口地址
RETI ;串行中断程序返回
****************************************
以下程序开始 ;;
****************************************
整点报时用
QQQQ: MOV A,#10H
MOV B,79H
MUL AB
ADD A,78H
MOV CONBS,A
BSLOOP: LCALL DS21MS
LCALL DL1S
LCALL DL1S
LCALL DL1S
DJNZ CONBS,BSLOOP
CLR 08H ;清整点报时标志
AJMP START1
****************************************
主程序开始 ;;
****************************************
START: LCALL ST ;上电显示00:00:00
MOV R0,#00H ;清00H-7FH内存单元
MOV R7,#80H ;
CLEARDISP: MOV @R0,#00H ;
INC R0 ;
DJNZ R7,CLEARDISP ;
MOV 20H,#00H ;清20H(标志用)
MOV 55H,#1
MOV 54H,#2
MOV 7AH,#0AH ;放入"熄灭符"数据
MOV TMOD,#11H ;设T0、T1为16位定时器
MOV TL0,#0B0H ;50MS定时初值(T0计时用)
MOV TH0,#3CH ;50MS定时初值
MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)
MOV TH1,#3CH ;50MS定时初值
SETB EA ;总中断开放
SETB ET0 ;允许T0中断
SETB TR0 ;开启T0定时器
MOV R4,#14H ;1秒定时用计数值(50MS×20)
MOV DISPFIRST,#70H ;显示单元为70-75H
;以下主程序循环
START1: LCALL DISPLAY ;调用显示子程序
JNB P3.2,SETMM1 ;P3.2口为0时转时间调整程序
JNB P3.3,TSFUN ;定时闹铃设定
JNB P3.4,FUNPT ;秒表功能(STOP,RUN,CLR)
JB 08H, QQQQ
AJMP START1 ;P3.2口为1时跳回START1
FUNPT: LJMP FUNPTT
START12: LJMP START1
以下闹铃时间设定程序,按P3.3进入设定
TSFUN: LCALL DS20MS
JB P3.3,START1 ;
WAIT113: JNB P3.3,WAIT113 ;等待键释放
JB 05H,CLOSESP ;闹铃已开的话,关闹铃
MOV DISPFIRST,#52H ;进入闹铃设定程序,显示52-55H闹钟定时单元
DSWAIT: SETB EA
LCALL DISPLAY
JNB P3.4,DSFINC ;分加1
JNB P3.2,DSDEC ;分减1
JNB P3.3,DSSFU ;进入时调整
AJMP DSWAIT
CLOSESP: CLR 05H ;关闹铃标志
CLR BELL
AJMP START1
DSSFU: LCALL DS20MS ;消抖
JB P3.3, DSWAIT
LJMP DSSFUNN ;进入时调整
; SETMM1: LJMP SETMM ;转到时间调整程序SETMM
DSFINC : LCALL DS20MS ;消抖
JB P3.4, DSWAIT
DSWAIT12: LCALL DISPLAY ;等键 释放
JNB P3.4, DSWAIT12
CLR EA
MOV R0,#53H ;
LCALL ADD1 ;闹铃设定分加1
MOV A,R3 ;分数据放入A
CLR C ;清进位标志
CJNE A,#60H,ADDHH22 ;
ADDHH22: JC DSWAIT ;小于60分时返回
ACALL CLR0 ;大于或等于60分时分计时单元清0
AJMP DSWAIT
DSDEC : LCALL DS20MS ;消抖
JB P3.2, DSWAIT
DSWAITEE: LCALL DISPLAY ;等键 释放
JNB P3.2, DSWAITEE
CLR EA
MOV R0,#53H ;
LCALL sub1 ;闹铃设定分减1
LJMP DSWAIT
;以下秒表暂停\清零功能程序
;按下P3.4切换秒表功能,再按开始计时,暂停或清0,最后按P3.4退出秒表回到时钟计时
FUNPTT: LCALL DS20MS
JB P3.4,START12
WAIT22: JNB P3.4,WAIT21
CPL 03H
JNB 03H,TIMFUN
MOV DISPFIRST,#60H ;显示秒表数据单元
MOV 60H,#00H
MOV 61H,#00H
MOV 62H,#00H
MOV 63H,#00H
MOV 64H,#00H
MOV 65H,#00H
MOV TL1,#0F0H ;10MS定时初值
MOV TH1,#0D8H ;10MS定时初值
WAIT88:LCALL DS20MS
JB P3.4,WAIT81
WAIT99:JNB P3.4,WAIT99
SETB TR1 ;T1运行控制软件
SETB ET1 ;T1溢出中断允许
WAIT33: LCALL DS20MS
JB P3.4,WAIT31
WAIT44: JNB P3.4,WAIT41
CLR ET1
CLR TR1
WAIT55: LCALL DS20MS
JB P3.4,WAIT51
WAIT66: JNB P3.4,WAIT61
MOV 60H,#00H
MOV 61H,#00H
MOV 62H,#00H
MOV 63H,#00H
MOV 64H,#00H
MOV 65H,#00H
TIMFUN:MOV DISPFIRST,#72H ;显示时钟数据单元
CLR ET1
CLR TR1
AJMP FUNSS11
FUNSS11: AJMP START1
;以下键等待释放时显示不会熄灭用
WAIT21: LCALL DISPLAY
AJMP WAIT22
WAIT31: LCALL DISPLAY
AJMP WAIT33
WAIT41: LCALL DISPLAY
AJMP WAIT44
WAIT51: LCALL DISPLAY
AJMP WAIT55
WAIT61: LCALL DISPLAY
AJMP WAIT66
WAIT81: LCALL DISPLAY
AJMP WAIT88
WAIT91: LCALL DISPLAY
AJMP WAIT99
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 1秒计时程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0中断服务程序
INTT0: PUSH ACC ;累加器入栈保护
PUSH PSW ;状态字入栈保护
CLR ET0 ;关T0中断允许
CLR TR0 ;关闭定时器T0
MOV A,#0B7H ;中断响应时间同步修正
ADD A,TL0 ;低8位初值修正
MOV TL0,A ;重装初值(低8位修正值)
MOV A,#3CH ;高8位初值修正
ADDC A,TH0 ;
MOV TH0,A ;重装初值(高8位修正值)
SETB TR0 ;开启定时器T0
DJNZ R4, OUTT0 ;20次中断未到中断退出
ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值
CPL 07H ;闹铃时间隔呜叫用
MOV R0,#71H ;指向秒计时单元(71H-72H)
ACALL ADD1 ;调用加1程序(加1秒操作)
MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)
CLR C ;清进位标志
CJNE A,#60H,ADDMM ;
ADDMM: JC OUTT0 ;小于60秒时中断退出
ACALL CLR0 ;大于或等于60秒时对秒计时单元清0
MOV R0,#77H ;指向分计时单元(76H-77H)
ACALL ADD1 ;分计时单元加1分钟
MOV A,R3 ;分数据放入A
CLR C ;清进位标志
CJNE A,#60H,ADDHH ;
ADDHH: JC OUTT0 ;小于60分时中断退出
ACALL CLR0 ;大于或等于60分时分计时单元清0
LCALL DS20MS ;正点报时
SETB 08H
MOV R0,#79H ;指向小时计时单元(78H-79H)
ACALL ADD1 ;小时计时单元加1小时
MOV A,R3 ;时数据放入A
CLR C ;清进位标志
CJNE A,#24H,HOUR ;
HOUR: JC OUTT0 ;小于24小时中断退出
ACALL CLR0 ;大于或等于24小时小时计时单元清0
OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移
MOV 73H,77H ;入对应显示单元
MOV 74H,78H ;
MOV 75H,79H ;
LCALL BAOJ
POP PSW ;恢复状态字(出栈)
POP ACC ;恢复累加器
SETB ET0 ;开放T0中断
RETI ;中断返回
;****************************************
;; 闪动调时程序\秒表功能程序 ;;
;****************************************
;T1中断服务程序,用作时间调整时调整单元闪烁指示或秒表计时
INTT1: PUSH ACC ;中断现场保护
PUSH PSW ;
JB 03H, MMFUN ;=1时秒表
MOV TL1, #0B0H ;装定时器T1定时初值
MOV TH1, #3CH ;
DJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)
MOV R2,#06H ;重装0.3秒定时用初值
CPL 02H ;0.3秒定时到对闪烁标志取反
JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"
MOV 72H,76H ;02H位为0时正常显示
MOV 73H,77H ;
MOV 74H,78H ;
MOV 75H,79H ;
INTT1OUT: POP PSW ;恢复现场
POP ACC ;
RETI ;中断退出
FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制
MOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分
MOV 73H,7AH ;显示单元(72H-73H),将不显示分数据
MOV 74H,78H ;
MOV 75H,79H ;
AJMP INTT1OUT ;转中断退出
FLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时
MOV 73H,77H ;显示单元(74H-75H),小时数据将不显示
MOV 74H,7AH ;
MOV 75H,7AH ;
AJMP INTT1OUT ;转中断退出
;
MMFUN : CLR TR1
MOV A,#0F7H ;中断响应时间同步修正,重装初值(10ms)
ADD A,TL1 ;低8位初值修正
MOV TL1,A ;重装初值(低8位修正值)
MOV A,#0D8H ;高8位初值修正
ADDC A,TH1 ;
MOV TH1,A ;重装初值(高8位修正值)
SETB TR1 ;开启定时器T1
MOV R0,#61H ;指向秒计时单元(71H-72H)
ACALL ADD1 ;调用加1程序(加1秒操作)
CLR C ;
MOV A,R3 ;
JZ FSS1 ;加1后为00,C=0
AJMP OUTT01 ;加1后不为00,C=1
FSS1: ACALL CLR0 ;大于或等于60秒时对秒计时单元清0
MOV R0,#63H ;指向分计时单元(76H-77H)
ACALL ADD1 ;分计时单元加1分钟
MOV A,R3 ;分数据放入A
CLR C ;清进位标志
CJNE A,#60H,ADDHH1 ;
ADDHH1: JC OUTT01 ;小于60分时中断退出
LCALL CLR0 ;大于或等于60分时分计时单元清0
MOV R0,#65H ;指向小时计时单元(78H-79H)
ACALL ADD1 ;小时计时单元加1小时
OUTT01:
POP PSW ;恢复状态字(出栈)
POP ACC ;恢复累加器
RETI ;中断返回
****************************************
;; 加1子 程 序 ;;
;****************************************
ADD1: MOV A,@R0 ;取当前计时单元数据到A
DEC R0 ;指向前一地址
SWAP A ;A中数据高四位与低四位交换
ORL A,@R0 ;前一地址中数据放入A中低四位
ADD A,#01H ;A加1操作
DA A ;十进制调整
MOV R3,A ;移入R3寄存器
ANL A,#0FH ;高四位变0
MOV @R0,A ;放回前一地址单元
MOV A,R3 ;取回R3中暂存数据
INC R0 ;指向当前地址单元
SWAP A ;A中数据高四位与低四位交换
ANL A,#0FH ;高四位变0
MOV @R0,A ;数据放入当削地址单元中
RET ;子程序返回
;****************************************
;; 分减1子 程 序 ;;
;****************************************
;
SUB1: MOV A,@R0 ;取当前计时单元数据到A
DEC R0 ;指向前一地址
SWAP A ;A中数据高四位与低四位交换
ORL A,@R0 ;前一地址中数据放入A中低四位
JZ SUB11
DEC A ;A减1操作
SUB111: MOV R3,A ;移入R3寄存器
ANL A,#0FH ;高四位变0
CLR C ;清进位标志
SUBB A,#0AH
SUB1111: JC SUB1110
MOV @R0,#09H ;大于等于0AH,为9
SUB110: MOV A,R3 ;取回R3中暂存数据
INC R0 ;指向当前地址单元
SWAP A ;A中数据高四位与低四位交换
ANL A,#0FH ;高四位变0
MOV @R0,A ;数据放入当削地址单元中
RET ;子程序返回
;
SUB11: MOV A,#59H
AJMP SUB111
SUB1110:MOV A,R3 ;移入R3寄存器
ANL A,#0FH ;高四位变0
MOV @R0,A
AJMP SUB110
;****************************************
;; 时减1子 程 序 ;;
;****************************************
SUBB1:MOV A,@R0 ;取当前计时单元数据到A
DEC R0 ;指向前一地址
SWAP A ;A中数据高四位与低四位交换
ORL A,@R0 ;前一地址中数据放入A中低四位
JZ SUBB11 ;00减1为23(小时)
DEC A ;A减1操作
SUBB111:MOV R3,A ;移入R3寄存器
ANL A,#0FH ;高四位变0
CLR C ;清进位标志
SUBB A,#0AH ;时个位大于9为9
SUBB1111: JC SUBB1110 ;
MOV @R0,#09H ;大于等于0AH,为9
SUBB110: MOV A,R3 ;取回R3中暂存数据
INC R0 ;指向当前地址单元
SWAP A ;A中数据高四位与低四位交换
ANL A,#0FH ;高四位变0
MOV @R0,A ;时十位数数据放入
RET ;子程序返回
;
SUBB11: MOV A,#23H
AJMP SUBB111
SUBB1110:MOV A,R3 ;时个位小于0A不处理
ANL A,#0FH ;高四位变0
MOV @R0,A ;个位移入
AJMP SUBB110
;****************************************
;; 清零程序 ;;
;****************************************
;对计时单元复零用
CLR0: CLR A ;清累加器
MOV @R0,A ;清当前地址单元
DEC R0 ;指向前一地址
MOV @R0,A ;前一地址单元清0
RET ;子程序返回
;
;****************************************
;; 时钟时间调整程序 ;;
;****************************************
;当调时按键按下时进入此程序
SETMM: CLR ET0 ;关定时器T0中断
CLR TR0 ;关闭定时器T0
LCALL DL1S ;调用1秒延时程序
LCALL DS20MS ;消抖
JB P3.2,CLOSEDIS ;键按下时间小于1秒,关闭显示(省电)
MOV R2,#06H ;进入调时状态,赋闪烁定时初值
MOV 70H,#00H ;调时时秒单元为00 秒
MOV 71H,#00H
SETB ET1 ;允许T1中断
SETB TR1 ;开启定时器T1
SET2: JNB P3.2,SET1 ;P3.2口为0(键未释放),等待
SETB 00H ;键释放,分调整闪烁标志置1
SET4: JB P3.2,SET3 ;等待键按下
LCALL DL05S ;有键按下,延时0.5秒
LCALL DS20MS ;消抖
JNB P3.2,SETHH ;按下时间大于0.5秒转调小时状态
MOV R0,#77H ;按下时间小于0.5秒加1分钟操作
LCALL ADD1 ;调用加1子程序
MOV A,R3 ;取调整单元数据
CLR C ;清进位标志
CJNE A,#60H,HHH ;调整单元数据与60比较
HHH: JC SET4 ;调整单元数据小于60转SET4循环
LCALL CLR0 ;调整单元数据大于或等于60时清0
CLR C ;清进位标志
AJMP SET4 ;跳转到SET4循环
CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断
SETB TR0 ;开启T0定时器(开时钟)
CLOSE: JB P3.2,CLOSE ;无按键按下,等待。
LCALL DS20MS ;消抖
JB P3.2,CLOSE ;是干扰返回CLOSE等待
WAITH: JNB P3.2,WAITH ;等待键释放
LJMP START1 ;返回主程序(LED数据显示亮)
SETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)
SETB 01H ;小时调整标志置1
SETHH1: JNB P3.2,SET5 ;等待键释放
SET6: JB P3.2,SET7 ;等待按键按下
LCALL DL05S ;有键按下延时0.5秒
LCALL DS20MS ;消抖
JNB P3.2,SETOUT ;按下时间大于0.5秒退出时间调整
MOV R0,#79H ;按下时间小于0.5秒加1小时操作
LCALL ADD1 ;调加1子程序
MOV A,R3 ;
CLR C ;
CJNE A,#24H,HOUU ;计时单元数据与24比较
HOUU: JC SET6 ;小于24转SET6循环
LCALL CLR0 ;大于或等于24时清0操作
AJMP SET6 ;跳转到SET6循环
SETOUT: JNB P3.2,SETOUT1 ;调时退出程序。等待键释放
LCALL DS20MS ;消抖
JNB P3.2,SETOUT ;是抖动,返回SETOUT再等待
CLR 01H ;清调小时标志
CLR 00H ;清调分标志
CLR 02H ;清闪烁标志
CLR TR1 ;关闭定时器T1
CLR ET1 ;关定时器T1中断
SETB TR0 ;开启定时器T0
SETB ET0 ;开定时器T0中断(计时开始)
LJMP START1 ;跳回主程序
SET1: LCALL DISPLAY ;键释放等待时调用显示程序(调分)
AJMP SET2 ;防止键按下时无时钟显示
SET3: LCALL DISPLAY ;等待调分按键时时钟显示用
JNB P3.3, FUNSUB ;减1分操作
AJMP SET4 ;调分等待
SET5: LCALL DISPLAY ;键释放等待时调用显示程序(调小时)
AJMP SETHH1 ;防止键按下时无时钟显示
SET7: LCALL DISPLAY ;等待调小时按键时时钟显示用
JNB P3.3, FUNSUBB ;小时减1操作
AJMP SET6 ;调时等待
SETOUT1: LCALL DISPLAY ;退出时钟调整时键释放等待
AJMP SETOUT ;防止键按下时无时钟显示
;FUNSUB,分减1程序
FUNSUB: LCALL DS20MS ;消抖
JB P3.3,SET41 ;干扰,返回调分等待
FUNSUB1: JNB P3.3,FUNSUB1 ;等待键放开
MOV R0,#77H ;
LCALL SUB1 ;分减1程序
LJMP SET4 ;返回调分等待
;
SET41: LJMP SET4 ;
;FUNSUBB,时减1程序 ;
FUNSUBB: LCALL DS20MS ;消抖
JB P3.3,SET61 ; 干扰,返回调时等待
FUNSUBB1: JNB P3.3,FUNSUBB1 ; 等待键放开
MOV R0,#79H ;
LCALL SUBB1 ; 时减1程序
LJMP SET6 ; 返回调时等待
;
SET61: LJMP SET6
;***************************************
;; 显示程序 ;;
;***************************************
; 显示数据在70H-75H单元内,用六位LED共阳数码管显示,P0口输出段码数据,P2口作
; 扫描控制,每个LED数码管亮1MS时间再逐位循环。
DISPLAY: MOV R1,DISPFIRST ;指向显示数据首址
MOV R5,#0FEH ;扫描控制字初值
PLAY: MOV A,R5 ;扫描字放入A
MOV P2,A ;从P2口输出
MOV A,@R1 ;取显示数据到A
MOV DPTR,#TAB ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P0,A ;段码放入P1口
MOV A,R5 ;
JB ACC.2,LOOP5 ;小数点处理
CLR P0.7 ;
LOOP5: JB ACC.4,LOOP6 ;小数点处理
CLR P0.7 ;
LOOP6: LCALL DL1MS ;显示1MS
INC R1 ;指向下一地址
MOV A,R5 ;扫描控制字放入A
JNB ACC.5,ENDOUT ;ACC.5=0时一次显示结束
RL A ;A中数据循环左移
MOV R5,A ;放回R5内
MOV P0,#0FFH
AJMP PLAY ;跳回PLAY循环
ENDOUT: MOV P2,#0FFH ;一次显示结束,P2口复位
MOV P0,#0FFH ;P0口复位
RET ;子程序返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH
;共阴段码表 "0""1""2" "3""4""5""6""7" "8""9""不亮"“A”“-”
;
;****************************
; SDISPLAY ,上电显示子程序
;****************************
;不带小数点显示,有“A”“-”显示功能
SDISPLAY: MOV R1,DISPFIRST
MOV R5,#0FEH ;扫描控制字初值
SPLAY: MOV A,R5 ;扫描字放入A
MOV P2,A ;从P2口输出
MOV A,@R1 ;取显示数据到A
MOV DPTR,#TABS ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P0,A ;段码放入P1口
MOV A,R5 ;
LCALL DL1MS ;显示1MS
INC R1 ;指向下一地址
MOV A,R5 ;扫描控制字放入A
JNB ACC.5,ENDOUTS ;ACC.5=0时一次显示结束
RL A ;A中数据循环左移
MOV R5,A ;放回R5内
AJMP SPLAY ;跳回PLAY循环
ENDOUTS: MOV P2,#0FFH ;一次显示结束,P2口复位
MOV P0,#0FFH ;P0口复位
RET ;子程序返回
TABS:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0C6H,0BFH,88H
; 显示数 "0 1 2 3 4 5 6 7 8 9 不亮 C - A "
; 内存数 "0 1 2 3 4 5 6 7 8 9 0AH 0BH 0CH 0DH "
STAB:DB
0AH,0AH,0AH,0AH,0AH,09H,06H,04H,02H,00H,00H,06H,00H,01H,03H,0AH
DB 0AH,09H,01H,0CH,06H,00H,0CH,09H,00H,00H,02H,0AH,0AH,0AH,0AH,0AH
; 注:0A不亮,0B显示“A”,0C显示“-”
;*************************************
;以下是闹铃时间设定程序中的时调整程序
;*************************************
DSSFUNN: LCALL DISPLAY ;等待键释放
JNB P3.3, DSSFUNN
WAITSS: SETB EA
LCALL DISPLAY
JNB P3.4,FFFF ;时加1键
JNB P3.2,DDDD ;时减1
JNB P3.3,OOOO ;闹铃设定退出键
AJMP WAITSS
OOOO: LCALL DS20MS ;消抖
JB P3.3,WAITSS
DSSFUNNM: LCALL DISPLAY ;键释放等待
JNB P3.3, DSSFUNNM
MOV DISPFIRST,#72H
LJMP START1
FFFF: LCALL DS20MS ;消抖
JB P3.4, WAITSS
DSSFUNMM: LCALL DISPLAY ;键释放等待
JNB P3.4, DSSFUNMM
CLR EA
MOV R0,#55H
LCALL ADD1
MOV A,R3 ;
CLR C ;
CJNE A,#24H,ADDHH33N ;
ADDHH33N: JC WAITSS ;小于24点返回
ACALL CLR0 ;大于等于24点清零
AJMP WAITSS
DDDD : LCALL DS20MS ;消抖 ;
JB P3.2, WAITSS
DSSFUNDD: LCALL DISPLAY ;键释放等待
JNB P3.2, DSSFUNDD
CLR EA
MOV R0,#55H
LCALL SUBB1
LJMP WAITSS
;*********************
;以下是闹铃判断子程序
;*********************
BAOJ: MOV A,79H ;从时十位、个位、分十位、分个位顺序比较
CJNE A,55H,BBAO
MOV A,78H
CLR C
BB3: CJNE A,54H,BBAO
MOV A,77H
CLR C
CJNE A,53H,BBAO
MOV A,76H
CLR C
; CJNE A,52H,BBAO
; CLR C
; CLR BELL
; RET
BB2: CJNE A,52H,BBAO
JNB 07H,BBAO ;07H在1秒到时会取反
CLR BELL ;时分相同时呜叫(1秒间隔叫)
RET
;
BBAO: SETB BELL ;不相同或闹铃不开
RET
;***********************************************************
上电显示程序
;***********************************************************
ST: MOV R0,#40H ;将显示内容移入40H-5FH单元
MOV R2,#20H ;
MOV R3,#00H ;
CLR A ;
MOV DPTR,#STAB ;
SLOOP: MOVC A,@A+DPTR ;
MOV @R0,A ;
MOV A,R3 ;
INC A ;
MOV R3,A ;
INC R0 ;
DJNZ R2,SLOOP ;移入完毕
MOV DISPFIRST,#40H ;以下程序从左往右移
SSLOOP: MOV R2,#50 ;控制移动速度
SSLOOP1: LCALL SDISPLAY ;
DJNZ R2,SSLOOP1 ;
INC DISPFIRST
MOV A,DISPFIRST
CJNE A,#5AH, SSLOOP ;
MOV DISPFIRST,#5AH ;以下程序从右往左移
MOV R3,#1BH ;显示27个单元
SSLOOP2: MOV R2,#100 ;控制移动速度
SSLOOP12: LCALL SDISPLAY ;
DJNZ R2,SSLOOP12 ;
DEC DISPFIRST
DJNZ R3,SSLOOP2 ;
RET
;*******************************************
;; 延时程序 ;;
;*******************************************
;
;1MS延时程序,LED显示程序用
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;延时程序,采用调用显示子程序以改善LED的显示闪烁现象
DS20MS: ;CLR BELL
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
; SETB BELL
RET
DS21MS: CLR BELL
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
SETB BELL
RET
;延时程序,用作按键时间的长短判断
DL1S: LCALL DL05S
LCALL DL05S
RET
DL05S: MOV R3,#20H ;8毫秒*32=0.196秒
DL05S1: LCALL DISPLAY
DJNZ R3,DL05S1
RET
;********************************************************
END ;程序结束
四、仿真分析
图一 原理图
图二 仿真图一
图三 仿真图二
平时作业
单片机的特点和应用
1、单片机的特点
(1)高集成度,体积小,高可靠性
单片机将各功能部件集成在一块晶体芯片上,集成度很高,体积自然也是最小的。芯片本身是按工业测控环境要求设计的,内部布线很短,其抗工业噪音性能优于一般通用的CPU。单片机程序指令,常数及表格等固化在ROM中不易破坏,许多信号通道均在一个芯片内,故可靠性高。
(2)控制功能强
为了满足对对象的控制要求,单片机的指令系统均有极丰富的条件:分支转移能力,I/O口的逻辑操作及位处理能力,非常适用于专门的控制功能。
(3)低电压,低功耗,便于生产便携式产品
为了满足广泛使用于便携式系统,许多单片机内的工作电压仅为1.8V~3.6V,而工作电流仅为数百微安。
(4)易扩展
片内具有计算机正常运行所必需的部件。芯片外部有许多供扩展用的三总线及并行、串行输入/输出管脚,很容易构成各种规模的计算机应用系统。
(5)优异的性能价格比
单片机的性能极高。为了提高速度和运行效率,单片机已开始使用RISC流水线和DSP等技术。单片机的寻址能力也已突破64KB的限制,有的已可达到1MB和16MB,片内的ROM容量可达62MB,RAM容量则可达2MB。由于单片机的广泛使用,因而销量极大,各大公司的商业竞争更使其价格十分低廉,其性能价格比极高。
2、单片机的应用领域
(1)单片机在智能仪器仪表中的应用
在各类仪器仪表中引入单片机,使仪器仪表智能化,提高测试的自动化程度和精度,简化仪器仪表的硬件结构,提高其性能价格比。
(2)单片机在机电一体化中的应用
机电一体化是机械工业发展的方向。机电一体化产品是指集成机械技术、微电子技术、计算机技术于一体,具有智能化特征的机电产品,例如微机控制的车床、钻床等。单片机作为产品中的控制器,能充分发挥它的体积小、可靠性高、功能强等优点,可大大提高机器的自动化、智能化程度。
(3)单片机在日常生活及家用电器领域的应用
自从单片机诞生以后,它就步入了人类生活,如洗衣机、电冰箱、空调器、电子玩具、
电饭煲、视听音响设备等家用电器配上单片机后,提高了智能化程度,增加了功能,倍受人们喜爱。单片机将使人类生活更加方便、舒适、丰富多彩。
(4)在实时过程控制中的应用
用单片机实时进行数据处理和控制,使系统保持最佳工作状态,提高系统的工作效率和产品的质量。
(5)办公自动化设备
现代办公室使用的大量通信和办公设备多数嵌入了单片机。如打印机、复印机、传真机、绘图机、考勤机、电话以及通用计算机中的键盘译码、磁盘驱动等。
(6)商业营销设备
在商业营销系统中已广泛使用的电子称、收款机、条形码阅读器、IC卡刷卡机、出租车计价器以及仓储安全监测系统、商场保安系统、空气调节系统、冷冻保险系统等都采用了单片机控制。
(7)在计算机网络和通信领域中的应用
现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。
(8)单片机在医用设备领域中的应用
单片机在医用设备中的用途亦相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等。
(9)汽车电子产品
现代汽车的集中显示系统、动力监测控制系统、自动驾驶系统、通信系统和运行监视器(黑匣子)等都离不开单片机。
(10)航空航天系统和国防军事、尖端武器等领域
单片机的应用更是不言而喻。
综合所述,单片机已成为计算机发展和应用的一个重要方面。另一方面,单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。
基于单片机电子时钟的设计绪论单片机自20世纪70年代问世以来以其极高的性能价格比受到人们的重视和关注应用很广发展很快单片机体积小重…
单片机电子时钟的设计目录1引言12设计任务与要求221设计题目222设计要求23系统的功能分析与设计方案331系统的主要功能332…
JINGCHUUNIVERSITYOFTECHNOLOGY单片机原理及应用课程设计报告题目电子时钟专业电气工程及其自动化班级20x…
单片机课程设计电子钟一实现功能1能够实现准确计时以数字形式显示时分秒的时间2小时以24小时计时形式分秒计时为60进位能够调节时钟时…
目录一、引言二、设计课题三、系统总体方案四、系统硬件设计1.硬件电路原理图2.元件清单五、系统软件设计1.软件流程图2.程序清单六…
单片机数字钟设计心得体会经过一周的课程设计,我收获颇多,有深刻的心得体会。实训让我们受益匪浅。首先是关于单片机方面的。我们学到了许…
JINGCHUUNIVERSITYOFTECHNOLOGY单片机原理及应用课程设计报告题目电子时钟专业电气工程及其自动化班级20x…
单片机课程设计报告基于单片机的数字钟班级姓名学号设计时间单片机课程设计正文一引言现代社会科技飞速发展人们生活节奏加快时间就是金钱时…
单片机课程设计电子钟一实现功能1能够实现准确计时以数字形式显示时分秒的时间2小时以24小时计时形式分秒计时为60进位能够调节时钟时…
西安建筑科技大学课程设计论文第1章绪论1设计要求1系统可以按秒进行计时2数字时钟可以显示小时0023分钟0059和秒00593可通…