c51写的24c02的读写程序
51单片机读写AT24C02源代码详细注释

51单片机读写AT24C02源代码(详细注释)在P1口上接八个led灯,结果就显示在这八个灯上面。
AT24C02的接线方式见程序的顶部的定义。
以下是源代码:#include ;//包含头文件typedef unsigned char uchar;typedef unsigned int uint;#define write_c02 0xa0#define read_c02 0xa1sbit sda = P2^0;sbit scl = P2^1;void delay(){ //delay:5us;;}//i2c:initvoid i2c_init(){sda = 1;delay();scl = 1;delay();}//delayms:void delayms(uint xms){uchar x, y;for(x = xms; x >; 0; x--)for(y = 110; y >; 0; y--);}//start:void start() //启动i2c{sda = 1;scl = 1;delay();//延时必须大于4.7us,此约为五微秒sda = 0; //在scl为高电平时,sda一个下降沿为启动信号delay();}//stop:void stop() //停止i2c{sda = 0;scl = 1;delay();sda = 1; //在scl为高电平时,sdasda一个上升沿为停止信号delay();}//ack:void ack() //应答信号0{uchar i = 0; //等待变量scl = 1;//在scl为高电平期间等待应答delay();while((sda == 1) && i < 250)//若为应答0即退出,从机向主机发送应答信号i++;//等待一段时间scl = 0; //应答之后将scl拉低delay();}//nack:void nack() //非应答{scl = 1;//在scl为高电平期间,由主机向从机发送一个1,非应答信号delay();sda = 1;scl = 0; //应答之后将scl拉低delay();}//send byte:void send_byte(uchar date)//写一个字节{uchar i, temp;temp = date; //存入要写入的数据,即要发送到sda上的数据for(i = 0; i < 8; i++){ //发送8位temp <<= 1; //to CY 将数据的最高位移入到PSW中的CY位中scl = 0;//只有在scl为低电平时,才允许sda上的数据变化delay();sda = CY; //将CY里的数据发送到sda数据线上delay(); //可以延时scl = 1; //在scl为高电平时,不允许sda上的数据变化,使数据稳定delay();scl = 0;//允许sda数据线的数据变化,等待下一个数据的传输delay();}//wait ack:发送完一个字节数据后要主机要等待从机的应答,第九位scl = 0;//允许sda变化delay();sda = 1;//wait:ack,sda拉高等待应答,当sda=0时,表示从机的应答delay();}//read: byteuchar read_byte() //读一个字节数据{uchar i, j, k;scl = 0; //读之前先允许sda变化delay(); //等待数据for(i = 0; i < 8; i++){scl = 1; //不允许sda变化delay(); //使sda数据稳定后开始读数据j = sda; //读出sda上的数据k = (k << 1)| j; //将数据通过|运算存入k中scl = 0;//允许sda变化等待下一位数据的到来delay();}//delay();//可不用延时return k;//返回读出的数据}//write:at24c02 在at24c02中的指定地址写入数据void write_at24c02(uchar address, uchar date) {start(); //启动i2csend_byte(write_c02);//写入期间地址和写操作ack(); //从机应答0send_byte(address); //写入写数据的单元地址ack(); //ack0send_byte(date); //在指定地址中写入数据ack(); //从机应答0stop();//停止i2c}//read: at24c02在at24c02的指定地址中读出写入的数据uchar read_at24c02(address){uchar dat;//用来存储读出的数据start(); //启动i2csend_byte(write_c02); //写入at24c02器件地址和写操作ack(); //从机应答0send_byte(address); //写入要读取AT24C02的数据的单元地址ack(); //从机应答0start(); //再次启动i2csend_byte(read_c02); //写入AT24C02器件地址和读操作ack();//从机应答‘0’dat = read_byte();//读出指定地址中的数据nack(); //主机发出非应答‘1’stop(); //停止i2creturn dat;//返回读出的数据}//main:void main(){uchar i;i2c_init();start();while(1){for(i = 0x00; i < 0xff; i++){write_at24c02(10, i);delayms(10);//需等待十毫秒P1 = read_at24c02(10);//1010 1010 delayms(2000);}}}。
基于51的扩展存储器24C02的程序源代码

#include<reg51.h>#include<intrins.h>sbitsda=P2^0; //SDA线sbitscl=P2^1; //SCL线sbitrst=P2^4; //关掉时钟芯片输出sbit hc573_sg_le=P2^6; //对用于锁存段数据的573锁存LE端进行定义sbit hc573_bit_le=P2^7; //对用于锁存位选通数据的573锁存LE端进行定义unsigned char dis_num;unsigned char sec_1,sec_2; //数码管显示的数值,分别代表个位和十位unsigned char sec_5,sec_6; //数码管显示的数值,分别代表个位和十位unsigned char code display_table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0-f 16个数码管显示编码unsigned char code display_en[7]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //数码管位选通数据数组void delay_ms(unsigned int t) //tms的延时函数{unsignedinta,b;for(a=0;a<t;a++){for(b=0;b<113;b++){;}}}void _nop5_() //5个机器周期的延时,大约延时5us{_nop_();_nop_();_nop_();_nop_();_nop_();}void start(){scl=0; //SCL线拉低,以便让SDA线准备变化sda=1; //SDA线拉高,准备产生开始信号scl=1; //SCL线拉高_nop5_(); //SDA线高电平持续5us,以符合开始信号定义的要求(>4.7us)sda=0; //SDA线拉低,产生开始信号_nop5_(); //SDA线低电平持续5us, 以符合开始信号定义的要求(>4us)}void stop(){scl=0; //SCL线拉低,以便让SDA线准备变化sda=0; //SDA线拉低,准备产生停止信号scl=1; //SCL线拉高_nop5_(); //SDA线低电平持续5us,以符合停止信号定义的要求(>4us)sda=1; //SDA线拉高,产生停止信号_nop5_(); //SDA线的高电平持续5us, 以符合停止信号定义的要求(>4.7us)}void ack() //检测从机应答信号的函数{unsigned char i;i=255;scl=0; //SCL线拉低,以便让SDA线准备变化sda=1; //SDA线拉高,准备检测从机的应答信号while(sda==1) //当SDA为高电平时,则等待从机的应答将SDA拉低{if(i>0)i--;else return; //如果i自减到0了,从机还没响应,则不再等待,返回} //这种情况极少发生,一般是从机器件出问题了才会发生scl=1; //从机已经应答,将SDA线拉低了_nop5_(); //SDA线的低电平持续5us,以符合应答信号定义的要求(>4us)scl=0; //SCL线拉低,以便让从机把SDA线释放}/*void send_ack() //主机给从机发送应答信号{scl=0; //SCL线拉低,以便让SDA线准备变化sda=0; //SDA线拉低,即将发送应答信号给从机scl=1; //SCL线拉高,将应答信号发送过去_nop5_(); //SDA线的低电平持续5us,以符合应答信号定义的要求(>4us) scl=0; //SCL线拉低,以便让SDA线准备变化sda=1; //释放SDA线}*/ //本例程未用到此函数void send_no_ack() //主机给从机发送非应答信号{scl=0; //SCL线拉低,以便让SDA线准备变化sda=1; //SDA线拉高,即将发送非应答信号给从机scl=1; //SCL线拉高,将应答信号发送过去_nop5_(); //SDA线的高电平持续5us,以符合非应答信号定义的要求(>4us)}void write(unsigned char dat) //主机向从机写操作函数{unsigned char i;for(i=0;i<8;i++){scl=0; //SCL线拉低,以便让SDA线准备变化sda=(bit)(0x80&dat); //取字节数据的最高位,发送到SDA线dat=dat<<1; //发送的数据都是由高位到低位顺序发送的,所以要将所//需发送的那位移到数据的最高位,以发送到SDA线上scl=1; //SCL线拉高,数据被发送过去}}unsigned char read() //主机向从机读操作的函数{unsigned char i;unsigned char dat; //定义一个字节变量,用来存储读出的从机数据dat=0;for(i=0;i<8;i++){dat=dat<<1; //将位数据不断地往高位移动,将接收到的位数据转换为字节数据scl=0; //SCL线拉低,以便让SDA线准备变化dat=dat|(unsigned char)sda; //将接收到的位数据强制转换成字节数据,并存到dat 中scl=1; //SCL线拉高,接收下一位数据}return dat; //数据接收完毕,带数据返回}void display(unsigned char num,unsigned char i){P0=display_table[num]; //将数值的编码送入锁存器的输入端准备段数据的锁存hc573_sg_le=1; // 将段数据送给段数据线hc573_sg_le=0; //锁存段数据,让出P0口以供位选通锁存器使用P0=display_en[i]; //准备点亮第i个数码管hc573_bit_le=1; //将位选通数据送到数码管,数码管亮hc573_bit_le=0; //锁存位选通数据,让出P0口以供段数据锁存器使用}void main(){unsigned char data1; //用于存储从24C02中读出的数据rst=0; //关闭DS1302时钟芯片,避免引起干扰start(); //开始write(0xa0); //发送寻址字节给从机,通知从机要写数据ack(); //检测从机的应答信号write(0x06); //发送要写入的地址,为24C02的0x06位置ack(); //检测从机的应答信号write(0x0d); //向24C02发送数据0x0cack(); //检测从机的应答信号stop(); //写入完毕,停止通信delay_ms(100); //延时100ms,让24C02有足够的时间写入刚接收到的数据start(); //开始write(0xa0); //发送寻址字节给从机,通知从机要写数据ack(); //检测从机的应答信号write(0x06); //发送要读的地址,为24C02的0x06位置ack(); //检测从机的应答信号start(); //重复一次开始信号write(0xa1); //发送寻址字节给从机,通知从机要读刚才地址中的数据ack(); //检测从机的应答信号data1=read(); //读出数据,并把数据存到data1中send_no_ack(); //读数据完毕,发送非应答信号stop(); //发送停止信号,停止通信while(1){display(data1,1); //将数据显示到数码管中while(1);}}。
24c02读写程序

//===================================================================//
//==========================================================
i=readx(); stop();
delay1(10);
return(i);
}
void x24c02_write(uchar address,uchar info)
{
EA=0;
start(); writex(0xa0);
clock(); writex(address);
clock(); writex(info);
clock(); stop();
EA=1;
delay1(50);
}
//====================================================================//
main (){
}
uchar readx()
{
uchar i,j,k=0;
scl=0; flash(); sda=1;
for (i=0;i<8;i++){
flash(); scl=1; flash();
if (sda==1) j=1;
else j=0;
uchar x24c02_read(uchar address); //从24c02的地址address中读取一个字节数据
void x24c02_write(uchar address,uchar info);
24c02读写实验c程序

Init();//初始化
DispBuf[2]=Hidden;
DispBuf[3]=Hidden;
for(;;)
{
Calc(RecBuf[1],RomDat[0]);//分别显示地址和数据
if(Rec)//接收到数据
{Rec=0;//清除标志
if(RecBuf[0]==0)//第一种功能,写入
TR1=1;
}
void Calc(uchar Dat1,uchar Dat2)//第一个参数放在第1、2位,第二个参数放入第5、6位
{DispBuf[0]=Dat1/16;
DispBuf[1]=Dat1%16;
DispBuf[4]=Dat2/16;
DispBuf[5]=Dat2%16;
}
void main()
/**************************************************
24C02.C
功能描述:
PC端发送3个数据n0,n1,n2.
n0=0,写,将n1写入n2地址中
n0=1,读,读出n1地址中的数据,n2不起作用,但必须有
收到一个字节后,将其地址值显示在数码管第1、2位上,数值显示在第5、6位上
sbit we=P2^7;
sbit du=P2^6;
uchar code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar code disptab[]={0x3f,0x6,0x5b,0x4f,0x66,
0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
Rec=1;//置位标志
C51对24c02的读写

bit IIC_Gets(unsigned char SlaveAddr,unsigned char SubAddr,unsigned char size,unsigned char *dat) //读操作 { SlaveAddr&=0xfe; IIC_Start(); IIC_Write(SlaveAddr); unsigned char IIC_Read() if( IIC_GetAck()) {IIC_Stop(); return 1; } //读数据 IIC_Write(SubAddr); { if( IIC_GetAck()) {IIC_Stop(); return 1;} unsigned char dat; IIC_Start(); unsigned char t=8; SlaveAddr|=0x01; IIC_SDA=1; //将其拉高,使之处于输 IIC_Write(SlaveAddr); 状态 if(IIC_GetAck()) {IIC_Stop(); return 1;} do for(;;) { { IIC_SCL=1; *dat++=IIC_Read(); IIC_Delay(); if(--size==0) dat<<=1; {IIC_PutAck(1); if(IIC_SDA) dat++; break; IIC_SCL=0; } IIC_Delay(); IIC_PutAck(0); }while(--t!=0); } return dat; IIC_Stop(); } return 0;}
C51对24C02的读写
2C总线相关介绍 I
1、SDA和SCL都是双向线路,都通过一个电流源或上拉 电阻连接到正的电源电压。 2、当总线空闲时,这两条线都是高电平 ,连接到总线的器件 输出级必须是漏极开路或集电极开路才能执行线与的功能。 连到总线上的任一器件输出的低电平,都将使总线的信号 变低,即各器件的SDA及SCL都是线“与”关系。 3、 IIC总线进行数据传送时,时钟信号为高电平期间,数 据线上的数据必须保持稳定,只有在时钟线(SCL)上的信 号为低电平期间,数据线上的高电平或低电平状态才允许 变化。
24C02数据读写

delay(); sda=CY; delay(); scl=1; delay(); } scl=0; delay(); sda=1; delay(); } /*******************读一个字节*********************/ uchar read_byte()
{ uchar i,k; scl=0; delay(); sda=1; delay(); for(i=0;i<8;i++) { scl=1; delay(); k=(k<<1)|sda; scl=0; delay();
delay(); scl=1; delay(); } /*************写一个字节*************************/ void write_byte(uchar date) { uchar i,temp; temp=date; for(i=0;i<8;i++) {
temp=temp<<1; scl=0;
void respons() //应答 {
uchar i; scl=1; delay(); while((sda==1)&&(i<250))i++; scl=0; delay(); } /************IIC 初始化****************************/ void init() { sda=1;
IIC 时序 24C02 的操作
一、认识 IIC 总线的工作方式 这是最常用、最典型的 IIC 总线连接方式。
物理结构上,IIC 系统由一条串行数据线 SDA 和一条串行时钟线 SCL 组成。主机按一定的通信协议向从机寻址和进 行信息 传输。在数据传输时,由主机初始化一次数据传输,主机使数据在 SDA 线上传输的同时还通过 SCL 线传输 时钟。信息传输的对象和方向以及信息传输的开始和终 止均由主机决定。 每个器件都有一个唯一的地址,而且可以是单接收的器件(例如:LCD 驱动器)或者可以接收也可以发送的器件(例 如:存储器)。发送器或接收器可以在主模式或从模式下操作,这取决于芯片是否必须启动数据的传输还是仅仅被
24c02读写程序

E2PROM芯片24C02的读写程序一、实验目的:给24C02的内部RAM写入一组数据,数据从24C02内部RAM的01h开始存放。
然后再把这组数据读出来,检验写入和读出是否正确。
在这里我们给24C02中写入0、1、2的段码,然后把它读出来,送到数码管显示。
二、理论知识准备:上面两个实验主要学习的是利用单片机的串口进行通讯,本实验要介绍的是基于I2C总线的串行通讯方法,下面我们先介绍一下I2C总线的相关理论知识。
(一)、I2C总线概念I2C总线是一种双向二线制总线,它的结构简单,可靠性和抗干扰性能好。
目前很多公司都推出了基于I2C总线的外围器件,例如我们学习板上的24C02芯片,就是一个带有I2C总线接口的E2PROM存储器,具有掉电记忆的功能,方便进行数据的长期保存。
(二)、I2C总线结构I2C总线结构很简单,只有两条线,包括一条数据线(SDA)和一条串行时钟线(SCL)。
具有I2C接口的器件可以通过这两根线接到总线上,进行相互之间的信息传递。
连接到总线的器件具有不同的地址,CPU根据不同的地址进行识别,从而实现对硬件系统简单灵活的控制。
一个典型的I2C总线应用系统的组成结构如下图所示(假设图中的微控制器、LCD驱动、E2PROM、ADC各器件都是具有I2C总线接口的器件):我们知道单片机串行通讯的发送和接收一般都各用一条线TXD和RXD,而I2C总线的数据线既可以发送也可以接受,工作方式可以通过软件设置。
所以,I2C总线结构的硬件结构非常简洁。
当某器件向总线上发送信息时,它就是发送器,而当其从总线上接收信息时,又成为接收器。
(三)、I2C总线上的数据传送下面我们看看I2C总线是如何进行数据传送的。
我们知道,在一根数据线上传送数据时必须一位一位的进行,所以我们首先研究位传送。
1、位传输I2C总线每传送一位数据必须有一个时钟脉冲。
被传送的数据在时钟SCL的高电平期间保持稳定,只有在SCL低电平期间才能够改变,示意图如下图所示,在标准模式下,高低电平宽度必须不小于4.7us。
24C02读写C语言程序

2010-09-01 10:08
>下面是本人编写的源程序,已经调试成功,下载就可以使用,程序编写的不是很规范
,希望各位读者批评指正!!!
>/***********************************************************
> for(i=0;i<n;i++)//写入8字节数据
> {
> SendData(s);
> Test_Ack();
> if(flag==0) return(0);
> }
> I2C_Stop();
> return(1);
>}
>/*************************************************************
> SCL=0;
> delay();
> SDA=0;
> delay();
>}
>/********************************************************
>**名称:Test_Ack()
>**功能:检测应答位
>*********************************************************/
>void Ack()
>{
> SDA=0;
> delay();
> SCL=1;
> delay();
51单片机实现对24C02进行页写、顺序读取并显示验证(带详细注释)

//约2ms的延时 void delay(uchar t) { uchar x,y; for(x=0;x<t;x++) for(y=0;y<250;y++) ; }
//发送方在发完一个字节后检测接收方有没有应答。返回应答成功否。 bit ChkAck(void) {
bit SDAtemp; SDA = 1; //释放SDA(置1),然后等待接收方应答将它拉低。确切的说,应是24C02发送字节最后一 位的第8个时钟周期下降沿后经tAA //(SCL变低到SDA OUT有效的时间)约0.1-4.5us后拉低SDA,并随第9个时钟后结束。所以24C02正常时,SDA 为1并不体现 //(第8脉冲后马上被拉低了),但若器件坏了,就需要靠这个置1后不变来判断!(若不置1而上次发的数据 最后一位为0就不好判断了) //从24C02的Block Diagram看,它只能在SDA为1时通过控制内部的Dout来把SDA拉低,但不能在SDA为0时将其 置高!故主机要常将SDA置1,而SCl置0。 SCL = 1; //WriteI2CByte中写完一字节后又将SCL拉低,这里拉高产生第9个时钟上升沿,然后在SCL 为高期间对SDA进行检测 delay5us(); SDAtemp = SDA; //如果不用暂存变量,直接return SDA,就不会执行后面的SCL = 0,检测期间的第9个时钟 就不完整了 SCL = 0; delay5us(); return SDAtemp;
//50ms定时器0中断函数 void timer0() interrupt 1 //j是个全局变量,不是返回值,所以这里还是void。 { TH0 = (65536-46080)/256; //11.0592MHz时每50ms一次定时器中断 TL0 = (65536-46080)%256; j++; //也可以把判断j到20,并给P0口送显示数据的程序放在中断里处理 }
[精品]24c02的连续读写
![[精品]24c02的连续读写](https://img.taocdn.com/s3/m/1dd315cb81eb6294dd88d0d233d4b14e85243e88.png)
24c02的连续读写/**********************************************24c02驱动程序SDA=P3^6;SCL=P3^7;可以写一个字节,写一串字符(以'\n'作为结束标志)可以读一个字节,读一串字符(以'\n'作为结束标志)**********************************************/#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define W24C02 0xA0 //存储器的写地址#define R24C02 0xA1 //存储器的读地址/********************/sbit SDA=P3^6; //AT24C02串行数据5脚sbit SCL=P3^7; //AT24C02串行时钟6脚void start_24c02(); //开始void stop_24c02(); //停止void response_24c02(bit); //应答void write_8bit(uchar); //写8位void write_byte(uchar,uchar); //写一字节void write_list(uchar, uchar *); //写*指向的数据(以'\n'作结束)uchar read_8bit(); //读8位uchar read_byte(uchar); //从某一地址读1字节void read_list(uchar,uchar *); //从某一地址开始连续读,存到*所指位置/********************开始,在读\写前调用********************/void start_24c02(){SDA=1;_nop_();_nop_();SCL=1;_nop_();_nop_();SDA=0;_nop_();_nop_();}/********************结束,在读\写完后调用********************/void stop_24c02(){SDA=0;_nop_();_nop_();SCL=1;_nop_();_nop_();SDA=1;_nop_();_nop_();}/********************应答当单片机写时,ack=1,为等待24c02的应答信号当单片机读时,ack=0,为向24c02发送应答信号********************/void respons_24c02(bit ack) //ak为1则单片机接收24c02的应答信号;ak为0则24c02接收单片机的应答信号{uchar i=0;SDA=ack;while(i<250&&SDA==1)i++;SCL=1;_nop_();_nop_();SCL=0;_nop_();SDA=1;}/********************向24c02写入一字节(8位)的数据********************/void write_8bit(uchar dat) {uchar i;SCL=0;for(i=0;i<8;i++){dat=dat<<1;SDA=CY;SCL=1;_nop_();_nop_();SCL=0;_nop_();_nop_();}}/********************从24c02读取一字节(8位)的数据********************/ uchar read_8bit(){uchar i,k;for(i=0;i<8;i++){SCL=1;_nop_();_nop_();k=(k<<1)|SDA;SCL=0;_nop_();_nop_();}return k;}/********************向地址addr写入数据dat********************/void write_byte(uchar addr,uchar dat){start_24c02();write_8bit(W24C02);respons_24c02(1);write_8bit(addr);respons_24c02(1);write_8bit(dat);respons_24c02(1);stop_24c02();}/********************从地址addr形如连续写入list中的数据,以'\n'为结束标志********************/void write_list(uchar addr, uchar *list) {uchar i=0;start_24c02();write_8bit(W24C02);respons_24c02(1);write_8bit(addr);respons_24c02(1);do{if(i==0||i%8!=0) //判断是否到了页的边缘{write_8bit(list[i]);respons_24c02(1);}else{stop_24c02(); //写完一页,则进入启动内部写周期do{start_24c02();write_8bit(W24C02);SDA=1;//delay(2);}while(SDA==1); //等待24c02完成写周期发出的应答信号,从而继续下一个读写操作SCL=1;_nop_();_nop_();SCL=0; //应答write_8bit(i);respons_24c02(1);write_8bit(list[i]);respons_24c02(1);}}while(list[i++]!='\n');stop_24c02();}/********************从addr中读取一字节数据返回dat********************/uchar read_byte(uchar addr){uchar dat;start_24c02();write_8bit(W24C02);respons_24c02(1);write_8bit(addr);respons_24c02(1);start_24c02();write_8bit(R24C02);respons_24c02(1);dat=read_8bit(); //读取一字节后若发送停止指令,则结束并返回datstop_24c02();return dat;}/********************从地址addr开始连续读取数据,并存入list中以'\n'为结束********************/void read_list(uchar addr,uchar *list){uchar i=0;start_24c02();write_8bit(W24C02);respons_24c02(1);write_8bit(addr);respons_24c02(1);start_24c02();write_8bit(R24C02);respons_24c02(1);do{list[i]=read_8bit(); //读取1字节后,若其不为结束标志,则发送应答信号,继续读下一个if(list[i]!='\n')respons_24c02(0);}while(list[i++]!='\n');stop_24c02();}。
24C02数据读写

一这物行时每如一、认识IIC 这是最常用、物理结构上,行信息 传输。
时钟。
信息传每个器件都有如:存储器)C 总线的工作方最典型的II IIC 系统由一。
在数据传输传输的对象和方有一个唯一的地。
发送器或接方式C 总线连接方一条串行数据输时,由主机初方向以及信息地址,而且可接收器可以在IIC 时方式。
据线SDA 和一条初始化一次数息传输的开始可以是单接收的在主模式或从模时序24C02的条串行时钟线数据传输,主和终 止均由的器件(例如模式下操作,的操作 线SCL 组成。
主机使数据在S 主机决定。
如:LCD 驱动器这取决于芯片主机按一定的SDA 线上传输器)或者可以接片是否必须启的通信协议向输的同时还通过接收也可以发启动数据的传从机寻址和进过SCL 线传输发送的器件(例传输还是仅仅被进输例被寻1I 在低2I 寻址。
1.总线上数据IIC 总线是以在时钟线高电低电平时,才2.总线上的信IIC 总线在传据的有效性串行方式传输电平期间数据线才允许数据线上信号送数据过程中输数据,从数据线上必须保持上的电平状态中共有四种类据字节的最高持稳定 的逻辑态变化,如图类型信号,它们高位开始传送,辑电平状态,11-2所示。
们分别是:开,每一个数据位高电平为数据开始信号、停止位在SCL 上都据1,低电平为止信号、重新都有一个时钟为数据0。
只新开始信号和应脉冲相对应。
有在时钟线为应答信号。
为开的停停重之所开始信号(STA 的时候,例如停止信号(STO 停止信号,结重新开始信号之前,主机通所示,当SCL ART):如图1如,没有主动设OP):如图11结束数据通信。
号(Repeated S 通过发送重新开L为高电平时,1-3所示,当设备在使用总-3所示,当。
START):在I 开始信号,可,SDA由高电当SCL 为高电总线(SDA 和S SCL 为高电平IC 总线上,由可以转换与当电平向低电平跳平时,SDA 由CL 都处于高电平时,SDA 由低由主机发送一前从机的通信跳变,产生重由高电平向低电电平),主机通低电平向高电一个开始信号启信模 式,或是重新开始信号,电平跳变,产通过发送开始电平跳变,产生启动一次通信是切换到与另,它的本质就产生开始信号始(START)信号生停止信号。
24C02(IIC)读写操作

1. AT24C02写操作首先我们来看一下写AT24C02。
一般步骤是:1) 发送起始信号2) 发送写器件地址3) 等待应答4) 发送要写入的24C02 的地址5) 等待应答6) 发送要写入的数据7) 等待应答8) 发送数据结束发送结束信号具体程序如下:/****************************************************************************** ** 函数名: AT24Cxx_WriteOneByte* 函数功能: 24c02写一个字节地址数据* 输入: addr dt* 输出: 无********************************************/void AT24Cxx_WriteOneByte(u16 addr,u8 dt){I2C_Start();if(EE_TYPE>AT24C16){I2C_Send_Byte(0xA0);I2C_Wait_Ack();I2C_Send_Byte(addr>>8); //发送数据地址高位}else{I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+数据地址}I2C_Wait_Ack();I2C_Send_Byte(addr%256);//双字节是数据地址低位//单字节是数据地址低位I2C_Wait_Ack();I2C_Send_Byte(dt);I2C_Wait_Ack();I2C_Stop();delay_ms(10);}2. AT24C02读操作那么读取AT24C02 的步骤是:1)发送起始信号2) 发送写器件地址3) 等待应答4) 发送要读取的AT24C02 的地址5) 等待应答6) 再发送其实信号7) 发送读器件地址8) 等待应答9) 接收数据10) 如果没有接收完数据,发送应答11) 接收数据12) 直到接收完数据,发送非应答13) 发送结束信号/****************************************************************************** ** 函数名: AT24Cxx_ReadOneByte* 函数功能: 24c02读一个字节地址数据* 输入: addr* 输出: 返回值temp*****************************************************************************/ u8 AT24Cxx_ReadOneByte(u16 addr){u8 temp=0;I2C_Start();if(EE_TYPE>AT24C16){I2C_Send_Byte(0xA0);I2C_Wait_Ack();I2C_Send_Byte(addr>>8); //发送数据地址高位}else{I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+数据地址}I2C_Wait_Ack();I2C_Send_Byte(addr%256);//双字节是数据地址低位//单字节是数据地址低位I2C_Wait_Ack();I2C_Start();I2C_Send_Byte(0xA1);I2C_Wait_Ack();temp=I2C_Read_Byte(0); // 0 代表NAC I2C_NAck();I2C_Stop();return temp;}。
C51编写的AT24C02详细的读写程序

C51_AT24C02读写程序:/*void start() //开始信号void stop() //停止信号void Ack() //发确认信号void NoAck() //发无确认信号void init()//初始化信号,拉高SDA和SCL两条总线bit write_byte(uchar date)//写一字节,将date 写入AT24C02 中uchar read_byte()//读一字节,从AT24C02 中读一字节bit busy() //应答查询,stop()后,启动A T24C02内部写周期,启动查询//初始化EEPROM子程序内容为0XFF,nPage(0~31)void Init_Flash(uchar nPage) //8 bytes/1 page init 0xFFvoid write_add(uchar address,uchar date)//向AT24C02 中写数据//从AT24C02中给定的地址nAddr起,将存放在以指针nContent开头的存储空间中的nLen 个字节数据,连续写入AT24C02void write_flash(uchar *nContent,uchar nAddr, uchar nLen)uchar read_add(uchar address)//从AT24C02 中读出数据//从AT24C02中给定的地址nAddr起,读取nLen个字节数据存放在以指针nContent开头的存储空间。
void read_flash(uchar *nContent,uchar nAddr, uchar nLen)*//*单片机P2口接74HC138(三八译码器)P2.3--74HC138:/EI、P2.2--74HC138:A2、P2.1--74HC138:A1、P2.0--74HC138:A0译码器输出Y0,Y1、Y2、Y3、Y4、Y5、Y6、Y7均低电平有效,分别选通1~8个数码管。
51单片机读写24c02多组数据

此状态位进行操作.(不应答或非应答都使ack=0假)
发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
------------------------------------------------------------------*/
结束总线
------------------------------------------------*/
void Stop_I2c()
{
SDA=0; //发送结束条件的数据信号
_Nop(); //发送结束条件的时钟信号
SCL=1; //结束条件建立时间大于4μ
_Nop();
_Nop();
_Nop();
0x77,0x7c,0x39,0x5e,0x79,0x71};//显示段码值0~F
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
int c,num,h,i,j;
SCL=1; //置时钟线为高,通知被控器开始接收数据位
_Nop();
_Nop(); //保证时钟高电平周期大于4μ
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
SDA=1; //8位发送完后释放数据线,准备接收应答位
_Nop();
_Nop();
SCL=1;
_Nop();
Stop_I2c(); //结束总线
return(1);
}
AT24C02连读连写流水灯测试存储设备C51原创的。。免费下载已通过

AT24C02连读连写流水灯测试存储设备C51原创的。
免费下载已通过* 时序,还是时序在模拟时序时不能出错* 写一个字节数据是A T24C02自动才生一个应答,我们只要检测到就行。
然后发送下一字节* 读一个字节后我们要写另一个应答通知A T24C02,。
它接收我们的信号才会发下一个字节,不然我们不能进行连读******************************************************************/#include<C51.H>#include<INTRINS.H>#include<CLIB.H>// P1为流水灯。
实验用来显示数据是否能够正常读写//实验板上A0 A1 A2 全部接地而且SDA SCL没有接上拉电阻#define SDA P2_0#define SCL P2_1#define W_slave 0XA0#define R_slave 0xa1typedef unsigned char uchar ;typedef unsigned int uint ;bit ack=0;uchar code str_1[]={0x01,0x02,0x03,0x30,0x35,0x36,0x37,0x38,0x39,0x30};uchar get_str_1[8];/*******************************************AT24C02初始化*******************************************/void AT24C02_Init(void);/******************************************** AT24C02 起动*********************************************/static void AT24C02_Start();/******************************************** AT24C02 停止* __nop_()为一个单指令周期*11.0592MHZ一个单指令周期为1.08us********************************************/static void AT24C02_End() ;/****************************************** 写应答******************************************/static void AT24C02_Write_ACK() ;/**************************************** 读应答****************************************/static void AT24C02_Read_ACK();/****************************************发送一个字节****************************************/static void AT24C02_Send_Char(uchar ch);/****************************************接送一个字节****************************************/static uchar AT24C02_Get_Char();/****************************************AT24C02延时****************************************/static void flash(void) ;/**************************************** 发关一个字节*****************************************/static void AT24C02_Write_One(uchar address,uchar dat);/*****************************************接收一个字节*****************************************/static uchar AT24C02_Read_One(uchar address);/*****************************************连续写N个字节*****************************************/void AT24C02_Write_Str(uchar address,uchar * str,uchar num);/****************************************************** 连读N个字节*****************************************************/void AT24C02_Read_Str(uchar address,uchar *str,uchar num);/****************************************MAIN()******************************* ***************/void main(void){// uchar tample=0x00;uchar x=0;// uchar *_str;A T24C02_Init();// AT24C02_Write_One(0x20,0xa0); //test .... 写后立即读写需要时间延时,我这里用最小的1ms能够,比// delay1ms(1); //这更小的还没有进行测试,但是没有延时读取失败。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define ReadDviceAddress 0xa1
/***************************************************************************/
sbit SCL=P1^4;
sbit SDA=P1^3;
sbit DOG=P3^7;
/***************************************************************************/
void DelayMs(unsigned int number) {
unsigned char temp;
bit TestAck() {
bit ErrorBit;
SDA=1;
SCL=1;
ErrorBit=SDA;
SCL=0;
return(ErrorBit);
}
/***************************************************************************/
RamAddress++;
bytes--;
}
*RamAddress=Read8Bit();
NoAck();
Stop();
}
/***************************************************************************/
}
/***************************************************************************/
void Write24c02(unsigned char *Wdata,unsigned char RomAddress,unsigned char number) {
}
/***************************************************************************/
void NoAck() {
SDA=1;
SCL=1;
SCL=0;
}
/***************************************************************************/
Wdata++;
}
Stop();
DelayMs(10);
}
/***************************************************************************/
unsigned char Read8Bit() {
unsigned char temp,rbyte=0;
Start();
Write8Bit(WriteDeviceAddress);
TestAck();
Write8Bit(RomAddress);
TestAck();
for(;number!=0;number--) {
Write8Bit(*Wdata);
TestAck();
bit Write8Bit(unsigned char input) {
unsigned char temp;
for(temp=8;temp!=0;temp--) {
SDA=(bit)(input&0x80);
SCL=1;
SCL=0;
input=input<<1;
}
void Read24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes) {
unsigned char temp,rbyte;
Start();
Write8Bit(WriteDeviceAddress);
SDA=0;
SCL=1;
SDA=1;
}
/***************************************************************************/
void Ack() {
SDA=0;
SCL=1;
SCL=0;
SDA=1;
// extern void Write24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes);
/***************************************************************************/
void Start() {
SDA=1;
SCL=1;
SDA=0;
SCL=0;
}
/***************************************************************************/
void Stop() {
SCL=0;
c51写的24c02的读写程序
#i nclude <reg51.h>
// 对24C02的读、写
// extern void DelayMs(unsigned int);
// extern void Read24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes);
for(temp=8;temp!=0;temp--) {
SCL=1;
rbyte=rbyte<<1;
rbyte=rbyte|((unsigned char)(SDA));
SCL=0;
}
return(rbyte);
}
/***************************************************************************/
for(;number!=0;number--,DOG=!DOG) {
for(temp=112;temp!=0;temp--) {
}
}
}
/***************************************************************************/
TestAck();
Write8Bit(RomAddres;
Write8Bit(ReadDviceAddress);
TestAck();
while(bytes!=1) {
*RamAddress=Read8Bit();
Ack();