📄 24c02读写程序.c
字号:
#include <at89x51.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//////////////////////////////////////////////////////////////////
//////////24c读写的时候用到的函数/////////////////////////////////
//////////////////申明函数////////////////////////////////////////
sbit at24c02_scl=P3^7;
sbit at24c02_sda=P3^6;
void delay(uchar delay_temp);//长延时
void delaym(uchar delaym_temp);//短延时
void sta(void);//启动IIC总线
void stop(void);//停止IIC总线数据传送
void mnack(void);//发送非应答位
uchar cack(void);//应答位检查
void wrbyt(uchar date_24c02);//向SDA线上发送一个数据字节
uchar rdbyt(void);//从SDA线上读取一个数据字节
void wriet24(uchar w_add,uchar w24_data);
uchar read24(uchar r_add);
//////////////////////////////////////////////////////////////////////
/////////读写的时候用到的变量申明/////////////////////////////////////
uchar w_add,r_add;
uchar data24,w24_data;
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
uchar number1,number2,number3,number4;
uchar count;
unsigned char leddata[]={ ////////////////显示数据
0xC0, //"0"
0xF9, //"1"
0xA4, //"2"
0xB0, //"3"
0x99, //"4"
0x92, //"5"
0x82, //"6"
0xF8, //"7"
0x80, //"8"
0x90, //"9"
};
void mdelay(unsigned int delay) //延时子程序
{
unsigned int i;
for(;delay>0;delay--)
{
for(i=0;i<124;i++)
{;}
}
}
void disp()//////////////////////////显示函数
{
number1=count/1000; ////////有问题///
number2=(count-number1*1000)/100;
number3=(count-number1*1000-number2*100)/10;
number4=(count-number1*1000-number2*100-number3*10);
P2_4=0;
P0=leddata[number1];
mdelay(5);
P2_4=1;
P2_5=0;
P0=leddata[number2];
mdelay(5);
P2_5=1;
P2_6=0;
P0=leddata[number3];
mdelay(5);
P2_6=1;
P2_7=0;
P0=leddata[number4];
mdelay(5);
P2_7=1;
}
void main()
{
w_add=10;
r_add=10;
w24_data=255;
wriet24( w_add, w24_data);////向24的W_ADD地址写一个W24_DATA的数据///
count=read24(r_add);//////////将从R_ADD地址读到的数据返回给COUNT///
while(1)
{
disp();
}
}
void delay(uchar delay_temp)//延时子程序
{
uchar i,j;
for(i=0;i<delay_temp;i++)
{
for(j=0;j<255;j++);
}
}
void delaym(uchar delaym_temp)//延时子程序
{
uchar i;
for(i=0;i<delaym_temp;i++);
}
void sta(void)//启动IIC总线
{
at24c02_sda=1;
at24c02_scl=1;
delaym(1);
at24c02_sda=0;
delaym(1);
at24c02_scl=0;
}
void stop(void)//停止IIC总线数据传送
{
at24c02_sda=0;
at24c02_scl=1;
delaym(1);
at24c02_sda=1;
delaym(1);
at24c02_scl=0;
}
uchar cack(void)//应答位检查
{
uchar i;
i=0x00;
at24c02_sda=1;
at24c02_scl=1;
if(at24c02_sda==1)i=0xff;
at24c02_scl=0;
return i;
}
void mnack(void)//发送非应答位
{
at24c02_sda=1;
at24c02_scl=1;
delaym(1);
at24c02_scl=0;
at24c02_sda=0;
}
void wrbyt(uchar date_w24)//向SDA线上发送一个数据字节
{
uchar i,j;
j=0x80;
for(i=0;i<8;i++)
{
if((date_w24&j)==0)
{
at24c02_sda=0;
at24c02_scl=1;
delaym(1);
at24c02_scl=0;
}
else
{
at24c02_sda=1;
at24c02_scl=1;
delaym(1);
at24c02_scl=0;
at24c02_sda=0;
}
j=j>>1;
}
}
uchar rdbyt(void)//从SDA线上读取一个数据字节
{
uchar i,j;
j=0x00;
for(i=0;i<8;i++)
{
at24c02_sda=1;
at24c02_scl=1;
if(at24c02_sda==0)
{
j=j&0xfe;
}
else
{
j=j|0x01;
}
if(i!=7)j=j<<1;
at24c02_scl=0;
}
return j;
}
void wriet24(uchar w_add,uchar w24_data)//////////向24的W_ADD地址写
/////W24_DATA的数据////
{
//////////////////////////////////////////////写24c
sta();
wrbyt(0xa0);//写24C02
while(cack());
wrbyt(w_add);//地址
while(cack());
wrbyt(w24_data);//写数据
while(cack());
stop();
delay(50);//停止到启动信号之间需要延时
}
uchar read24(uchar r_add)//////////向24的R_ADD地址读
/////数据READ24_DATA////
{
//////////////////////////////////////////////////读24c
sta();//启动IIC总线
wrbyt(0xa0);//向SDA线上发送一个数据字节
while(cack()); //应答位检查
wrbyt(r_add);//地址
while(cack());
sta();
wrbyt(0xa1);//读24C02
while(cack());
data24=rdbyt();//在仿真环境中执行到下一步观察temp_1的值,//从SDA线上读取一个数据字节
mnack(); //发送非应答位
stop();
delay(20);
return data24;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -