您的位置 首页 培训

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

该程序实现的功能如下:利用中断及定时器功能,精确的计时;利用两个数码管,计时可从0-99;将计时的数值写入24C08,若断电后,重新启动,

该程序完成的功用如下:

使用中止及定时器功用,准确的计时;

使用两个数码管,计时可从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() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
sec++;
write=1;
if(sec==100)
{
sec=0;
}
}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/260154.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部