51单片机扩展24C02程序和电路.docx
《51单片机扩展24C02程序和电路.docx》由会员分享,可在线阅读,更多相关《51单片机扩展24C02程序和电路.docx(12页珍藏版)》请在冰豆网上搜索。
51单片机扩展24C02程序和电路
A
SDpFC2
30
gR3
C3IDuFL^TBTF>
A1SCK
越SOA
U2*vP
74CQ4A
:
iDa>
i»
it
U1
29
矿
3I
rU.P/^LU
PD.VAD1
P02Z«E
XTALS
PO.XfiCti
P0.4/O4
PD.S//O5
FG.AMX
RST
PCLW07
F20/«
PE哄
P2:
2/A10
PSEN
P23/A11
ALE
P1.4/A12
EA
P2.5ZA13
P2WA14
F27/A15
P1.D
P3.CunRXD
F1.1
F3J/TXD
P1.2
Pi.iflrnD
PT-3
P3.3/1NT1
Pl-1
P34/ID
Pl.5
P3.S/TI
PT.e
P3.&WR
P17
P37JRD
41
27
3
ID
11
u
14
F
16
17
ATS9C51
SRCFiLM24O&4开机统计ASM
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitsda=P1A1;
sbitscl=P1A0;
uchartemp=0;
ucharstate;
constuchar
tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
voiddelayic(uinti)
{
ucharj;
while(i--)
{
for(j=0;j<120;j++);
}
}
voiddelaym(uchart)
{
uchari;
for(i=0;i}
voidStart_I2c()
{
sda=1;
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
sda=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
_nop_();
_nop_();
}
voidStop_I2c()
(
sda=0;
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
sda=1;
_nop_();
_nop_();
_nop_();
_nop_();
}
voidcack(void)
(
sda=0;
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
}
voidmnack(void)
(
sda=1;
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
sda=0;
_nop_();
_nop_();
}
voidwrbyt(uchardate)
j=0x80;
for(i=0;i<8;i++)
(
if((date&j)==0)
(
sda=0;
scl=1;
delaym
(1);
scl=0;
}
else
(
sda=1;
scl=1;
delaym
(1);
scl=0;
sda=0;
}
j=j>>1;
}
}
uchara,c;
scl=0;
delaym
(1);
sda=1;
delaym
(1);
for(c=0;c<8;c++)
(
scl=1;
delaym
(1);
a=(a<<1)|sda;
scl=0;
delaym
(1);
}
returna;
}
voidread_data()
(
Start_I2c();
wrbyt(0xa0);
cack();
cack();
Start_I2c();
wrbyt(0xa1);
cack();
temp=rdbyt();
mnack();
Stop_I2c();
delayic(50);
}
voidwrite_data()
{
if(temp<=10)
{
state=temp;
state++;
Start_I2c();
wrbyt(0xa0);
cack();
wrbyt
(1);
cack();
Stop_I2c();
delayic(50);
else
(
temp=0;
state=temp;
Start_I2c();
wrbyt(0xa0);
cack();
wrbyt
(1);
cack();
wrbyt(state);
cack();
Stop_I2c();
delayic(50);
}
}
voiddispaly(ucharcount)
(
ucharnum;
num=count;
if(num>=5)
(
P2=0x00;
delayic(400);
}
data_l=num%10;
data_h=num/10;
P2=0x01;
P0=tab[data_h];
delayic(150);
P2=0x02;
P0=tab[data_l];
delayic(150);
}
voidmain()
{
read_data();
write_data();
while
(1)
{
dispaly(temp);
}
}
汇编程序:
;24c02的开机计数器,系统复位一次数码管加1
SDA24EQUP1.1
SCLK24EQUP1.0
ORG0000H
AJMPMAIN
ORG0030H
MAIN:
CLRP3.7;打开写保护
MOVDPTR,#TAB
MOVA,#00H;读地址
LCALLRD24
CJNEA,#10,TT
TT:
JNCTT1
AJMPTT2
TT1:
MOVA,#00
TT2:
MOV30H,A
MOVCA,@A+DPTR
SETBP2.0;开数码管
MOVP0,A;送显示
MOVA,30H
INCA
MOVA,#00H
LCALLWT24
AJMP$
TAB:
DB28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60H
RD24:
PUSHACC;读24C02子程序。
SETBSDA24
CLRSCLK24
CALLSTART24
MOVA,#0A0H
CALLSHIFT8
CALLACK
POPACC
CALLSHIFT8
CALLACK
CALLSTART24
MOVA,#0A1H
CALLSHIFT8
CALLACK
SETBSDA24
MOVR7,#8
CLRA
SETBSDA24
RD000:
RLA
SETBSCLK24
MOVC,SDA24
MOVACC.0,C
CLRSCLK24
DJNZR7,RD000
RET
;
;写入24C02程序:
WT24:
PUSHACC
SETBSDA24
CLRSCLK24
CALLSTART24
MOVA,#0A0H
CALLSHIFT8
CALLACK
POPACC
CALLSHIFT8
CALLACK
MOVA,B
CALLSHIFT8
CALLACK
CALLSTOP
CALLDELAY2
RET
;
;开始条件
START24:
CLRSDA24
SETBSDA24
SETBSCLK24
CLRSDA24
CLRSCLK24
RET
;停止条件
STOP:
CLRSDA24
SETBSCLK24
SETBSDA24
RET
;应答信号
ACK:
SETBSCLK24
CLRSCLK24
RET
;读、写数据
SHIFT8:
MOVR7,#8
SH01:
RLCA
MOVSDA24,C
SETBSCLK24
CLRSCLK24
DJNZR7,SH01
RET
DELAY2:
NOP
NOP
NOP
NOP
RET
END