89C51单片机时钟程序_89c51单片机时钟程序
89C51单片机时钟程序由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“89c51单片机时钟程序”。
SECOND EQU 40H
;给内存RAM空间中40H单元起名SECOND MINUTE EQU 41H
;给内存RAM空间中41H单元起名MINUTE HOUR EQU 42H
;给内存RAM空间中42H单元起名HOUR SECONDGEWEI EQU 43H
;给43H单元起名SECONDGEWEI存秒的个位 SECONDSHIWEI EQU 44H
;给44H单元起名SECONDSHIWEI存秒的十位 MINUTEGEWEI EQU 45H
;给45H单元起名MINUTEGEWEI存分的个位 MINUTESHIWEI EQU 46H
;给46H单元起名MINUTESHIWEI存分的十位 HOURGEWEI EQU 47H
;给47H单元起名HOURGEWEI存小时的个位 HOURSHIWEI EQU 48H
;给48H单元起名HOURSHIWEI存小时的十位 ORG 0000H
;复位时程序从此开始 SJMP START
;跳到START进行初始化 ORG 000BH
;定时器 0中断入口 AJMP TIMER0
;跳转到TIMER0处
ORG 0030H
;初始化程序从30H开始;---------------初始化START------------------------------START:
MOV SECOND, #0
;给秒存储单元SECOND赋初始值0 MOV MINUTE, #0
;给分存储单元MINUTE赋初始值0 MOV HOUR , #12
;给小时存储单元HOUR赋初始值12 MOV DPTR , #TAB
;给数据指针赋值,将DPTR指向TAB数据表头处 MOV 30H, #0
;给30H单元赋初始值0(用于计20次的50ms中断)MOV TH0,#3CH
;给计数容器的高8位TH0赋初始值3CH MOV TL0,#0B0H
;给计数容器的低8位TL0赋初始值B0H MOV TMOD,#00000001B
;C/T位设置为0,M1M0设置位10,即模式1定时 MOV TCON,#00010000B
;TR0设置为1,即启动定时器0开始工作 SETB ET0
;IE中的ET0位设置为1,开定制器中断0 SETB EA
;IE中的EA位设置为1,开总中断;-----------------------主程序MAIN-----------------------------MAIN:CALL KEY
;调按键子程序KEY CALL PROCESS
;调数据处理子程序PROCESS CALL DISPLAY
;调显示子程序DISPLAY SJMP MAIN
;跳转到MAIN标号处;------------------------------按键子程序KEY调时-------------------KEY:MOV P1,#0FEH
;行扫描 LCALL DELAY
;JNB P1.4,HOURJIA
;P1.4引脚如果是低电平就跳到HOURJIA处
JNB P1.5,HOURJIAN
;P1.5引脚如果是低电平就跳到HOURJIAN处 JNB P1.6,MINUTEJIA
;P1.6引脚如果是低电平就跳到MIMUTEJIA处 JNB P1.7,MINUTEJIAN
;P1.7引脚如果是低电平就跳到MIMUTEJIAN处 FANHUI:RET
;子程序返回(如果没有按键按下)
HOURJIA:CALL DELAY
;调延时程序目的是跳过按键抖动期(去抖)JB P1.4,FANHUI
;P1.4如果是高电平就跳到FANHUI处(没键按)JNB P1.4,$
;如果P1.4是低电平就停在当前位置等键释放 MOV R4,HOUR CJNE R4,#23,A1
;判断时数字是否为23 AJMP A2
A1:INC HOUR
;把小时位加1 MOV SECOND, #0
;小时进位,秒归0
RET
A2:MOV HOUR,#0
;小时数为23时加一为0
MOV SECOND, #0
;小时进位,秒归0
RET
;子程序返回
HOURJIAN:CALL DELAY
;调延时程序目的是跳过按键抖动期(去抖)JB P1.5,FANHUI
JNB P1.5,$
MOV R5,HOUR CJNE R5,#0,A3
AJMP A4 A3:DEC HOUR
MOV SECOND, #0
RET A4:MOV HOUR,#23
MOV SECOND, #0 RET
MINUTEJIA:CALL DELAY
JB P1.6,FANHUI
JNB P1.6,$
MOV R6,MINUTE
CJNE R6,#59,A5
AJMP A6 A5:INC MINUTE
MOV SECOND, #0
RET A6:MOV SECOND, #0
MOV MINUTE, #0
MOV R4,HOUR CJNE R4,#23,A10
MOV HOUR,#0
RET A10:INC HOUR
RET
MINUTEJIAN:CALL DELAY
JB P1.7,FANHUI
JNB P1.7,$
MOV R7,MINUTE CJNE R7,#0,A7
AJMP A8 A7:DEC MINUTE
;P1.5如果是高电平就跳到FANHUI处(没键按)
;如果P1.5是低电平就停在当前位置等键释放
;判断时数字是否为23
;把小时位减1
;小时数为0时减一为23
;子程序返回
;调延时程序目的是跳过按键抖动期(去抖)
;P1.6如果是高电平就跳到FANHUI处(没键按)
;如果P1.6是低电平就停在当前位置等键释放
;判断分钟数是否为59
;把分钟位加1
;给秒存储单元SECOND赋初始值0
;分钟数为59则分钟归0
;判断时数字是否为23
;23时增1归0
;分钟数为59 自增1后小时增1
;子程序返回
;调延时程序目的是跳过按键抖动期(去抖)
;P1.7如果是高电平就跳到FANHUI处(没键按)
;如果P1.7是低电平就停在当前位置等键释放
;判断分钟数是否为0
;分钟不为0把分钟位减1
MOV SECOND, #0
RET
A8:MOV MINUTE, #59
;分钟数为0时减一为59 MOV R4,HOUR CJNE R4,#0,A9
;判断时钟数是否为0 MOV HOUR,#23
;时钟数为0减1为23 MOV SECOND, #0 RET
A9:DEC HOUR
;时钟数不为0则减1 MOV SECOND, #0
RET
;子程序返回;-------------------处理子程序PROCESS-----------------------PROCESS:MOV A, SECOND
;把SECOND中的秒值拷贝给A MOV B, #10
;给寄存器B赋值10 DIV AB
;A除以B,结果存入A中,余数存入B中 MOV SECONDSHIWEI , A
;结果即秒的十位数拷贝给SECONDSHIWEI MOV SECONDGEWEI , B
;余数即秒的个位拷贝给SECONDGEWEI MOV A, MINUTE
;把MINUTE中的分值拷贝给A MOV B, #10
;给寄存器B赋值10 DIV AB
;A除以B,结果存入A中,余数存入B中 MOV MINUTESHIWEI , A
;结果即分的十位拷贝给MINUTESHIWEI MOV MINUTEGEWEI , B
;余数即分的个位拷贝给MINUTEGEWEI MOV A, HOUR
;把HOUR中的小时值拷贝给A MOV B, #10
;给寄存器B赋值10 DIV AB
;A除以B,结果存入A中,余数存入B中 MOV HOURSHIWEI , A
;结果即小时的十位拷贝给HOURSHIWEI MOV HOURGEWEI , B
;余数即小时的个位拷贝给HOURGEWEI RET
;子程序结束返回到主程序;-----------------显示子程序DISPLAY--------------DISPLAY:MOV A, HOURSHIWEI
;小时的十位拷贝给A MOVC A, @A+DPTR
;到A+DPRT这个数对应的地方找显示段码拷贝给A MOV P0, A
;把显示段码(小时的十位)送到P0 CLR P2.0
;将P2.0置低电平,对应的三极管导通 CALL DELAY
;调延时(让显示小时十位的数码管持续亮一段时间)SETB P2.0
;将P2.0置高电平,对应三极管截止,对应数码管灭 MOV A, HOURGEWEI
;小时的个位拷贝给A MOVC A,@A+DPTR
;到A+DPRT这个数对应的地方找显示段码拷贝给A MOV P0, A
;把显示段码(小时的个位)送到P0 CLR P2.1
;将P2.1置低电平,对应的三极管导通
CALL DELAY
;调延时(让显示小时个位的数码管持续亮一段时间)SETB P2.1 MOV P0,#7FH CLR P2.1 CALL DELAY SETB P2.1
;将P2.1置高电平,对应三极管截止,对应数码管灭 MOV A, MINUTESHIWEI
;分钟的十位拷贝给A MOVC A,@A+DPTR
;到A+DPRT这个数对应的地方找显示段码拷贝给A MOV P0, A
;把显示段码(分钟的十位)送到P0 CLR P2.2
;将P2.2置低电平,对应的三极管导通 CALL DELAY
;调延时(让显示分钟十位的数码管持续亮一段时间)SETB P2.2
;将P2.2置高电平,对应三极管截止,对应数码管灭 MOV A, MINUTEGEWEI
;分钟的个位拷贝给A MOVC A,@A+DPTR
;到A+DPRT这个数对应的地方找显示段码拷贝给A MOV P0, A
;把显示段码(分钟的个位)送到P0 CLR P2.3
;将P2.3置低电平,对应的三极管导通
CALL DELAY
;调延时(让显示分钟个位的数码管持续亮一段时间)SETB P2.3
;将P2.3置高电平,对应三极管截止,对应数码管灭
MOV P0,#7FH CLR P2.3 CALL DELAY SETB P2.3
MOV A, SECONDSHIWEI
;秒的十位拷贝给A MOVC A,@A+DPTR
;到A+DPRT这个数对应的地方找显示段码拷贝给A MOV P0, A
;把显示段码(秒钟的十位)送到P0 CLR P2.4
;将P2.4置低电平,对应的三极管导通 CALL DELAY
;调延时(让显示秒钟十位的数码管持续亮一段时间)SETB P2.4
;将P2.4置高电平,对应三极管截止,对应数码管灭 MOV A, SECONDGEWEI
;秒的个位拷贝给A MOVC A,@A+DPTR
;到A+DPRT这个数对应的地方找显示段码拷贝给A MOV P0, A
;把显示段码(秒钟的个位)送到P0 CLR P2.5
;将P2.5置低电平,对应的三极管导通
CALL DELAY
;调延时(让显示秒钟个位的数码管持续亮一段时间)SETB P2.5
;将P2.5置高电平,对应三极管截止,对应数码管灭 RET
;显示子程序结束返回主程序;--------------------中断服务子程序----------------------------TIMER0:MOV R3, A
;把A中的数据送入R3保护起来 INC 30H
;30H单元中的数加1 MOV A, 30H
;30H单元中的数据拷贝给A CJNE A,#20,JIXU
;A中的数据与20比较不相等就跳转到JIXU处 MOV 30H,#0
;(如果30H单元计满20了)给30H赋值0 INC SECOND
;把SECOND中的秒钟数加1 MOV A,SECOND
;把SECOND中的数据拷贝给A CJNE A, #60, JIXU
;A中的数据与60比较不相等就跳转到JIXU处 MOV SECOND, #0
;给秒SECOND赋值0 INC MINUTE
;把MINUTE中的分钟数加1 MOV A, MINUTE
;把MINUTE中的数据拷贝给A CJNE A, #60, JIXU
;A中的数据与60比较不相等就跳转到JIXU处 MOV MINUTE, #0
;给分钟MINUTE赋值0 INC HOUR
;把HOUR中的小时数据加1 MOV A, HOUR
;把HOUR中的数据拷贝给A CJNE A, #24, JIXU
;A中的数据与24比较不相等就跳转到JIXU处 MOV HOUR, #0
;给小时HOUR赋值0 JIXU: MOV A,R3
;把刚才送入R3中的数据还给A MOV TH0,#3CH
;给计数容器的高8位TH0赋初始值3CH MOV TL0,#0B0H
;给计数容器的低8位TL0赋初始值B0H RETI
;中断子程序返回主程序;---------------------------延时子程序----------------------------DELAY:MOV R0, #50
;给R0赋值50 D2:MOV R1, #10
;给R1赋值10 D1:DJNZ R1, D1
;R1减1不等于0跳到D1处 DJNZ R0, D2
;R0减1不等于0跳到D2处
RET
;延时子程序结束返回调用该程序的下一条;---------------下面的数据表中存储的是显示段码(共阳)-------------------TAB:DB 0C0H,0F9H,0A4H,0B0H,99H
;从TAB处开始存储0、1、2、3、4
DB 92H ,82H ,0F8H,80H ,90H
;5、6、7、8、9对应的显示段码 END
;程序结束