24C32~24C512的51单片机读写程序

2018-01-14 20:22:46编辑:什么鱼 关键字:24C32~24C512  51单片机  读写程序

AT89S52 晶振频率为11.0592MHz 指令周期:1.0852us 

功能说明:24C32-512程序,能读写:24C32、24C64、24C128、24C256、24C512 
读出的数据 送 P1 口显示 
#include "reg52.h" 
#include "intrins.h" 

 

#define uchar unsigned char 
#define uint unsigned int 

sbit sda=P3^7;//;模拟I2C 数据 
sbit scl=P3^6;//;模拟I2C 时钟 

void delay1(uint z)//延时为 1ms 
{  
uchar x,x1; 
for(;z>0;z--) 

for(x=0;x<114;x++) 

for(x1=0;x1<1;x1++); 


}  

void delay()//5us延时 

_nop_(); 
_nop_(); 
_nop_(); 


void star()//开始 

sda=1; 
delay();//5us延时 
scl=1; 
delay();//5us延时 
sda=0; 
delay();//5us延时 



void stop()//停止 

sda=0; 
delay();//5us延时 
scl=1; 
delay();//5us延时 
sda=1; 
delay();//5us延时 



void ack()//应答 
{ uchar z=0; 
while((sda==1)&&(z<50))z++;//条件判断, sda=1,则没有应答。如果没有应答则延时:z<50,z++;后返回 
scl=0; 
delay();//5us延时 


///写一个数据函数 
//器件写地址 slave_write_address 
//字节高地址 byte_High_address 
//字节低地址 byte_Low_address 
//待写入数据 data_data 
void write(uchar slave_write_address,uchar byte_High_address,uchar byte_Low_address,uchar data_data)//写一个数据 

uchar temp,temp1,i,ii; 

star();//开始 

for(ii=0;ii<4;ii++)//根据 24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,数据 
{  
if(ii==0) 

temp=slave_write_address;//送 器件写地址 
temp1=slave_write_address; 

else if(ii==1) 

temp=byte_High_address;//送 字节高地址 
temp1=byte_High_address; 

else if(ii==2) 

temp=byte_Low_address;//送 字节低地址 
temp1=byte_Low_address; 

else if(ii==3) 

temp=data_data;//送 数据 
temp1=data_data; 



for(i=0;i<8;i++) 

scl=0; 
delay();//5us延时 
temp=temp1; 
temp=temp&0x80;// 相 与 后,把不相关的位清零 

if(temp==0x80)//根据前面 相 与 后,判断 temp是否等于0x80,是则该位为 1 

sda=1;  
else 
sda=0; 

delay();//5us延时 
scl=1; 
delay();//5us延时 
scl=0; 
delay();//5us延时 
temp1=temp1<<1;//向左移出1位 


sda=1; 
delay();//5us延时 
scl=1; 
delay();//5us延时 
ack(); 

stop();//停止 


///读一个数据函数 
//器件写地址 slave_write_address 
//器件读地址 slave_read_address 
//字节高地址 byte_High_address 
//字节低地址 byte_Low_address 
//读出的数据 data_data 

read(uchar slave_write_address,byte_High_address,byte_Low_address,uchar slave_read_address)//读一个数据 

uchar temp,temp1,i,ii,x,data_data; 

star();//开始 

for(ii=0;ii<4;ii++)//根据 24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,器件读地址 
{  
if(ii==0) 

temp=slave_write_address;//送 器件写地址 
temp1=slave_write_address; 

else if(ii==1) 

temp=byte_High_address;//送 字节高地址 
temp1=byte_High_address; 

else if(ii==2) 

temp=byte_Low_address;//送 字节低地址 
temp1=byte_Low_address; 

else if(ii==3) 
{  
star();//开始 

temp=slave_read_address;//送 器件读地址 
temp1=slave_read_address; 


  

for(i=0;i<8;i++)//开始读数据 

scl=0; 
delay();//5us延时 
temp=temp1; 
temp=temp&0x80;// 相 与 后,把不相关的位清零 

if(temp==0x80)//根据前面 相 与 后,判断 temp是否等于0x80,是则该位为 1 

sda=1;  
else 
sda=0; 

delay();//5us延时 
scl=1; 
delay();//5us延时 
scl=0; 
delay();//5us延时 
temp1=temp1<<1;//向左移出1位 

sda=1; 
delay();//5us延时 
scl=1; 
delay();//5us延时 
ack();//应答 


for(x=0;x<8;x++) 

data_data=data_data<<1;//向左移入1位 

sda=1; 
delay();//5us延时 
scl=0; 
delay();//5us延时 
scl=1; 
delay();//5us延时 

if(sda==1)//判断 数据线是否是高电平 
data_data|=0x01;//把读到的数据 或 0X01  
//else  
//data_data|=0x00; 

ack();//应答 
stop();//停止 
return data_data;//返回读到的数据 



void main() 
{  

write(0xa0,0x00,0x01,0x66);//向器件写一个数据: 
//(0xa0 是器件写地址;0x00 是字节高地址;0x01 是字节低地址;0x66 是待写入的数据) 

delay1(5);//写与读的时间间隔应大于5ms,取决于器件 24C02的响应速度 

//向器件读一个数据 
//把读出的数据送 P1口显示 
P1=read(0xa0,0x00,0x01,0xa1);//向器件读一个数据: 
//(0xa0 是器件写地址;0x00 是字节高地址;0x01 是字节低地址;0xa1 是器件读地址) 

while(1);//跳转,相当于汇编指令 JUMP $ 


//0x66==亮 灭 灭 亮 亮 灭 灭 亮 


关键字:24C32~24C512  51单片机  读写程序

来源: eefocus 引用地址:http://www.eeworld.com.cn/mcu/article_2018011437349.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:1602液晶电子时钟程序
下一篇:STC12C5406AD 1602液晶显示+LM35DZ 温度计

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

C51、STM32和S3C2440中断体系的比较

/* 名称:C51、STM32和S3C2440中断体系的比较 说明:对于这三个芯片的中断体系来说,就我目前了解的, 我说:差不多。这里说的差不多,是中断的本质上差不多,都是首先中断源提出申请(比如触发了外部中断,定时器中断等),然后经过中断源屏蔽寄存器,再然后中断优先级的比较,最后CPU相应中断。(我去,这好像又回到了计算机组成原理啊)。不同的是细节,C51作为低级一点的芯片,其中断少,中断能达到的功能也少,相对来说较为简单些(无论是设计还是具体使用)。而STM32和S3C2440来说,其提供的功能较多,设计起来和使用起来要复杂的多(使用的时候得配置好多好多寄存器)。目前总结的,差不多就是这些吧。*/
发表于 2018-07-21 14:40:54

C51之定时器

/* 名称:C51之定时器 说明: 对于C51单片机来说,其内部有2个定时器,分别是T0和T1。它输入的时钟源是固定的,就是晶振输送的。当然它还可以作为计数器,统计外部输入的脉冲信号。这个实验是定时器中断实验。对于定时器中断,这是属于中断的一种。使用它也需要配置先前所属的相关寄存器。不同的是,关于定时器中断,还需要配置一些其他与定时器相关的寄存器,如定时器方式寄存器(TMOD)、计数器TH、TL等。要注意一点的是,C51单片机的定时器可以工作在中断方式,也可以工作在查询方式。在本实验中,使用定时器0(C51有两个定时器),采用中断方式进行精确时间的显示。*///定时器0中断初始化void
发表于 2018-07-21 13:04:15

C51之74HC595的使用

/* 名称:74HC595的使用 说明:74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7’输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存人到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。而当OE为高电位,也就是输出关闭时,并行输出端会维持在高阻抗状态。这里需要注意一点的就是,在芯片需要产生上升沿或者下降沿的时候:本质上就是将其对应引脚进行高低电平的转换。当然中间需要根据需要保持一定的时间(可以用空指令)。具体引脚及使用说明见:百度百
发表于 2018-07-21 13:02:05

C51IO口模拟I2C总线驱动AT24C16 (I2C协议部分)

/* 名称:C51IO口模拟I2C总线驱动EEPROM(AT24C16)说明:I2C总线是由Philips公司开发的一种简单、半双工同步串行总线。它只需要两根线(SCL、SDA)即可在连接于总线上的器件之间传送信息。其中SCL时钟总线用于同步数据,SDA数据总线用来发送数据(或地址)。和SPI总线不同的是,I2C总线通过在SDL上发送存储器的地址用来选中总线上对应的设备。关于具体的通信协议这里就不说了,无非是通过IO口模拟产生所需信号 (如通信开始信号是SCL为高时,SDA产生一个下降沿信号。) 驱动程序中有 具体的说明。 *///定义I2C相关变量sbit     SCL=P2
发表于 2018-07-21 13:01:29

C51IO口模拟I2C总线驱动AT24C16 (EEPROM部分)

/* 名称:C51IO口模拟I2C总线驱动AT24C16 说明:关于EEPROM,即这里的AT24C16是一个特殊形式的FLASH存储器,不过其容量一般较少。比较适合于存储少量的数据。AT24C16的通信接口是标准的I2C通信,即我们需要根据I2C通信协议来操纵EEPROM设备。 关于AT24C16的的各种操作,这里就不细讲了,简单介绍一下。(1)、主机向AT24C16写一个字节:首先需要发送设备地址,然后发送需要访问的存储器地址。然后在发送要写入的数据。这里省略了开始、结束和确认等信号的产生。(2)、指定页写入n个字节:和(1)的基本操作很类似。不同的是可以连续写入n个数据。这里要小注意一点的就是,写入的数据
发表于 2018-07-21 12:23:27

S3C2440学习之GPIO按键控制LED灯

/* 名称:S3C2440学习之GPIO按键控制LED灯 说明:这是实验2440GPIO的输入功能。基本的流程和51单片机开发的差不多。都是对GPIO端口寄存器的控制不同的是,51单片机可以直接对进行位控制,而2440中GPIO只能对32位的寄存器进行写入或者读出。这样的话,对于有些逻辑操作要稍微复杂点。还有个不同的是,无论是STM32还是51在进行IO按键输入的时候,都需要进行按键消抖,在这里却没又体现出来按键消抖,这是为什么呢?据我了解是这样,在进行51和STM32实验的时候,按键控制的是数码管(数字增加,降低),所以按键的机械抖动会给数码管数字的变化带来显著的影响。在这里是按键控制led灯的亮和灭
发表于 2018-07-21 11:58:46

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved