程序在此
c51的主程序
#pragma small
#include<reg51.h>
#define uchar unsigned char
#define zero 0xee
#define one 0x28
#define two 0xcd
#define three 0x6d
#define four 0x2b
#define five 0x67
#define six 0xe7
#define seven 0x2c
#define eight 0xef
#define nine 0x6f
void displ();
void delay();
extern void du();
uchar count0,sec,minute;
uchar trdata[4]={0,0,0,0};
uchar num[10]={0xee,0x28,0xcd,0x6d,0x2b,0x67,0xe7,0x2c,0xef,0x6f};
void displ()
{ while(1)
{
uchar i=0;
uchar p=0;
while(i<4)
{
SBUF=num[trdata[i]];
while(TI==0);
TI=0;
i++;
P0=p;
p++;
delay();
SBUF=0x00;
while(TI==0);
TI==0;
}
}
}
void delay()
{
uchar n;
for(n=0;n<200;n++);
}
main()
{
du();
sec=0;
minute=0;
TMOD=0X01;
ET0=1;
TH0=-(50000/256);
TL0=-(50000%256);
TR0=1;
EA=1;
displ();/*定时器开始工作,等待一秒*/
}
void intt0(void) interrupt 1 using 2
{
TH0=-(50000/256);
TL0=-(50000%256);
count0++;
if(count0==20)/*1秒到了*/
{ sec++;
count0=0;
if(sec==60)
{
minute++;
sec=0;
}
trdata[3]=minute/10;
trdata[2]=minute%10;
trdata[1]=sec/10;
trdata[0]=sec%10;
}
}
汇编子程序模块
NAME RWAT2402
?PR?DU?RWAT2402 SEGMENT CODE
PUBLIC DU
RSEG ?PR?DU?RWAT2402
VSDA EQU P1.0
VSCL EQU P1.1
SLA EQU 50H
NUMBYT EQU 51H
MTD EQU 30H
MRD EQU 40H
SLAW EQU 0A0H
SLAR EQU 0A1H;预先处理
DU: MOV SLA,#SLAW
MOV NUMBYT,#01H
MOV MTD,#50H
LCALL WRNBYT
MOV SLA,#SLAR
MOV NUMBYT,#08H
LCALL RDNBYT
MOV R1,#40H
MOV SCON,#50H
MOV TMOD,#20H
MOV TH1,#0FDH
MOV TL1,#0FDH
SETB TR1
PP:MOV A,@R1
MOV SBUF,A
WA:JBC TI,CN
SJMP WA
CN:CLR TI
RET;只读一个数据
STAR:SETB VSDA;
SETB VSCL
NOP
NOP
NOP
NOP
CLR VSDA
NOP
NOP
NOP
NOP
CLR VSCL
RET
STOP:CLR VSDA;
SETB VSCL
NOP
NOP
NOP
NOP
SETB VSDA
NOP
NOP
NOP
NOP
CLR VSDA
CLR VSCL
RET
MACK:CLR VSDA;
SETB VSCL
NOP
NOP
NOP
NOP
CLR VSCL
SETB VSDA
RET
MNACK:SETB VSDA;
SETB VSCL
NOP
NOP
NOP
NOP
CLR VSCL
CLR VSDA
RET
CACK:SETB VSDA;
SETB VSCL
CLR F0
MOV C,VSDA
JNC CEND
SETB F0
CEND:CLR VSCL
RET
WRBYT:MOV R0,#08H;
WLP:RLC A
JC WR1
AJMP WR0
WLP1:DJNZ R0,WLP
RET
WR1:SETB VSDA
SETB VSCL
NOP
NOP
NOP
NOP
CLR VSCL
CLR VSDA
AJMP WLP1
WR0:CLR VSDA
SETB VSCL
NOP
NOP
NOP
NOP
CLR VSCL
AJMP WLP1
RDBYT:MOV R0,#08H;
RLP:SETB VSDA
SETB VSCL
MOV C,VSDA
MOV A,R2
RLC A
MOV R2,A
CLR VSCL
DJNZ R0,RLP
RET
WRNBYT:MOV R3,NUMBYT;
LCALL STAR
MOV A,SLA
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
MOV R1,#MTD
WRDA:MOV A,@R1
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
INC R1
DJNZ R3,WRDA
LCALL STOP
RET
RDNBYT:MOV R3,NUMBYT;
LCALL STAR
MOV A,SLA
LCALL WRBYT
LCALL CACK
JB F0,RDNBYT
RDN: MOV R1,#MRD
RDN1: LCALL RDBYT
MOV @R1,A
DJNZ R3,ACK
LCALL MNACK
LCALL STOP
RET
ACK:LCALL MACK
INC R1
SJMP RDN1
END
发表时间:2001年8月23日10:08:00