----
;========================================================start
; MOV 8EH,#0C0H ;T0,T1=12倍速C51(STC2501)
CHA DATA 10H
CHS DATA 11H ;秒單元
CHM DATA 12H ;分單元
CHH DATA 13H ;時單元
NG DATA 14H
NS DATA 15H
;----------------BEGIN
ORG 0000H
LJMP main
ORG 000BH
LJMP CLOCK
ORG 030H
main: MOV P1,#0FFH
MOV P3,#0FFH
MOV CHA,#00H
MOV CHS,#00H
MOV CHM,#00H
MOV CHH,#00H
MOV NG,#00H
MOV NS,#00H
;===========
MOV TMOD,#01H ;定時器0控制字
MOV TL0,#0B0H ;{TL0=B0H,TH=3C}=1S
MOV TH0,#3CH
SETB ET0
SETB TR0
SETB EA
MOV DPTR,#LED
;-------DisplayProgram
;-------第壹、二位
F1: MOV A,CHS ;將H中的十六進制數轉換成10進制
MOV B,#10 ;10進制/10=10進制
DIV AB
MOV NS,A
MOV NG,B
MOV A,NG
MOVC A,@A+DPTR ;查個位數的7段代碼
MOV P1,A ;送出個位的7段代碼
MOV P3,#11111110B
CALL DEL1MS ;顯示1ms
MOV A,NS ;取十位數
MOVC A,@A+DPTR ;查十位數的7段代碼
MOV P1,A ;送出十位的7段代碼
MOV P3,#11111101B
CALL DEL1MS ;顯示1ms
;-------第三、四位
MOV A,CHM ;將H中的十六進制數轉換成10進制
MOV B,#10 ;10進制/10=10進制
DIV AB
MOV NS,A
MOV NG,B
MOV A,NG
MOVC A,@A+DPTR ;查個位數的7段代碼
MOV P1,A ;送出個位的7段代碼
MOV P3,#11111011B
CALL DEL1MS ;顯示1ms
MOV A,NS ;取十位數
MOVC A,@A+DPTR ;查十位數的7段代碼
MOV P1,A ;送出十位的7段代碼
MOV P3,#11110111B
CALL DEL1MS ;顯示1ms
;-------第五、六位
MOV A,CHH ;將H中的十六進制數轉換成10進制
MOV B,#10 ;10進制/10=10進制
DIV AB
MOV NS,A
MOV NG,B
MOV A,NG
MOVC A,@A+DPTR ;查個位數的7段代碼
MOV P1,A ;送出個位的7段代碼
MOV P3,#11101111B
CALL DEL1MS ;顯示1ms
MOV A,NS ;取十位數
MOVC A,@A+DPTR ;查十位數的7段代碼
MOV P1,A ;送出十位的7段代碼
MOV P3,#11011111B
CALL DEL1MS ;顯示1ms
JMP F1
;----------------------interrupt
CLOCK: MOV P1,#0FFH
MOV TL0,#0B0H ;0B0H
MOV TH0,#3CH ;3CH
PUSH ACC
PUSH PSW
;-------
INC CHA
MOV A,CHA
CJNE A,#1,EXT ;C51=20,STC=240//8EH.2=1
MOV CHA,#00H
INC CHS
MOV A,CHS
CJNE A,#60,EXT
MOV CHS,#00H
INC CHM
MOV A,CHM
CJNE A,#60,EXT
MOV CHM,#00H
INC CHH
MOV A,CHH
CJNE A,#24,EXT
MOV CHH,#00H
;-----------
EXT: POP PSW
POP ACC
RETI
;------------------------------------------------------
LED: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH
;---------------------------------------delay_program
DEL1MS: MOV R4,#2 ;延時程序3,精確延時1000微秒
D1: MOV R5,#248
DJNZ R5,$
DJNZ R4,D1
RET
END
C例子:
//------------------初始化函數
int_ini()
{
TH0=0X3C;TL0=0XB0;
TMOD=0X01;ET0=1;ET1=1;TR1=0;TR0=1;EA=1;
}
//----------------中斷處理函數
void time_intt0(void) interrupt 1
{
ET0=0;TR0=0;TH0=0X3C;TL0=0XB0;TR0=1;
con1s++;
if(con1s==20)
{
con1s=0x00;
timedata[0]++;
if(timedata[0]>=10)
{timedata[0]=0;timedata[1]++;}
if(timedata[1]>=6)
{timedata[1]=0;timedata[2]++;}
if(timedata[2]>=10)
{timedata[2]=0;timedata[3]++;}
if(timedata[3]>=6)
{timedata[3]=0;timedata[4]++;}
if(timedata[4]>=10)
{timedata[4]=0;timedata[5]++;}
if(timedata[5]==2&&timedata[4]==4)
{timedata[4]=0;timedata[5]=0;}
}
dis[0]=timedata[0]; //相當於匯編 MOV DIS0,TDATA0]]DIS0為顯示掃描時的數值[秒位]~~~~~~
dis[1]=timedata[1];
dis[2]=timedata[2];
dis[3]=timedata[3];
dis[4]=timedata[4];
dis[5]=timedata[5];
ET0=1;
}