单片机读写24C01的C51程序

发布者:Xingfu8888最新更新时间:2016-11-09 来源: eefocus关键字:单片机  读写24C01  C51程序 手机看文章 扫描二维码
随时随地手机看文章
/*--------------------------24C01的IIC 读写的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 { 
read_byte(); 
SBUF =send_data; 
while(!TI); 
TI =0; 
SDA =0; 
SCL =1; 
iic_delay(); 
SCL =0; 

iic_stop(); 
rw =0x55; 

else 

error(); 
ACC =0x03; 
SBUF =ACC; 
while(!TI); 
TI =0; 


else 
{  
error();  
ACC =0x02; 
SBUF =ACC; 
while(!TI); 
TI =0;  

}

//如果你对本程序或者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 { 
send_data =receive_data[i]; 
send_byte(); 
iic_ack(); 
iic_delay10ms();  

iic_stop(); 
rw =0x55; 

else 

error(); 
ACC =0x04; 
SBUF =ACC; 
while(!TI); 
TI =0; 

}


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 { 
while(!RI); 
RI =0; 
receive_data[i]=SBUF; 
}  
ok(); 

//else 
//{ 
// error(); 
//}  
}

关键字:单片机  读写24C01  C51程序 引用地址:单片机读写24C01的C51程序

上一篇:SPI总线单片机发送数据的C51程序
下一篇:LCD显示的c51单片机频率计

推荐阅读最新更新时间:2024-03-16 15:20

51单片机控制的数字触发器
    电力电子技术研究的内容包括三个方面:电力电子器件、变流电路和控制电路。电力电子变流技术在工业化领域有着广泛的应用。家用电器节能灯、电子拖动、电炉控制系统中已采用相控整流技术。但多数触发装置普遍是模拟的,调节十分的不便,触发精度差、故障率高。采用单片机来控制晶阐管的触发,是晶阐管应用的发展趋势。本文介绍了一种由8051单片机组成的触发控制系统,可实现高分辨率的数字触发器。     1 系统硬件组成及其原理     系统硬件组成如图1,被控对象是三相全控桥整流电路。控制电路由8051单片机及其外围电路组成。外围电路主要是由键盘电路、同步脉冲形成电路、驱动输出电路等组成。     1.1 控制角θ     控
[单片机]
51<font color='red'>单片机</font>控制的数字触发器
科普:VCU、BMS、MCU通用功能和技术点解析
本文浅谈纯电动汽车中的大三电。即整车控制器(VCU),电池管理系统(BMS)和电机控制器(MCU)的通用的功能和技术点。本文分四个要点阐述。 1. 大三电?小三电? 2. VCU技术要点 3. BMS技术要点 4. MCU技术要点。 1. 大三电?小三电? 纯电动车中的大三电一般指的是动力系统部分的控制器。纯电动车的动力来源于动力电池,通俗点说,控制系统如下图所示: 即将动力电池中的电,用来驱动图中的驱动电机。当然,为了延长续航里程,需要尽可能将电池中的电传输给电机,提升效率。 尽管直流电机是可以直接使用直流电控制,但相比于交流电机,直流电机输出效率比较低,而且因为有机械摩擦的问题,可靠性和稳
[汽车电子]
科普:VCU、BMS、<font color='red'>MCU</font>通用功能和技术点解析
基于51单片机的脉搏体温监测仪
一.硬件方案 系统以STC89C52单片机为核心,以光电传感器利用单片机系统内部定时器来计算时间,由光电传感器感应产生信号,单片机通过对信号累加得到脉搏跳动次数,时间由定时器定时而得。系统运行中可以通过观察指示灯闪烁,若均匀闪烁说明测量值准确。系统停止运行时,能够显示总的脉搏次数,此外我们也加了温度传感器DS18B20来检测人体温。 主要由51单片机+1602液晶显示+红外对管采集+按键+蜂鸣组成;如图: 二.设计功能 (1)本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用)单片机。 (2)LCD1602液晶显示当前的心率和当前体温,心率单位是心率/分钟,温度单位为摄氏度。 (3)手指放到
[单片机]
基于51<font color='red'>单片机</font>的脉搏体温监测仪
Silicon Labs发布新款EFM32 Jade和Pearl Gecko微控制器
Silicon Labs(芯科科技有限公司,NASDAQ:SLAB)日前针对物联网(IoT)领域发布新一代Gecko技术,并推出了两大新型EFM32 Gecko MCU系列产品,使安全和能源管理技术得到进一步提升。新型Jade Gecko和Pearl Gecko MCU具有最先进的硬件加密引擎、灵活的低功耗模式、片上DC-DC转换器和可扩展的存储器容量选项,并且获得了Silicon Labs广受开发者欢迎的Simplicity Studio 工具的全面支持。EFM32 Jade和Pearl Gecko MCU主要面向能源敏感和电池供电的应用产品设计,包括可穿戴健身追踪器、智能门锁、零售终端设备、安全传感器和其他IoT节点应用等
[物联网]
Silicon Labs发布新款EFM32 Jade和Pearl Gecko<font color='red'>微控制器</font>
51单片机完成时钟形式显示
题目要求: 用四个数码管完成时钟形式显示。 如显示1 2. 0 0 然后一个按键控制暂停并闪烁,另一个按键控制分钟加1 要求:当第一个按键不按下时,第二个按键无法完成加1动作。 仿真图,如下: 按键K1控制暂停闪烁,开始,K2加1 这里需要说明一下,因为没有教到时钟,时钟部分,将在下一个微博实现,其实很简单,用时钟中断即可完成,那样的时钟比较准确。 写代码之前,要仔细看仿真的接口问题,这样才能写好代码,代码如下: #include reg51.h /* 按下key1 暂停并闪烁,再按一下 继续, key2按下加1,但是key2必须在key1按下后操作*/ unsigned char c ={0XC0,
[单片机]
51<font color='red'>单片机</font>完成时钟形式显示
基于超声波传感器的水位自动控制系统研究
  目前国内在液位自动控制方面缺少长期可靠的使用范例,还没有适用于液位测量和自动控制的定型产品。因此,开展液位自动控制的研究工作十分必要。   系统为一个水位监测与控制装置,通过键盘可以设定瓶内液位(0~25cm内的任意值),并通过控制电磁阀(或类似于电磁阀的装置)使瓶内的液位达到设定值,液位超过25cm或低于2cm时会发出警报。显示器能实时显示当前液位状态和瓶内液体重量以及阀门状态。   1 系统功能概述及框图   本设计利用MCS-51 单片机结合数字芯片、模拟电路,完成对水位的检测和自动控制。   基本工作流程为:主机通过键盘设定自己和从机的液位, 超声波传感器 测出当前水位对应的电压值,再经过ICL7135 模数转化送
[单片机]
基于超声波传感器的水位自动控制系统研究
国民技术汇聚11大主题与2款新品添彩ELEXCON 2022
国民技术汇聚11大主题与2款新品添彩ELEXCON 2022 2022年11月6日至8日,年度行业盛会“ELEXCON 深圳国际电子展暨嵌入式系统展”在深圳会展中心(福田)盛大举行, 国产32位MCU和安全芯片的创新引领者国民技术携带通用MCU、安全芯片、无线射频等最新产品技术和解决方案参加展会,以11个主题展区共100余件全明星展品阵容精彩亮相,新品车规级MCU N32A455以及新一代物联网安全芯片N32S003产品应用全面展示与推介 ,并在展会同期举办的两个线下技术论坛和一场新能源媒体直播活动中分享了国民技术“通用+安全”产品最新技术布局和成功应用案例。 在11月6日的“十四届MCU技术创新与应用大会”论坛上,
[单片机]
国民技术汇聚11大主题与2款新品添彩ELEXCON 2022
8051单片机供水系统水位控制的硬件电路设计
供水系统水位控制原理 下图是水塔水位控制原理图。图中虚线表示允许水位变化的上下限。在正常情况下,应保持水位在虚线范围之内,为此,在水塔的不同高度安装固定不动的三根金属棒,以感知水位变化情况。其中A棒处于下限水位以下,C棒处于上限水位,B棒在下限水位处。A棒接+5V电源,B棒、C棒各通过一个电阻与模拟地相连。 水塔由电机带动水泵供水,单片机控制电机转动以达到对水位控制的目的。供水时,水位上升,当达到上限时,由于水的导电作用,B棒、C棒连通+5V电源,因此,b、c两端均为高电平“1”状态。这时,应停止电机和水泵的工作,不再给水塔供水。 当水位降到下限时,B棒、C棒都不能与A棒导通,因此,b、c两端均为“0”状态。这时,应启动电机,
[单片机]
8051<font color='red'>单片机</font>供水系统水位控制的硬件电路设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved