24C01读写的c51源程序代码分享

程序中很多nop是冗余的,希望读者能进一步精简,但必须经过验证。
atmel 24c01 比较特殊,为简约型。
51晶振为11.0592mhz
-----------------------------------------------------------------------------*/
#include “reg51.h
#include ”intrins.h“
sbit scl= p1^5;
sbit sda= p1^4;
delay()
{
unsigned int i=1200;
while(i--);
}
/*----------------------------------------------------------------------------
调用方式:write_8bit(unsigned char ch) ﹫2001/03/23
函数说明:内函数,私有,用户不直接调用。
-------------------------------------------------------------------------------
*/
void write_8bit(unsigned char ch)
{
unsigned char i=8;
scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
while (i--)
{
sda=(bit)(ch&0x80);
_nop_();_nop_();_nop_();_nop_();_nop_();
ch《《=1;
scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
/*------------------------------------------------------------------------------
调用方式:void ack(void) ﹫2001/03/23
函数说明:内函数,私有,用户不直接调用。
-------------------------------------------------------------------------------
*/
void ack(void)
{
unsigned char time_1;
sda=1;
scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
scl=1;
time_1=5;
while(sda) {if (!time_1) break;} //ack
scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
unsigned char readiic_24c01(unsigned char address)
{
unsigned char ddata=0;
unsigned char i=8;
scl=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //tsu:sta
sda=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //thd:sta
scl=0; //start
write_8bit( (address《《1) | 0x01); //写页地址和操作方式
ack();
while (i--)
{
sda=1;
ddata《《=1;
scl=0;_nop_();_nop_();_nop_();_nop_();_nop_();scl=1;
if (sda) ddata|=0x01;
}
scl=0;_nop_();scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
sda=0;_nop_();scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
sda=1; //stop
delay();
return ddata;
}
void writeiic_24c01(unsigned char address,unsigned char ddata)
{
scl=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //tsu:sta
sda=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //thd:sta
scl=0; //start
write_8bit( (address《《1) & 0xfe); //写页地址和操作方式,对于24c32-
24c256,page不起作用
ack();
write_8bit(ddata); //发送数据
ack();
sda=0;
_nop_();scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
sda=1; //stop
delay();
}
2.这是一个读写24c系列eeprom的程序,已经经过本人亲自测试,通过!!!!!
//*************************************
//** m2401,m2402,m2404,m2408,m2416,m2432,m2464,m24128,m24256
//** 21c01,24c02:1010a2a1a0r/w; 24c04:1010a2a1p0r/w; 24c08:1010a2p1p0r/w
//** 24c16:1010p2p1p0r/w; //** 以上6种芯片的读写格式为:start-device addr-ack-first word addr-ack-second word addr-ack-data-ack-stop
//** 进行读写的字节数,eeprom首址,eeprom控制字节,
//** 以及eeprom类型。此程序结构性良好,具有极好的容错性,程序机器码也不多:
//** 以上5种芯片的读写格式为:start-device addr-ack-word addr-ack-data-ack-stop
//** 24c32-24c512:1010a2a1a0r/w; 24c1024:1010a2a1p0r/w; 24c1024:1010a2a1p0r/w //** 通用的24c01-24c1024共11种eeprom的字节读写操作程序,
//**************************24c01读写的c51源程序***********************************
#i nclude
#i nclude
#i nclude
#i nclude
sbit sda =p1^1;
sbit scl =p1^4;
sbit wp =p1^7;
sbit light =p1^0;
sbit power =p1^6;
#define uchar unsigned char
#define uint unsigned int
void iic_delay10ms();
void iic_delay(void);
void iic_start(void);
void iic_stop(void);
void iic_ack(void);
void read_byte(void);
void send_byte(void);
void initial(void);
void ok(void);
void error(void);
void read_eeprom(void);
void write_eeprom(void);
void init(void);
uchar ack_flag,send_data,receive_data[32];
uchar rw,type,device_addr,addr[3],num;
void main(void)
{
initial();
power =0;
light =0;
while(1)
{
es =1;
rw =0x55;
wp =0;
while(rw ==0x55);
es =0;
switch(type)
{
case 0x01:
case 0x02:
case 0x04:
case 0x08:
case 0x16:
type =0x02;
addr[1] |=0xa0;
device_addr 《《=1;
addr[1] |=device_addr;
break;
default:
type =0x03;
addr[2] |=0xa0;
device_addr 《《=1;
addr[2] |=device_addr;
}
if(rw ==0x01) //读eeprom
{
read_eeprom();
}
else if(rw ==0x00) //写eeprom
{
write_eeprom();
}
else //error command
{
error();
acc =0x01;
sbuf =acc;
while(!ti);
ti =0;
}
}
}
void read_eeprom(void)
{
uchar i;
wp =1;
iic_start();
for(i=1;i《=type;i++)
{
send_data =addr[type-i];
send_byte();
iic_ack();
if(ack_flag ==0x01)
break;
}
if(ack_flag ==0x00)
{
iic_start();
addr[type-1] |=0x01;
send_data =addr[type-1];
send_byte();
iic_ack();
if(ack_flag ==0x00)
{
for(i=0;i
//如果你对本程序或者24c01读写还有什么疑问,欢迎到的论坛去交流。
void write_eeprom(void)
{
uchar i;
wp =0;
iic_start();
for(i=1;i《=type;i++)
{
send_data =addr[type-i];
send_byte();
iic_ack();
if(ack_flag ==0x01)
break;
}
if(ack_flag ==0x00)
{
for(i=0;i
void read_byte(void)
{
uchar i,temp=0x80;
send_data =0x00;
scl =0;
for(i=0;i《8;i++)
{
sda =1;
scl =1;
if(sda)
send_data |=temp;
temp/=2;
scl =0;
iic_delay();
}
}
void send_byte(void)
{
uchar i,temp=0x80;
for(i=0;i《8;i++)
{
if((send_data&temp)==temp)
{
sda =1; //sda=1
}
else
{
sda =0; //sda=0
}
temp /=2;
iic_delay();
scl =1;
iic_delay();
scl =0;
iic_delay();
}
}
void iic_start(void)
{
sda =1;
scl =1;
wp =0;
iic_delay();
sda =0;
iic_delay();
scl =0;
}
void iic_stop(void)
{
sda =0;
scl =1;
iic_delay();
sda =1;
//wp =1;
}
void iic_ack(void)
{
ack_flag =0x00; //ack_flag等于0x00时有应答
sda =1;
iic_delay();
scl =1;
iic_delay();
if(sda)
{
ack_flag =0x01;
}
scl =0;
}
void iic_delay(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
void iic_delay10ms(void)
{
#pragma asm
mov r6,#200
mov r7,#10
delay:
nop
nop
nop
djnz r6,delay
mov r6,#200
djnz r7,delay
#pragma endasm
}
void initial(void)
{
tmod =0x21;
th1 =0xfd;
tl1 =0xfd;
th0 =0xfd;
tl0 =0xfd;
scon =0x50;
tr1 =1;
ea =1;
es =1;
et0 =1;
pt0 =1;
}
void ok(void)
{
acc =0x55;
sbuf =acc;
while(!ti);
ti =0;
acc =0xaa;
sbuf =acc;
while(!ti);
ti =0;
}
void error(void)
{
acc =0xaa;
sbuf =acc;
while(!ti);
ti =0;
acc =0x55;
sbuf =acc;
while(!ti);
ti =0;
rw =0x55;
}
void es_int(void)interrupt 4
{
uchar i;
ri =0;
type =sbuf; //型号
while(!ri);
ri =0;
device_addr =sbuf; //器件地址
for(i=0;i《3;i++)
{
while(!ri);
ri =0;
addr[2-i] =sbuf; //地址高、中、低位字节
}
while(!ri);
ri =0;
num =sbuf; //要操作的字节数
while(!ri);
ri =0;
rw =sbuf;
if(rw ==1) //接收到要读的命令
{
ok();
}
else //接收到要写的命令
{
for(i=0;i

P35系列压电偏转镜的特点以及技术参数的介绍
如何在Vitis中把设置信息传递到底层的Vivado
毫米波和独立组网将成为5G发展新趋势的关键
基于嵌入式Linux和Qt编程实现数码相框的设计
美国空军融合多种光电技术增强监视雷达能力
24C01读写的c51源程序代码分享
如何避免PCB设计限制D类放大器性能?
DC电源模块超宽电压输入和输出的问题
无人沙滩清理车横空出世,沙滩清理的小能手
汽车故障诊断UDS网络层原理讲解
FPGA将在众多AI芯片中脱颖而出
世界上第一个可供散户投资者和交易员使用的人工智能交易软件
ios中国市场份额狂降!苹果在中国遭遇史上最大麻烦,等待iphone8的降临?
智能时代:消费类电子产品的设计之道
压力变送器检定前的准备工作
苏州移动全程进行4K超清直播,通过移动的和直播全程观看工程启动仪式
苹果春季新品iPad mini 6亮点汇总
爱立信敢放出狠话底气何在
WorldVi宣布推出VizMove 2.0,一项基于位置和远程VR体验而设计的服务
fireflyAIO-3288J主板I2C简介