A. 关于单片机EEPROM存储器使用问题
端口 自己改一下
接法..随便找两个io口.
上拉5-10k电阻就好了.
24c01总共就只有128字节
而且写入的时候都知道忘那里写
你自己自然清楚什么时候..24c01满了.
这个东西都是固定地址.
又不是硬盘这种..还要什么时候满
SDA EQU P2.0
SCL EQU P2.1
Address EQU 08H
I2CData EQU 09H
ORG 0040H
LJMP START;转入主程序.
START:
MOV SP,#60H
MOV Address,#00H
MOV I2CData,#55H
MOV P0,I2CDATA
CALL DELAY
CALL I2C_WRITE ;写入数据.
MOV I2CDATA,#0AAH
MOV P0,I2CDATA
CALL DELAY
MOV Address,#00H
CALL I2C_READ
MOV I2CData,A ;读出数据.
MOV P0,I2CDATA
CALL DELAY
NOP
NOP
LJMP START
//*******************************************
/*------------------------------------------------------
读一个字节 Address地址 Data读出的数据
------------------------------------------------------*/
I2C_READ:
I2C_READ_A:
LCALL I2C_START
MOV A,#10100000B //从器件地址位是000,并且对从器件进行写操作。
//不要有所疑问为什么这么操作。因为这是一个选择性读的操作,主器件发送从器件地址和它想读取的字节数据的地址执行一个伪写操作。
LCALL I2C_SEND8BIT
LCALL I2C_ACK
JC I2C_READ_A ;=1,表示无确认,再次发送 C为1转移。
MOV A,Address
LCALL I2C_SEND8BIT
LCALL I2C_ACK
I2C_READ_B:
LCALL I2C_START
MOV A,#10100001B //从器件地址位是000,并且对从器件进行读操作。
LCALL I2C_SEND8BIT
LCALL I2C_ACK
JC I2C_READ_B //C=1转移,表示无确认,再次发送。
LCALL I2C_RECEIVE8BIT
MOV I2CData,A
LCALL I2C_ACK
LCALL I2C_STOP
RET
//*******************************************************
//*******************************************************
;接收八位数据
//主器件接收从器件指定地址的8位数据。
I2C_RECEIVE8BIT:
MOV B,#08H
CLR A
SETB SDA
I2C_RECEIVE8IT_A:
SETB SCL
NOP
NOP
MOV C,SDA
RLC A
CLR SCL
DJNZ B,I2C_RECEIVE8IT_A
RET
//*******************************************************
//*******************************************************
/*------------------------------------------------------
写一个字节 Address地址 I2CDatata写入的数据
------------------------------------------------------*/
I2C_WRITE:
I2C_WRITE_A:
LCALL I2C_START //调用I2C总线的起始信号的程序。
MOV A,#10100000B //从器件地址位是000,并且对从器件进行写操作。
LCALL I2C_SEND8BIT
LCALL I2C_ACK
JC I2C_WRITE_A //=1,表示无确认,再次发送。 C为1转移。
MOV A,Address
LCALL I2C_SEND8BIT
LCALL I2C_ACK
MOV A,I2CData
LCALL I2C_SEND8BIT
LCALL I2C_ACK
LCALL I2C_STOP
RET
//***************************************
//**********************************
;发送开始信号
//I2C总线的起始信号的程序。
I2C_START:
SETB SCL
SETB SDA
NOP
NOP
CLR SDA
NOP
NOP
CLR SCL
RET
//***********************************
//***********************************
;送八位数据
//主器件送从器件8位数据。
I2C_SEND8BIT:
MOV B,#08H
I2C_SEND8BIT_A:
RLC A
MOV SDA,C
SETB SCL
NOP
NOP
CLR SCL
DJNZ B,I2C_SEND8BIT_A
RET
//************************************
//*************************************
;发送接收确认信号
I2C_ACk:
SETB SDA
SETB SCL
NOP
NOP
JB SDA,I2C_ACK0 //SDA为1跳转。
CLR C
SJMP I2C_ACK_END
I2C_ACK0:
SETB C
I2C_ACK_END:
CLR SCL
RET
//**************************************
//**************************************
;发送结束信号
I2C_STOP:
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
RET
//***************************************
//***************************************
delay:
MOV R7,#0FFH
DEL1:
MOV R6,#0FFH
DEL2:
MOV R5,#10
DEL3:
DJNZ R5,DEL3
DJNZ R6,DEL2
DJNZ R7,DEL1
RET
//***************************************
B. 单片机上电没运行,要检查什么
单片机上电后没有运转,首先要检查什么?
首先应该确认电源电压是否正常。用电压表测量接地引脚跟电源引脚之间的电压,看是否是电源电压,例如常用的5V。
接下来就是检查复位引脚电压是否正常。分别测量按下复位按钮和放开复位按钮的电压值,看是否正确。
然后再检查晶振是否起振了,一般用示波器来看晶振引脚的波形,注意应该使用示波器探头的X10档。另一个办法是测量复位状态下的IO口电平,按住复位键不放,然后测量IO口(没接外部上拉的P0口除外)的电压,看是否是高电平,如果不是高电平,则多半是因为晶振没有起振。
另外还要注意的地方是,如果使用片内ROM的话(大部分情况下如此,现在已经很少有用外部扩ROM的了),一定要将EA引脚拉高,否则会出现程序乱跑的情况。有时用仿真器可以,而烧入片子不行,往往是因为EA引脚没拉高的缘故(当然,晶振没起振也是原因只一)。经过上面几点的检查,一般即可排除故障了。如果系统不稳定的话,有时是因为电源滤波不好导致的。在单片机的电源引脚跟地引脚之间接上一个0.1uF的电容会有所改善。遇到系统不稳定时,就可以并上电容试试(越靠近芯片越好)