(1)系统可以按“秒”进行计时。
(2)数字时钟可以显示小时(00-23)、分钟(00-59)和秒(00-59)。
(3)可通过按键K1来选择设置“小时”、“分钟”和“秒”。设置时可通过“加”和“减”按键(K2、K3)来调整时间;设置过程中时钟停止计时。
(4)无键按下三秒后,自动进入时钟的计时程序。
采用AT89C51芯片作为硬件核心,其内部采用Flash ROM,具有4KB ROM 存储空间,能于3V的超低压工作,本系统的计时方案是利用单片机内部的定时/计数器进行中断定时, 配合软件延时实现对时、分、秒的计时。
整个系统的控制方案是:上电后系统自动进入时间显示,从00:00:00 开始计时。按下P1.0键,进入调秒状态,时钟停止计时;按P1.1或P1.2键可进行加1或减1操作;继续按P1.0键可分别进行分位、时调整;无键按下3秒钟后退出调整状态,自动进入时钟的计时和显示。
整个系统的硬件原理框图如图1.1,它采用的是AT89C51单片机,只用了P1口。为了简化硬件电路,LED显示采用了动态扫描的方式实现, LED采用共阳极数码管,驱动电流由三极管9012提供。为了提高计数精度,所采用的晶振频率为12MHz。
本课程选用AT89C51型号的单片机。 AT89C51 是美国ATMEL 公司生产的低电压,高性能CMOS8 位单片机,片内含4k bytes 的可反复擦写的只读程序存 储器(PEROM)和128 bytes 的随机存取数据存储器(RAM ),器件采用ATMEL 公司的高密度、非易失性存储技术生产, 兼容标准MCS-51 指令系统,片内置通用8 位 央处理器(CPU)和Flash 存储单元,功能强大AT89C51 单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。
主要性能参数:
·与MCS-51 产 指令系统完全兼容
·4k 字节可重擦写Flash 闪速存储器
·1000 次擦写周期
·全静态操作:0Hz-24MHz
·三级加密程序存储器
·128×8 字节内部RAM
·32 个可编程I /O 口线
·2 个16 位定时/计数器
由于系统要显示的内容较简单,显示量不多,所以选用数码管既方便又经济。LED有共阴极和共阳极两种。如图2.2所示。
二极管的阴极连接在一起,通常此公共阴极接地,而共阳极则将发光二极管的阳极连接在一起,接入+5V的电压。一位显示器由8个发光二极管组成,其中7个发光二极管构成字型“8”的各个笔划(段)a~g,另一个小数点为dp发光二极管。当在某段发光二极管施加一定的正向电压时,该段笔划即亮;不加电压则暗。为了保护各段LED不被损坏,需外加限流电阻。
图2.2 LED数码管结构原理图
众所周知,LED显示数码管通常由硬件7段译码集成电路,完成从数字到显示码的译码驱动。本系统采用软件译码,以减小体积,降低成本和功耗,软件译码的另一优势还在于比硬件译码有更大的灵活性。所谓软件译码,即由单片机软件完成从数字到显示码的转换。从LED数码管结构原理可知,为了显示字符,要为LED显示数码管提供显示段码,组成一个“8”字形字符的7段,再加上1个小数点位,共计8段,因此提供给LED数码管的显示段码为1个字节。各段码位与显示段的对应关系如表2.2。
表2.2 各段码位的对应关系
需说明的是当用数据口连接LED数码管a~dp引脚时,不同的连接方法,各段码位与显示段有不同的对应关系。通常数据口的D0位与a段连接,D1位与b段连接,……D7位与dp段连接,如表1所示,表2.3为用于LED数码管显示的十六进制数和空白字符与P的显示段码。
根据AT89C2051单片机灌电流能力强,拉电流能力弱的特点,我们选用共阳数码管。将AT89C2051的P1.0~P1.7分别与共阳数码管的a~g及dp相连,高电平的位对应的LED数码管的段暗,低电平的位对应的LED数码管的段亮,这样,当P0口输出不同的段码,就可以控制数码管显示不同的字符。例如:当P0口输出的段码为1100 0000,数码管显示的字符为0。
表2.3 LED显示段码
注:(1)本表所列各字符的显示段码均为小数点不亮的情况。
(2)“空白”字符即没有任何显示。
数码管显示器有二种工作方式,即静态显示方式和动态扫描显示方式。为节省端口及降低功耗,本系统采用动态扫描显示方式。动态扫描显示方式需解决多位LED数码管的“段控”和“位控”问题,本电路的“段控”(即要显示的段码的控制)通过P0口实现;而每一位的公共端,即LED数码管的“位控”,则由P3口控制。这种连接方式由于多位字段线连在一起,因此,要想显示不同的内容,必然要采取轮流显示的方式,即在某一瞬间,只让其中的某一位的字位线处于选通状态,其它各位的字位线处于断开状态,同时字段线上输出这一位相应要显示字符的字段码。在这一瞬时,只有这一位在显示,其他几位则暗。在本系统中,字位线的选通与否是通过PNP三极管的导通与截止来控制,即三极管处于“开关”状态。
主程序功能主要是初始化、正常现实时间和判断功能转换键。流程图如图3.1所示。
图3.1 主程序流程图
定时器T0用于时间计时。定时溢出中断周期可设为50ms,中断进入后,时钟计时累计20次(即1s)时,对秒计数单元进行加1操作。时钟计数单元在定义的6个单元70H~75H中, 70H~71H 存放秒数据, 72H~73H存放分数据, 74H~75H存放时数据。最大计时值为23小时59分59秒。在计数单元中采用十进制BCD码计数,秒、分、时之间满60进位。
数码管显示的数据放在内存单元70H~75H中,其中70H~71H存放秒数据, 72H~73H]存放分数据, 74H~75H存放时数据,每一单元内均为十进制BCD码。由于采用软件动态扫描实现数据显示功能,显示用的十进制BCD码数据的对应段码存放在ROM表中,显示时,先取出70H~75H中的某一地址中的数据,然后查表得对应的显示段码从P0口输出,P2口将对应的数码管位选中供电,就能显示该地址单元的数据值。
进行时间调整是,正在被调整的时间以闪烁的形式表现,定时器T1用于产生闪烁的时间间隔,每隔0.3s闪烁一次。
通过按键K1来选择设置“小时”、“分钟”和“秒”。
通过“加”和“减”按键(K2、K3)来调整时间
因为系统是动态显示,为了确保系统在有效显示时间范围内必须执行显示程序,所以使用延时程序。
这次课程设计项目虽然是最简单的数字时钟设计,但用的技术和知识是源于课本又远远高于课本的,比如说AT89C51基本操作知识,汇编语言方面的知识等。
我负责的是软件设计的时间设置以及T1中断部分,运用到了按键部分以及定时器/计数器部分的知识。通过这次自己编写程序,使我摆脱了以往单纯的理论知识学习状态,并且在和实际设计的结合锻炼了我的综合运用所学的专业基础知识。不过在这次课设中我也遇到了不少问题,实际操作时才发现课堂知识和实际运用还是有差距的,不过最终还是在老师或同学的帮助下一个一个解决了。
通过这次对课程设计,我也认识到自己对单片机应用方面的知识的贫乏,对于书本上的很多理论知识还不能灵活运用,有很多我们掌握的知识在等着我去学习,我会在以后的学习生活中弥补我所缺少的知识。同时还从中学到了一件很重要的东西,那就是如何从理论到实践的转化。此次的课程设计给我奠定了一个实践基础,我会在以后的学习,生活中磨练自己,使自己掌握更多的技术能力。
[1]杨忠义.单片机课程设计指导.北京:清华大学出版社,2009.201~217
[2]靳达.单片机应用系统开发实例导航.北京:人民邮电出版社,2004.1~37
[3]南建辉.MCS-51单片机原理及应用实例.北京:清华大学出版社,2004.92~117
[4]刘海成.单片机及应用系统设计原理与实践.北京:北京航天航空大学出版社,2009.129~180
ORG 0000H
AJMP MAINT ;转主程序
NOP
ORG 000BH
AJMP INT01 ;转定时器T0中断程序
NOP
ORG 001BH
AJMP INT11 ;转定时器T1中断程序
NOP
MAINT: MOV R0,#7FH ;00H~7FH单元清零
CLR A
WZ1: MOV @R0,A
DJNZ R0,WZ1
MOV SP,#30H ;置堆栈指针
MOV 5AH,#0AH ;放入“熄灭符”数据
MOV TMOD,#11H ;设T0,T1为16位定时器
MOV TL0,#0B0H ;置50 ms定时初值
MOV TH0,#3CH
MOV TL1,#0B0H
MOV TH1,#3CH
SETB EA ;开中断
SETB ET0 ;允许T0中断
SETB TR0 ;启动T0
MOV R4,#14H ;用于产生1 s定时
MAINT1: LCALL XSZCX ;调用显示子程序
JNB P1.0,SJTZ0 ;功能键按下,进入调时程序
SJMP MAINT
******T0中断服务程序******
INT01: PUSH ACC ;保护现场
PUSH PSW
CLR ET0 ;关T0中断
CLR TR0 ;关定时器T0
MOV A,#0B7H ;修正中断响应时间
ADD A,TL0
MOV TL0,A
MOV A,#3CH
ADDC A,TH0
SETB TR0 ;启动定时器T0
DJNZ R4,INT0U ;20次中断未到退出中断
AD1: MOV R4,#14H ;R4重新赋值
MOV R0,#51H ;指向秒计时单元(50H,51H)
LCALL ADD1 ;调用加1 s程序
MOV A,R3 ;秒数据放入A
CLR C ;清进位标志
CJNE A,#60H,AD2 ;小于60 s吗
AD2: JC INT0U ;小于60 s退出中断
CLR A ;大于或等于60 s,清秒计数单元
MOV @R0,A
DEC R0
MOV @R0,A
MOV R0,#57H ;指向分计时单元 (56H,57H)
ACALL ADD1 ;调用加1 min程序
MOV A,R3 ;分数据放入A
CLR C
CJNE A,#60H,AD3 ;小于60 min吗
AD3: JC INT0U ;小于60 min退出中断
CLR A ;大于或等于60 min,清分计数单元
MOV @R0,A
DEC R0
MOV @R0,A
MOV R0,#59H ;指向小时计时单元 (58H,59H)
ACALL ADD1 ;调用加1 h程序
MOV A,R3 ;小时数据放入A
CLR C
CJNE A,#24H,AD4 ;小于24 h吗
AD4: JC INT0U ;小于24 h退出中断
CLR A ;大于或等于24 h清小时计数单元
MOV @R0,A
DEC R0
MOV @R0,A
INT0U: MOV 52H,56H ;中断退出时将分、时计时单元数
MOV 53H,57H ;据移入对应显示单元
MOV 54H,58H
MOV 55H,59H
POP PSW ;恢复现场
POP ACC
SETB ET0 ;开放T0中断
RETI ;中断返回
******显示子程序******
XSZCX: MOV R1,#50H ;显示数据首址
MOV R5,#0FEH ;扫描控制字初值
MAXY: MOV A,R5 ;扫描控制字送A
MOV P2,A ;输出扫描控制字
MOV A,@R1 ;取显示数据
MOV DPTR,#ABC ;取段码表首地址
MOVC A,@A+DPTR ;取对应段码
MOV P1,A ;P1口输出段码
LCALL YS1MS ;延时1 ms
INC R1 ;显示地址增1
MOV A,R5 ;扫描控制字送A
JNB ACC.5,ENDOUT ;ACC.5为0时一次显示结束
RL A ;控制字左移
MOV R5,A ;制字送回R5中
AJMP MAXY ;循环显示下一个数据
ENDOUT: MOV P2,#0FFH ;一次显示结束,P2口复位
MOV P1,#0FFH ;P1口复位
RET ;子程序返回
****** T1中断服务程序******
INT11: PUSH ACC ;中断保护现场
PUSH PSW
MOV TL1,#0B0H ;装定时器T1初值
MOV TH1,#3CH
DJNZ R2,INT1U ;0.3 s未到退出中断
MOV R2,#06H ;重装0.3 s定时用初值
CPL 02H ;0.3 s定时到,对闪烁标志取反
JB 02H,CCC1 ;02H位为1时显示单元“熄灭”
MOV 52H,56H ;02H位为0时显示正常
MOV 53H,57H
MOV 54H,58H
MOV 55H,59H
INT1U: POP PSW ;恢复现场
POP ACC
RETI ;退出中断
INT0U: POP PSW ;恢复状态字(出栈)
POP ACC ;恢复累加器
RETI ;中断返回
******时钟时间调整程序******
SET0: LCALL XSZCX ;通过调用显示时间程序延时消抖动
JNB P1.0,SJTZ1
SJMP MAINT1 ;功能键没有按下,显示时间
SET1: CLR ET0 ;关闭定时器T0中断
CLR TR0 ;关闭定时器T0
MOV R2,#06H ;进入调时状态,置闪烁定时初值
SETB ET1 ;允许T1中断
SETB TR1 ;启动T1
SET2: JNB P1.0,SET1 ;P1.0端为0(键未释放),等待
CLR 01H ;置调分标志位为1
SET4: JB P1.0,SET3 ;等待键按下
JNB P1.0,HOUR ;有键按下,进入调小时状态
JB P1.0,SET10 ;等待键按下
JNB P1.0,MINUTE ;有键按下,进入调分状态
JB P1.0,SET12 ;等待键按下
JNB P1.0,SECOND ;有键按下,进入调秒状态
MOV A,R3 ;取要调整的单元数据
CLR C
KMTES: SETB ET0 ;省电状态,开T0中断
SETB TR0 ;启动T0(开时钟)
KMA: JB P1.0,$ ;无按键按下,等待
LCALL XSZCX ;通过调用显示时间程序延时消抖动
JB P1.1,KMA ;是干扰返回等待
KMA1: JNB P1.0,$ ;等待键释放
LJMP MAINT1 ;返回主程序,显示时间
HOUR: JNB P1.0,SET5 ;等待键释放
SETB 01H ;置调小时标志位
SET6: JB P1.0,SET9 ;等待键按下
LCALL TM3s ;有键按下延时3秒
LCALL XSZCX ;消抖
JNB P1.0,STOP ;按下时间大于3秒,退出调整状态
MOV R0,#70H ;小于3秒,调整小时
JB P1.1, SET3 ;等待键按下
JNB P1.1, ADD1 ;P1.1按下,调时间加1子程序
JB P1.2, SET3 ;等待键按下
JNB P1.2,SUB-H ;P1.2按下,调小时减1子程序
MOV A,R3
CLR C
CJNE A,#24H,BJ24 ;计时单元与24比较
BJ24: JC SET6, ;小于24转SET6循环
CLR A ;大于或等于24,则清零
MOV @R0,A
DEC R0
MOV @R0,A
AJMP SET6 ;转SET6循环
MINUTE: JNB P1.0,SET10 ;等待键释放
SETB 01H ;置调分钟标志位
SET7: JB P1.0,SET11 ;等待键按下
LCALL TM3s ;有键按下延时3秒
LCALL XSZCX ;消抖
JNB P1.0,STOP ;按下时间大于3秒,退出调整状态
MOV R0,#70H ;小于3秒,调整分钟
JB P1.1,SET11 ;等待键按下
JNB P1.1, ADD1 ;P1.1按下,调时间加1子程序
JB P1.2, SET11 ;等待键按下
JNB P1.2,SUB-M ;P1.2按下,调分减1子程序
MOV A,R3
CLR C
CJNE A,#60H,BJ601 ;计时单元与60比较
BJ601: JC SET7, ;小于24转SET7循环
CLR A ;大于或等于24,则清零
MOV @R0,A
DEC R0
MOV @R0,A
AJMP SET7 ;转SET7循环
SECOND: JNB P1.0,SET12 ;等待键释放
SETB 01H ;置调秒钟标志位
SET8: JB P1.0,SET13 ;等待键按下
LCALL TM3s ;有键按下延时3秒
LCALL XSZCX ;消抖
JNB P1.0,STOP ;按下时间大于3秒,退出调整状态
MOV R0,#70H ;小于3秒,调整分钟
JB P1.1,SET13 ;等待键按下
JNB P1.1, ADD1 ;P1.1按下,调时间加1子程序
JB P1.2, SET13 ;等待键按下
JNB P1.2,SUB-S ;P1.2按下,调时间减1子程序
MOV A,R3
CLR C
CJNE A,#60H,BJ602 ;计时单元与60比较
BJ602: JC SET8, ;小于24转SET8循环
CLR A ;大于或等于24,则清零
MOV @R0,A
DEC R0
MOV @R0,A
AJMP SET8 ;转SET8循环
OUT: JNB P1.0,SETOUT1 ;退出调时状态,等待键释放
LCALL XSZCX ;通过调用显示程序延时消抖动
JNB P1.0,SETOUT ;是抖动,返回SETOUT等待
MOV 20H,#00H ;清调时标志位
CLR TR1 ;关闭T1
CLR ET1 ;关T1中断
SETB TR0 ;启动T0
SETB ET0 ;开T0中断
LJMP MAINT1 ;返回主程序
SET1: LCALL XSZCX ;键释放等待时,调用显示子程序
AJMP SET2 ;防止此时无时钟显示
SET3: LCALL XSZCX ;等待调小时按键时时钟显示用
AJMP SET4 ;调时等待
SET5: LCALL XSZCX ;键释放等待时调用显示程序(调小时)
AJMP SETHH ;防止键按下时无时钟显示
SET9: LCALL XSZCX
AJMP SET6
SET10: LCALL XSZCX ;键释放等待时调用显示程序(调分钟)
AJMP SETHH ;防止键按下时无时钟显示
SET11: LCALL XSZCX
AJMP SET7
SET12: LCALL XSZCX ;键释放等待时调用显示程序(调秒钟)
AJMP SETHH ;防止键按下时无时钟显示
SET13: LCALL XSZCX
AJMP SET8
SETOUT1:LCALL XSZCX
AJMP OUT
****** 加1子程序******
ADD1: MOV A,@R0 ;取出现计时数据放入A
DEC R0 ;指向前一单元
SWAP A ;A中高4位与低4位互换
ORL A,@R0 ;前一单元中数据放入A中低4位
ADD A,#01H ;A加1
DA A ;十进制调整
MOV R3,A ;移入R3寄存器
ANL A,#0FH ;高4位变0
MOV @R0,A ;放回前一地址单元
MOV A,R3 ;取回R3中暂存数据
INC R0 ;指向当前地址单元
SWAP A ;A中高4位与低4位互换
ANL A,#0FH ;高4位变0
MOV @R0, A ;数据存入当前地址单元
RET ;子程序返回
****** 时减1子程序******
SUB-H: MOV A,@R0 ;取当前计时单元数据到A
DEC R0 ;指向前一地址
SWAP A ;A中数据高4位与低4位交换
ORL A,@R0 ;前一地址中数据放入A中低4位
JZ SUB-H1 ;00减1为23(小时)
DEC A ;A减1操作
SUB-H11: MOV R3,A ;移入R3寄存器
ANL A,#0FH ;高4位变0
CLR C ;清进位标志
SUBB A,#0FH; ;时个位是否大于9
SUB-H111: JC SUB-H110
MOV @R0,#09H ;大于等于0AH,为9
SUB-H10: MOV A,R3 ;取回R3中暂存数据
INC R0 ;指向当前地址单元
SWAP A ;A中数据高4位与低4位交换
ANL A,#0FH ;高4位变0
MOV @R0,A ;时十位数据放入
RET ; 子程序返回
SUB-H1: MOV A,#23H
AJMP SUB-H11
SUB-H110: MOV A,R3 ;时个位小于0A不处理
ANL A,#0FH ;高4位变0
MOV @R0,A ;时个位数据放入
AJMP SUB-H10
******分减1子程序******
SUB-M: MOV A,@R0 ;取当前计时单元数据到A
DEC R0 ;指向前一地址
SWAP A ;A中数据高4位与低4位交换
ORL A,@R0 ;前一地址中数据放入A中低4位
JZ SUB-M1
DEC A ;A减1操作
SUB-M11: MOV R3,A ;移入R3寄存器
ANL A,#0FH ;高4位变0
CLR C ;清进位标志
SUBB A,#0AH;
SUB-M111: JC SUB-M110
MOV @R0,#09H ;大于等于0AH,为9
SUB-M10: MOV A,R3 ;取回R3中暂存数据
INC R0 ;指向当前地址单元
SWAP A ;A中数据高4位与低4位交换
ANL A,#0FH ;高4位变0
MOV @R0,A ;数据放入当前地址单元中
RET ; 子程序返回
SUB-M1: MOV A,#59H
AJMP SUB-M11
SUB-M110: MOV A,R3 ;移入R3寄存器
ANL A,#0FH ;高4位变0
MOV @R0,A
AJMP SUB-M10
****** 秒减1子程序******
SUB-S: MOV A,@R0 ;取当前计时单元数据到A
DEC R0 ;指向前一地址
SWAP A ;A中数据高4位与低4位交换
ORL A,@R0 ;前一地址中数据放入A中低4位
JZ SUB-S1
DEC A ;A减1操作
SUB-S11: MOV R3,A ;移入R3寄存器
ANL A,#0FH ;高4位变0
CLR C ;清进位标志
SUBB A,#0BH;
SUB-S111: JC SUB-S110
MOV @R0,#09H ;大于等于0AH,为9
SUB-S10: MOV A,R3 ;取回R3中暂存数据
INC R0 ;指向当前地址单元
SWAP A ;A中数据高4位与低4位交换
ANL A,#0FH ;高4位变0
MOV @R0,A ;数据放入当前地址单元中
RET ; 子程序返回
SUB-S1: MOV A,#14H
AJMP SUB-S11
SUB-S110: MOV A,R3 ;移入R3寄存器
ANL A,#0FH ;高4位变0
MOV @R0,A
AJMP SUB-S10
******延时子程序******
TM1ms: MOV R6, #14H ;延时1 ms子程序
TM1: MOV R7,#19H
TM2: DJNZ R7,YS2
DJNZ R6,YS1
RET
TM3s: LCALL TM05s ;延时3s子程序
LCALL TM05s
LCALL TM05s
LCALL TM05s
LCALL TM05s
LCALL TM05s
RET
TM05s: MOV R3,#51H ;延时0.5 s子程序
YS05s1:LCALL XSZCX
DJNZ R3,YS05s1
RET
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
END
目录
第1章 绪论. 1
1. 设计要求. 1
2. 设计方案. 1
第2章 硬件设计. 2
1 单片机的选择. 2
2. 显示方案. 2
第3章 软件设计. 5
1. 主程序. 5
2. 定时器T0中断服务程序. 5
3. 显示子程序. 5
4. 定时器T1中断服务程序. 6
5. 调时功能程序. 6
6. 延时程序... 7
7. 结论... 7
8.参考文献. 8
附录. 9
单片机课程设计电子钟一实现功能1能够实现准确计时以数字形式显示时分秒的时间2小时以24小时计时形式分秒计时为60进位能够调节时钟时…
单片机课程设计报告基于单片机的数字钟班级姓名学号设计时间单片机课程设计正文一引言现代社会科技飞速发展人们生活节奏加快时间就是金钱时…
科技创新实践[数字时钟设计][用AT89S52单片机设计电子时钟的实验报告]目录单片机的个性化电子钟设计报告1一、设计背景1二、作…
西安建筑科技大学课程设计论文第1章绪论1设计要求1系统可以按秒进行计时2数字时钟可以显示小时0023分钟0059和秒00593可通…
JINGCHUUNIVERSITYOFTECHNOLOGY单片机原理及应用课程设计报告题目电子时钟专业电气工程及其自动化班级20x…
单片机数字钟设计心得体会经过一周的课程设计,我收获颇多,有深刻的心得体会。实训让我们受益匪浅。首先是关于单片机方面的。我们学到了许…
JINGCHUUNIVERSITYOFTECHNOLOGY单片机原理及应用课程设计报告题目电子时钟专业电气工程及其自动化班级20x…
单片机课程设计报告基于单片机的数字钟班级姓名学号设计时间单片机课程设计正文一引言现代社会科技飞速发展人们生活节奏加快时间就是金钱时…
单片机课程设计电子钟一实现功能1能够实现准确计时以数字形式显示时分秒的时间2小时以24小时计时形式分秒计时为60进位能够调节时钟时…
科技创新实践[数字时钟设计][用AT89S52单片机设计电子时钟的实验报告]目录单片机的个性化电子钟设计报告1一、设计背景1二、作…
目录摘要21设计目的22设计内容221设计任务222扩展23系统方案及设计原理331方案选择332数字钟的基本工作原理333底层元…