新闻中心

EEPW首页>嵌入式系统>设计应用> 存储芯片24C08程序开发案例

存储芯片24C08程序开发案例

作者: 时间:2016-11-24 来源:网络 收藏
该程序实现的功能如下:

利用中断及定时器功能,精确的计时;

利用两个数码管,计时可从0-99;

将计时的数值写入24C08,若断电后,重新启动,则可从原来的数值继续计时;

#include
#include

#define uint unsigned int
#define uchar unsigned char
#define OP_READ 0xa1
#define OP_WRITE 0xa0


sbit SCL=P3^4;
sbit SDA=P3^5;
sbit gewei=P2^0;
sbit shiwei=P2^1;
sbit K5=P1^4;

uchar sec=0,count=0;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
bit write=0;

//延时1ms的函数
void Delay1ms()
{
uchar i,j;
for (i=0;i<10;i++)
{
for(j=0;j<33;j++)
{

}
}

}

//延时n ms的函数
void Delaynms(uchar n)
{
uchar i;
for(i=0;i {
Delay1ms();
}

}


//I2C 总线开始函数
void Star()
{
SCL=1;
SDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}


//I2C总线停止传输数据函数
void Stop()
{
SDA=0;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();

SCL=0;

SDA=0;
}


//I2C总线应答函数
bit Ask()
{
bit ask_bit;
SDA=1;
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
ask_bit=SDA;
SCL=0;
return ask_bit;
}


//往 24C08里写一个字节的函数
void WriteCurrent(uchar dat)
{
uchar i;

for(i=0;i<8;i++)
{
SDA=(bit)(dat&0x80);
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
SCL=0;
dat<<=1;
}
}


//从24C08中,读出一个字节的函数
uchar ReadData()
{
uchar i,dat;
for(i=0;i<8;i++)
{
SCL=1;
dat<<=1;
dat|=(uchar)SDA;
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
}
return dat;
}


//往24C08特定的地址写入命令的函数
void WriteSet(uchar addr,uchar dat)
{
Star();
WriteCurrent(OP_WRITE);
Ask();
WriteCurrent(addr);
Ask();
WriteCurrent(dat);
Ask();
Stop();
Delaynms(4);
}


//往24C08看中读出一个字节,并返回
uchar ReadCurrent()
{
uchar dat;
Star();
WriteCurrent(OP_READ);
Ask();
dat=ReadData();
//Ask();
Stop();
//Delaynms(4);
return dat;
}


//从24C08里特定的地址读出一个字节的数据
uchar ReadSet(uchar addr)
{
Star();
WriteCurrent(OP_WRITE);
Ask();
WriteCurrent(addr);
Ask();
return (ReadCurrent());

}

//数码管显示当前的时间值
void Dispaly()
{
P0=table[sec%10];
gewei=0;
shiwei=1;
Delaynms(5);

P0=table[sec/10];
gewei=1;
shiwei=0;
Delaynms(5);

}


//主函数
void main()
{

TMOD=0x01; //定时器0工作在方式1
ET0=1;
EA=1;
TH0=(65536-50000)/256; //对TH0 TL0赋值
TL0=(65536-50000)%256; //使定时器0.05秒中断一次
SDA = 1;
SCL = 1;
sec=ReadSet(2); //如果重新启动,则从原来的数值开始断续计时;
TR0=1;
while(1)
{
Dispaly();
if(write==1)
{
write=0;
WriteSet(2,sec); //往特定的地址写入计时值;
}

if(K5==0) //清除按键
{
Delaynms(15);
if(K5==0)
{
sec=0;
}
}

}

}

//采用中断的方式进行计时
void tt() interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
sec++;
write=1;
if(sec==100)
{
sec=0;
}
}

}


评论


技术专区

关闭