org 00h
ajmp start
org 03h
ajmp jia
org 0bh
ajmp saomiao
org 13h
ajmp jian
org 1bh
ajmp jishu
org 2bh
start:
mov ie,#10001111b
mov ip,#00000010b
mov tmod,#00100010b
mov th1,#6
mov tl1,#6
mov th0,#88h
mov tl0,#88h
setb it1
setb it0
mov r4,#11111110b
mov sp,#30h
mov 20h,#00h
mov p3,#0ffh
mov r0,#00h
mov r1,#00h
mov r2,#00h
mov r3,#00h
mov r5,#00h
mov dptr,#table
setb tr1
setb tr0
loop:
mov a,r0
mov b,#40
div ab
jz chuli
mov r0,#00h
inc r5
mov a,r5
mov b,#100
div ab
jz chuli
cpl 20h7
mov r5,#00h
inc r1
mov a,r1
cpl a
mov p2,a
cpl a
mov b,#60
div ab
jz chuli
mov r1,#00h
inc r2
mov a,r2
mov b,#60
div ab
jz chuli
mov r2,#00h
inc r3
mov a,r3
mov b,#24
div ab
jz chuli
mov r3,#00h
chuli:
mov a,r2
mov b,#10
div ab
mov 10h,b
mov 11h,a
mov a,r3
mov b,#10
div ab
mov 12h,b
mov 13h,a
jb p34,loop
mov r1,#00h
mov 87h,#01h
ljmp loop
jia:
push acc
inc r2
mov a,r2
mov b,#60
div ab
jz next1
mov r2,#00h
next1:
lcall ys
clr ie0
pop acc
reti
jian:
push acc
inc r3
mov a,r3
mov b,#24
div ab
jz next2
mov r3,#00h
next2:
lcall ys
clr ie1
pop acc
reti
jishu:
inc r0
reti
saomiao:
push acc
mov a,r4
rl a
mov p0,#0ffh
d0:
cjne a,#11111110b,d1
mov p1,a
mov r4,a
mov a,11h
jnz zc
mov a,r4
rl a
mov p1,a
zc:
mov a,10h
movc a,@a+dptr
mov p0,a
sjmp over
d1:
cjne a,#11111101b,d2
mov p1,a
mov r4,a
mov a,11h
jz over
movc a,@a+dptr
mov p0,a
sjmp over
d2:
cjne a,#11111011b,d3
mov p1,a
mov r4,a
mov a,12h
movc a,@a+dptr
mov p0,a
mov c,20h7
mov p07,c
sjmp over
d3:
cjne a,#11110111b,d4
mov p1,a
mov r4,a
mov a,13h
jz over
movc a,@a+dptr
mov p0,a
sjmp over
d4:
mov a,#11111110b
ajmp d0
over:
pop acc
reti
ys:
mov 14h,#0ffh
a0:
mov 15h,#0ffh
a1:
djnz 15h,a1
djnz 14h,a0
ret
table:
db 0c0h
db 0f9h
db 0a4h
db 0b0h
db 099h
db 092h
db 082h
db 0f8h
db 080h
db 090h
end
CC BIT 00H
DD EQU 31H
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP INT_0
ORG 000BH
AJMP TIME
ORG 0013H
AJMP INT_1
ORG 30H
MAIN:
MOV R0,#00H
MOV R1,#00H
MOV R2,#03H
MOV R3,#00H
MOV R4,#00H
MOV R5,#00H
MOV R6,#00H
MOV R7,#00H
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV TH0,#06H
MOV TL0,#06H
MOV DPTR,#200H
MOV TMOD,#02H
SETB EA
SETB EX0
SETB EX1
SETB IT0
SETB IT1
SETB ET0
SETB TR0
SETB CC
SHOW:
CJNE R7,#0FAH,OUT
MOV R7,#00H
INC R6
CJNE R6,#10H,OUT
MOV R6,#00H
INC R5
CJNE R5,#3CH,OUT
MOV R5,#00H
INC R4
CJNE R4,#3CH,OUT
MOV R4,#00H
INC R3
CJNE R3,#18H,OUT
MOV R3,#00H
OUT:
CJNE R2,#00H,SHOW_OUT_01
INC R1
CJNE R1,#3CH,R1_1
MOV R1,#00H
INC R0
CJNE R0,#20H,R1_1
MOV R0,#00H
CPL CC
R1_1:
MOV A,R5
MOV B,#0AH
DIV AB
MOVC A,@A+DPTR
MOV P0,A
MOV C,CC
MOV P22,C
CALL DELAY
SETB P22
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
MOV C,CC
MOV P23,C
CALL DELAY
SETB P23
MOV A,R4
MOV B,#0AH
DIV AB
MOVC A,@A+DPTR
MOV P0,A
CLR P20
CALL DELAY
SETB P20
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
CLR P21
CALL DELAY
SETB P21
SHOW_OUT_01:
CJNE R2,#01,SHOW_OUT_02
INC R1
CJNE R1,#3CH,R2_1
MOV R1,#00H
INC R0
CJNE R0,#20H,R2_1
MOV R0,#00H
CPL CC
R2_1:
MOV A,R5
MOV B,#0AH
DIV AB
MOVC A,@A+DPTR
MOV P0,A
CLR P22
CALL DELAY
SETB P22
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
CLR P23
CALL DELAY
SETB P23
MOV A,R4
MOV B,#0AH
DIV AB
MOVC A,@A+DPTR
MOV P0,A
MOV C,CC
MOV P20,C
CALL DELAY
SETB P20
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
MOV C,CC
MOV P21,C
CALL DELAY
SETB P21
SHOW_OUT_02:
CJNE R2,#02,SHOW_OUT_03
INC R1
CJNE R1,#3CH,R3_1
MOV R1,#00H
INC R0
CJNE R0,#20H,R3_1
MOV R0,#00H
CPL CC
R3_1:
MOV A,R3
MOV B,#0AH
DIV AB
MOVC A,@A+DPTR
MOV P0,A
MOV C,CC
MOV P20,C
CALL DELAY
SETB P20
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
MOV C,CC
MOV P21,C
CALL DELAY
SETB P21
SHOW_OUT_03:
CJNE R2,#03H,SHOW_OUT_04
MOV A,R4
MOV B,#0AH
DIV AB
MOVC A,@A+DPTR
MOV P0,A
CLR P22
CALL DELAY
SETB P22
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
CLR P23
CALL DELAY
SETB P23
MOV A,R3
MOV B,#0AH
DIV AB
MOVC A,@A+DPTR
MOV P0,A
CLR P20
CALL DELAY
SETB P20
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
CLR P21
CALL DELAY
SETB P21
SHOW_OUT_04:
CJNE R2,#04H,SHOW_JMP
MOV A,R5
MOV B,#0AH
DIV AB
MOVC A,@A+DPTR
MOV P0,A
CLR P22
CALL DELAY
SETB P22
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
CLR P23
CALL DELAY
SETB P23
MOV A,R4
MOV B,#0AH
DIV AB
MOVC A,@A+DPTR
MOV P0,A
CLR P20
CALL DELAY
SETB P20
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
CLR P21
CALL DELAY
SETB P21
SHOW_JMP:
AJMP SHOW
DELAY:
MOV DD,#10H
DJNZ DD,$
RET
TIME:
INC R7
RETI
INT_0:
CLR EX0
INC R2
CLR TR0
CJNE R2,#03H,INT_0_OUT
SETB TR0
AJMP INT_0_OUT_1
INT_0_OUT:
CJNE R2,#04H,INT_0_TR0
SETB TR0
AJMP INT_0_OUT_1
INT_0_TR0:
CJNE R2,#05H,INT_0_OUT_1
MOV R2,#00
INT_0_OUT_1:
CALL DELAY
CALL DELAY
SETB EX0
RETI
INT_1:
CLR EX1
CJNE R2,#00H,INT_1_NEXT_1
INC R5
CJNE R5,#3CH,INT_1_OUT
MOV R5,#00H
AJMP INT_1_OUT
INT_1_NEXT_1:
CJNE R2,#01H,INT_1_NEXT_2
INC R4
CJNE R4,#3CH,INT_1_OUT
MOV R4,#00H
AJMP INT_1_OUT
INT_1_NEXT_2:
CJNE R2,#02H,INT_1_OUT
INC R3
CJNE R3,#18H,INT_1_OUT
MOV R3,#00H
AJMP INT_1_OUT
INT_1_OUT:
CALL DELAY
CALL DELAY
SETB EX1
RETI
ORG 200H
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
我很久以前写的看对你有没有用。我用的是89S51
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;系统名称: 数字钟
;创健人:济南, 日期:2005619
;系统功能描述:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;修改人: 修改日期:
;修改原因:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;蕊片型号:AT89C51 晶振:12MHZ
;-------------硬件连接---------------------
;
;
;-----------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称: 声明区
;功能描述: 声明各常量和变量
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SECOND EQU 30H ;存储妙
MINITE EQU 31H ;存储分
HOUR EQU 32H ;存储时
SPEAKER BIT P37
HOURK BIT P32 ;时键
MINITEK BIT P33 ;分键
SECONDK BIT P30 ;妙键
FLAG BIT 00H
FLAG1S BIT 01H ;1S到标志位
DISPBUF EQU 40H ; 段选标志
DISPBIT EQU 48H ; 位选通标志
T2SCNTA EQU 49H ; 中断次数
T2SCNTB EQU 4AH ; 中断次数
TEMP EQU 4BH ; 初始化位
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:主程序
;功能描述;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0 ;T0中断入口
START: MOV SECOND,#00H ;妙初始化0
MOV MINITE,#00H ;分初始化0
MOV HOUR,#12 ;时始化送12
MOV DISPBIT,#00H ;位选通标志
MOV T2SCNTA,#00H ;标志
MOV T2SCNTB,#00H ;标志
CLR FLAG
CLR FLAG1S
SETB SPEAKER
MOV TEMP,#07FH ;初始位,让第一个位选通
LCALL DISP ;调用显示处理程序
MOV TMOD,#01H ;方式1
MOV TH0,#0F8H ;赋值20MS
MOV TL0,#030H
SETB TR0 ;开中断启动
SETB ET0
SETB EA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:按键程序
;功能描述;调整分,时
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WT: JNB FLAG,CC
LCALL SPEAKING
CC: JB SECONDK,NK1 ;妙末按下,转去判断分键
LCALL DELY10MS ;按下,延时,消抖动
JB SECONDK,NK1 ;再次判断是否按下
INC SECOND ;按下,按下一次加1
MOV A,SECOND ;送A判断
CJNE A,#60,NS60 ;妙末到60转分
MOV SECOND,#00H ;到了,回0
NS60: LCALL DISP
JNB SECONDK,$ ;等待妙键释放
NK1: JB MINITEK,NK2 ;跟妙键分析相似
LCALL DELY10MS
JB MINITEK,NK2
INC MINITE
MOV A,MINITE
CJNE A,#60,NM60
MOV MINITE,#00H
NM60: LCALL DISP
JNB MINITEK,$
NK2: JB HOURK,NK3 ;时键
LCALL DELY10MS
JB HOURK,NK3
INC HOUR
MOV A,HOUR
CJNE A,#24,NH24
MOV HOUR,#00H
NH24: LCALL DISP
JNB HOURK,$ ;等待时键释放
NK3: LJMP WT ;返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:显示处理程序
;功能描述;,该程序实现时,分,秒计时转换为BCD码并存储在以47H起始地址的显示
;输出数据存储单元里,即显示缓冲区47H至40H单元
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISP:
MOV A,#DISPBUF ;送40H
ADD A,#7 ;加8
;DEC A
MOV R1,A ;送47H
MOV A,HOUR ;送时
MOV B,#10
DIV AB
MOV @R1,A ;存储时十位
DEC R1 ;指向时个位
MOV A,B ;送时个位
MOV @R1,A ;存储时个位
DEC R1
MOV A,#10
MOV @R1,A
DEC R1
MOV A,MINITE ; 送分,处理与时处理类似
MOV B,#10
DIV AB
MOV @R1,A
DEC R1
MOV A,B
MOV @R1,A
DEC R1
MOV A,#10
MOV @R1,A
DEC R1
MOV A,SECOND ;送秒
MOV B,#10
DIV AB
MOV @R1,A
DEC R1
MOV A,B
MOV @R1,A
DEC R1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:显示程序
;功能描述;在LED上显示为12-12-12显示模式
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INT_T0:
MOV TH0,#0F8H ;重赋值
MOV TL0,#030H
MOV A,#DISPBUF ;段偏移存储
ADD A,DISPBIT ;位偏移量
MOV R0,A ;段偏移存储
MOV A,@R0 ;段偏移量
MOV DPTR,#TABLE ;指向字形表
MOVC A,@A+DPTR ;取字形
MOV P0,#0 ;防闪烁
MOV P0,A ; 字形选P1口显示
MOV A,DISPBIT ;位移偏量
MOV DPTR,#TAB ;指向位选
MOVC A,@A+DPTR ;取位选通
MOV P2,A ;位送P3口选通
INC DISPBIT ;位偏移加1
MOV A,DISPBIT ;位偏移送A
CJNE A,#08H,KNA ;八个数管码扫描完不
MOV DISPBIT,#00H ;描完重新开始
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:1秒计时程序
;功能描述;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KNA: INC T2SCNTA
MOV A,T2SCNTA
CJNE A,#100,DONE
MOV T2SCNTA,#00H
INC T2SCNTB
MOV A,T2SCNTB
CJNE A,#05H,DONE
SETB FLAG1S
MOV T2SCNTB,#00H
INC SECOND ;秒加1
MOV A,SECOND
CJNE A,#50,BB ;50S到
MOV A,MINITE
CJNE A,#59,BB ;59分
SETB FLAG ;打开正点响标志
BB: MOV A,SECOND
CJNE A,#60,NEXT ;秒超过60了没有 没有,调用显示处理程序
MOV SECOND,#00H
INC MINITE ;分加1
MOV A,MINITE
CJNE A,#60,NEXT
MOV MINITE,#00H ;分超过60,清0
INC HOUR ;并时加1
MOV A,HOUR
CJNE A,#24,NEXT ;是否超过24小时不是,则跳至NEXT
MOV HOUR,#00H
NEXT: LCALL DISP ; 调用显示处理程序
DONE: RETI ;中断返回
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H ;0到9字形(40表示横扛)
TAB: DB 07FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:正点报时子程序
;功能描述; 前十秒报第一声,每隔一秒报一声
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SPEAKING:MOV R5,#6
AA: CLR SPEAKER
JNB FLAG1S,$ ;延时1S
CLR FLAG1S
SETB SPEAKER
JNB FLAG1S,$
CLR FLAG1S
DJNZ R5,AA
CLR FLAG
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:延时子程序
;功能描述;按键消抖调用
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELY10MS:MOV R6,#10
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
#include "reg52h"
#define uint unsigned int
#define uchar unsigned char
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar shi,fen,miao;
uchar time;
void delay(uint x)
{
uint y;
for(;x>0;x--)
{
for(y=0;y<124;y++);
}
}
void display(uchar shi,uchar fen,uchar miao)
{
P2=0; //位码
P0=(tab[shi/10]); //段码
delay(2);
P2=1;
P0=(tab[shi%10]);
delay(2);
P2=2; //位码
P0=0x40; //段码
delay(2);
P2=3; //位码
P0=(tab[fen/10]); //段码
delay(2);
P2=4;
P0=(tab[fen%10]);
delay(2);
P2=5; //位码
P0=0x40; //段码
delay(2);
P2=6; //位码
P0=(tab[miao/10]); //段码
delay(2);
P2=7;
P0=(tab[miao%10]);
delay(2);
}
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(time==20)
{
time=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
display(shi,fen,miao);
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
}
/还有什么不明白继续追加/
以上就是关于单片机设计数字电子钟的程序全部的内容,包括:单片机设计数字电子钟的程序、求51单片机电子钟汇编程序、跪求一个MCS51单片机的电子时钟设计程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)