. . ..
如叫8.1.11所示。
图8-11指定地址读操作数据帧格式
(4)指定地址连续读。此种方式的读地址控制与前面指定地址读相同。单片机接收到每个字节数据后应做出应答,只要
PROM检测到应答信号,其内部的地址寄存器就自动加1指
向下一单元,并顺序将指向的单元的数据送到SDA串行数据线上。当需要结束读操作时,单片机接收到数据后在需要应答的时刻发送一个非应答信号,接着再发送一个停止信号即可。 这种读操作的数据帧格式如图8.1.12所示。
图8-12指定地址连续读数据帧格式
4.TX-1C实验板上AT24C02连接图。
TX-1C实验板上AT24C02与单片机连接如图8.1.13所示,其中A0,A1,A2与WP都接地,SDA接单片机P2.0脚,SCL接单片机P2.1脚,SDA与SCL分别与
之 间接一10kΩ上拉电阻,因为
AT24C02总线内部是漏极开路形式,不接上拉电阻无法确定总线空队列的电平状态。
.v .. ..
第八章 单片机常用总线讲解
图8-13 TX-1实验板上AT24C02连接图
例:用C语言编写程序,在TX—1C实验板上实现如下功能:利用定时器产生一个0~99秒变化的秒表,并且显示在数码管上,每过一秒将这个变化的数写入板上AT24C02内部。当关闭实验板电源,并再次打开实验板电源时,单片机先从ATZ4C02中将原来写入的数读取出来,接着此数继续变化并显示在数码管上。
通过本实验可以看到,若向AT24C02中成功写入,并且成功读取则数码管上显示的数会接着关闭实验板时的数继续显示,否则有可能显示乱码。
新建文件part2.6_1.c.程序代码如下: #include
bit write=0; //写24C02的标志; sbit sda=P2^0; sbit scl=P2^1; sbit dula=P2^6; sbit wela=P2^7; uchar sec,tcnt; uchar code table[]={
. . ..
0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delay() {;;}
void delay1m(uint z) {
uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }
void start() //开始信号 {
sda=1; delay(); scl=1; delay(); sda=0; delay();
}
Void stop() //停止 {
sda=0; delay(); scl=1; delay(); sda=1; delay(); }
.v .. ..
第八章 单片机常用总线讲解
Void respons() //应答 {
uchar i; scl=1; delay();
while((sda==1)&&(i<255)) i++; scl=0; delay(); }
Void int() //将总线都拉高以释放总线 { scl=1; delay(); sda=1; delay(); }
void write_byte(uchar date) {
uchar i,temp; temp=date; for(i=0;i<8;i++) {
Temp=temp<<1; scl=0; delay(); sda=CY; delay(); scl=1; delay();
. . ..
}
scl=0; delay(); sda=1; delay(); }
uchar read_byte() {
uchar i,k; scl=0; delay(); sda=1; for(i=0;i<8;i++) { scl=1; delay(); k=(k<<1)|sda; scl=0; delay(); } delay(); return k; }
void write_add(uchar sddress,uchar date) {
start();
write_byte(0xa0);
respons();
write_byte(address); respons();
.v .. ..