89C51单片机时钟程序_89c51单片机时钟程序

2020-02-27 其他范文 下载本文

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

;程序结束

《89C51单片机时钟程序.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
89C51单片机时钟程序
点击下载文档
相关专题 89c51单片机时钟程序 单片机 时钟 程序 89c51单片机时钟程序 单片机 时钟 程序
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文