📄 掉电存储.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 p00=P0^0;
sbit p01=P0^1;
sbit p02=P0^2;
sbit p03=P0^3;
sbit p04=P0^4;
sbit p05=P0^5;
/***********************************************
函数功能:延时子程序
入口参数:time
出口参数:
************************************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=70;y>0;y--);
}
/***********************************************
函数功能:固定时间的延时
入口参数:无
出口参数:无
************************************************/
void wait(void)
{
_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;
// uchar *ppdata;
// ppdata=data2; //读出数据的存放起始地址送到指针
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);
}
/***********************************************
函数功能:掉电存储子程序
入口参数:x
出口参数:y
************************************************/
//void d_24c04(uchar x)
//{
// uchar y[1];
// y[0]=x;
// WrToRom(y,0,1);
// i=RdFromRom(0,1);
// return(i);
//}
/***********************************************
函数功能:主程序
入口参数:
出口参数:
************************************************/
void main(void)
{
uchar i=0x01,j;
while(1)
{
WrToRom(i,1,1);
delay(100);
if(p36==0)
delay(20);
while(p36==0)
{
j=RdFromRom(0,1);
P0=j;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -