📄 24c02读.c
字号:
#include<reg52.h>
#include<math.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit scl=P2^2;
sbit sda=P2^3;
sbit p36=P3^6;
sbit p37=P3^7;
/***********************************************
函数功能:延时子程序
入口参数:time
出口参数:
************************************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=70;y>0;y--);
}
/***********************************************
函数功能:固定时间的延时
入口参数:无
出口参数:无
************************************************/
void wait(void) //4.6us延时
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/***********************************************
函数功能:24c04开始子程序
入口参数:
出口参数:
************************************************/
void start(void)
{
sda=1;
scl=1;
wait();
sda=0;
wait();
scl=0;
_nop_();
}
/***********************************************
函数功能:24c04停止子程序
入口参数:
出口参数:
************************************************/
void stop(void)
{
sda=0;
scl=1;
wait();
sda=1;
wait();
}
/***********************************************
函数功能:24c04应答子程序
入口参数:
出口参数:
************************************************/
void ack(void)
{
sda=0;
wait();
scl=1;
wait();
scl=0;
}
/***********************************************
函数功能:24c04反向应答子程序
入口参数:
出口参数:
************************************************/
void noack(void)
{
sda=1;
wait();
scl=1;
wait();
scl=0;
_nop_();
_nop_();
}
/***********************************************
函数功能:向24c04发送数据子程序
入口参数:data
出口参数:
************************************************/
void send(uchar data1)
{
uchar bitc=8;//位数控制
uchar temp;//中间变量
do
{
temp=data1;
scl=0;
wait();
if((temp&0x80)==0x80)//如果最高位是1
{sda=1;}
else {sda=0;}
scl=1;
temp=data1<<1; //左移一位
data1=temp;
bitc--;
}while(bitc);
scl=0;
}
/***********************************************
函数功能:向24c04读一个字节数据子程序
入口参数:
出口参数:temp
************************************************/
uchar read(void)
{
uchar temp=0; //数据存储中间变量
uchar temp1=0; //中间变量
uchar bitc=8; //位数控制
sda=1;
do
{
scl=0;
wait();
scl=1;
wait();
if(sda)
temp=temp|0x01;//temp的最低位置一
else
temp=temp&0xfe;//否则temp最低位置0
if(bitc-1)
{
temp1=temp<<1;
temp=temp1;
}
bitc--;
}while(bitc);
return(temp);
}
/***********************************************
函数功能:写入数据到ROM中
入口参数:写入数据的指针data1[],地址adds,数量num。
出口参数:
************************************************/
void WrToRom(uchar data1,uchar adds1,uchar num1)
{
uchar i=0;
uchar pdata1;
pdata1=data1; //写入数据的起始地址送到指针
for(i=0;i<num1;i++)//先给i赋值0,在判断是否小于num1,
//若小于则执行大括号中程序,最后i加1.
{
start();
send(0xa0); //发送控制符,设置为写入状态
ack(); //发送应答
send(adds1+i); //发送存数地址
ack();
send(pdata1); //发送一字节数据
ack();
stop();
delay(30);
}
}
/***********************************************
函数功能:从rom中读出数据
入口参数:读入数据的指针data2[],adds地址,num数量。
出口参数:
************************************************/
uchar RdFromRom(uchar adds,uchar num)
{
uchar data2;
uchar i,k;
for(i=0;i<num;i++)
{
start();
send(0xa0); //发送控制符,设置为写入状态
ack();
send(adds+i); //发送取数地址
ack();
start();
send(0xa1); //发送控制符,设置为读出状态
ack();
data2=read(); //读取一字节数据
scl=0;
noack(); //发送反应答
stop();
}
k=data2;
return(k);
}
/***********************************************
函数功能:主程序
入口参数:
出口参数:
************************************************/
void main(void)
{
uchar i=0x01,j;
while(1)
{
// WrToRom(i,1,2);
// delay(100);
// if(p36==0)
// delay(20);
while(p36==0)
{// p37=0;
j=RdFromRom(1,3);
P0=j;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -