存储芯片24C08程序开发案例
时间: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() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
sec++;
write=1;
if(sec==100)
{
sec=0;
}
}
}
利用中断及定时器功能,精确的计时;
利用两个数码管,计时可从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;
}
}
}
存储芯片24C08程序开 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)