⑴ 24C02驱动程序的问题
EEPROM_SDA = dat & 0x80;
EEPROM_SCL = 1;
EEPROM_SCL = 0
sda是位变量,是管脚,好像不能赋uchar的值的。。。这句有问题。用if语句分,
if((dat&0x80)==0x80)
dat=1;
else dat=0;
⑵ 单片机 24C02程序不能驱动 求解释!
根据时序,当写一个字节时旅碧尺,只有当scl为低电平才可以改变Sda的数据,即类似于有一个scl上升慧乎沿,在你的写函数之间的start函数scl为高电平,而在iic_write_sigle中sda有值后,scl一直拆高为高,没有低,怎么可以改变数据呢!!所以在iic_write_sigle中for循环里加上scl=0;再试试看
⑶ 通过iic在24c02的地址1中写入数据再读出来点亮一个led灯,为什么没反应
只要你的电源不超过4V 电流不告燃扰超过20MA控制通断就可以了,具体段携的有卖LED控制器,你可以把LED直接接上,也可以用单袜旦片机控制一个脚的通断,来达到控制LED灯的闪.
⑷ 51单片机 at24c02驱动模块直接把 at24c02的地址内容给单片机的驱动,读写什么的都包含在里面
//24c02程序,记录开机次数
//2011年5月19日
//调适成功,程序可正常运行
#include<reg52.h>
sbit sda=P1^0;
sbit scl=P1^1;
char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//*******************
/虚明/ 函数功能:演示函数
//参数:x:时间传递参数
//函数名:delaym()
void delaym(int x)
{
int y;
for(x;x>0;x--)
for(y=110;y>0;y--);
}
//*******************
// 函敏旁数功能:开始应答
//参数:无
//函数名:start()
void start()
{
scl=1;
sda=1;
sda=0;
scl=0;
}
//*******************
// 函数功能:停止应答
//参数:无
//函数名:stop()
void stop()
{
scl=0;
sda=0;
scl=1;
sda=1;
}
bit testack()
{
bit errorbit;
sda=1;
scl=1;
errorbit=sda;
scl=0;
return(errorbit);
}
//*******************
// 函数功能:写1byte到24c02
//参数:input:写数据
//函数名:writebyte()
void writebyte(char input )
{
char i;
for(i=8;i>0;i--)
{
sda=(bit)(input&0x80);
scl=1;
scl=0;
input=input<<1;
}
}
//*******************
// 函数功能:读取1byte数据
//参数:k:读出的数据
//函数名:readbyre()
char readbyte()
{
char i,k;
for(i=8;i>0;i--)
{
scl=1;
k=(k<<1)|sda;
scl=0;
}
return(k);
}
//*******************
// 函数功能:写数据到24c02指定地址
//参数:address:地址 ,date:写入的数据
//函数名:writeaddadd()
void writeadd(char address,char date)
{
start();
writebyte(0xa0);
testack();
writebyte(address);
testack();
writebyte(date);
testack();
stop();
delaym(10);
}
//*******************
// 函数功能:读取24c02指定桥誉橡地址数据
//参数:address:地址 ,ch:读出的数据
//函数名:readadd()
char readadd(char address)
{
char ch;
start();
writebyte(0xa0);
testack();
writebyte(address);
testack();
start();
writebyte(0xa1);
testack();
ch=readbyte();
stop();
return(ch);
}
//主函数
void main()
{
char k;
writeadd(1,1);
writeadd(2,2);
writeadd(3,3);
writeadd(126,1);
P0=0x01;
P2=0xff;
delaym(5000);
while(1){
k=readadd(1);
P0=table[k];
P2=0x80;
delaym(10);
k=readadd(2);
P0=table[k];
P2=0x40;
delaym(10);
k=readadd(3);
P0=table[k];
P2=0x20;
delaym(10);
k=readadd(126);
P0=table[k];
P2=0x10;
delaym(10);
}
//k++;
//if(k>9){
// k=0;
//}
//writeadd(9,k); }
试试吧,我自己用的
⑸ AT89C52单片机用24C02和24256实现掉电保护的程序和硬件电路
24C02可以实现掉电保护 硬件就是你拿2个I/O引脚去接到24C02 SCL SDA引脚上模拟I2C时序就可以了 程序的话楼上那个I2C驱动程序写的很清楚了
⑹ 请教:AT24C02程序问题!
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar f;
sbit sda=P3^4;
sbit scl=P3^3;
void delayus()//五微秒
{;;}
void delayms(uint z)//一毫秒
{
uint x,y;
for(y=z;y>0;y--)
for(x=110;x>0;x--);
}
void init()//初始化
{
scl=1;
delayus();
sda=1;
delayus();
}
void start()//开始信号
{
sda=1;
delayus();
scl=1;
delayus();
sda=0;
delayus();
scl=0;
delayus();
}
void stop()//停止信号
{
sda=0;
delayus();
scl=1;
delayus();
sda=1;
delayus();
}
/*void response()//应老搜答信号
{
delayus();
scl=1;
delayus();
}*/
void write_byte(uchar dat)//写一个字节
{ bit ack_bit;
uchar b,c;
scl=0;
delayus();
sda=1;
for(b=0;b<8;b++)
{
//c=dat&(0x80<<1);
c = (bit)(dat&0x80);
delayus();
sda=c;
delayus();
scl=1;
delayus();
scl=0;
delayus();
dat<<=1;
delayus();
}
/*下面是response();*/
sda=1;// scl=0;
delayus();
scl=1; //sda=1;
delayus();
ack_bit = sda; //接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节 ,若送高电平,表示没有接收到,传送异常
scl = 0; /液芹/SCL为低电平时,SDA上数据才允许变化(即允许闹含毕以后的数据传递)
}
uchar read_byte()//读一个字节
{
uchar d,e;
/* scl=0;//数据可以变化
delayus();
sda=1;
delayus();*/
for(d=0;d<8;d++)
{
scl=1;//数据稳定的时候可以进行对数据的操作,但是不可以改变数据状态
e<<=1;
//e=sda|(0x01<<d);
e|=(unsigned char)sda;
delayus();
scl=0;//来个脉冲把数据发送出去(低电平时数据可变)
}
return e;
}
void write_24c02(uchar address,uchar dat)
{
start();
write_byte(0xa0);
//response();
write_byte(address);
// response();
write_byte(dat);
// response();
stop();
}
uchar read_24c02(uchar address)
{
start();
write_byte(0xa0);
// response();
write_byte(address);
// response();
start();
write_byte(0xa1);
// response();
f=read_byte();
stop();
return f;
}
void main()
{
delayus();
write_24c02(3,0x02);
delayms(10);
P1=read_24c02(3);
while(1);
}
⑺ 单片机模拟IIC,24C02程序有问题
没时间仔细看你程序,给你些经验参考!
时序一定要符合i2c规范。SCLSDA 平常在H(高态),送出地址或资料时,先送出资料,然后
再将SCL 从H -> L -> H (一个时钟);这样就送出1bit
传送速率,早绝不要超过2MHz ,也就是上面 H -> L -> H的时间要控制在2MHz内。
传送时高位元先送,所以是左移,收的时候也是左移陆察姿。
接收资料跟1.相同,在SCL由高到低转态时读取。
觉得新手比较容易弄错的是没完全弄懂时序(尤其是资料格式),另外就是速率。
仔细看看24c02的datasheet,对照自己没和的程序,这样对自己帮助最大,应该能找出问题。
⑻ 关于AT24C02芯片的两个问题
1〉AT24CXX芯片都是串行eeprom, 通信协议是相同的,但是容量不同。如果坦谈驱动程序考虑到了,是可槐信弊以兼容的。
2〉AT24CXX没有擦除的动作,可以直接写入。但是eeprom和普通的ram还铅族是有区别的,eeprom可以在断电后保存数据,普通的ram则不行
⑼ 24c02程序 高手请进
#include<reg51.h>
sbit sda=P2^0;
sbit scl=P2^1;
sbit la=P2^6; // 数码管段选位
sbit wela=P2^7; // 数码液搏管位选位
char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delaym(int x)
{
int y;
for(x;x>0;x--)
for(y=110;y>0;y--);
}
void start()
{
scl=1;
sda=1;
sda=0;
scl=0;
}
void stop()
{
scl=0;
sda=0;
scl=1;
sda=1;
}
bit testack()
{
bit errorbit;
sda=1;
scl=1;
errorbit=sda;
scl=0;
return(errorbit);
}
void writebyte(char input)
{
char i;
for(i=8;i>0;i--)
{
sda=(bit)(input&0x80);
scl=1;
scl=0;
input=input<<1;
}
}
char readbyte()
{
char i,k;
for(i=8;i>0;i--)
{
scl=1;
k=(k<<1)|sda;
scl=0;
}
return(k);
}
void writeadd(char address,char date)
{
start();
writebyte(0xa0);
testack();
writebyte(address);
testack();
writebyte(date);
testack();
stop();
delaym(10);
}
char readadd(char address)
{
char ch;
start();
writebyte(0xa0);
testack();
writebyte(address);
testack();
start();
writebyte(0xa1);
testack();
ch=readbyte();
stop();
return(ch);
}
void main()
{
char k;
k=readadd(3);
la=1; //开机次数送数码管显示
P0=table[k];
la=0;
wela=1;
P0=0xfe;
wela=0;
k++;
writeadd(3,k);
while(1);
}
高手不敢说,刚学习的,已经调试过了,可以正常运行,记录开机次数
不过你要先把24c02清0,他才会从0开始计数
否则他会蚂扮读取24c02里面已经存储的值,直接继续加上去
我的程序里面他只能记录16次,要更多的话你可以自己扩展
qq807761589 有不懂的再来闹物祥问我
⑽ 谁知道AT24C02的中文资料,在单片机中是如何被利用的,他的功能是什么呢
AT24C02简介
AT24C02是美国 ATMEL 公司的低功耗 CMOS 串行 EEPROM,它是内含256×8
位存储空间,具有工作电压宽(2.5~5.5V) 、擦写次数多(大于10000次) 、写入速
度快(小于10ms)等特点。AT24C02中带有片内寻址寄存器。每写入或读出一个数
据字节后,该地址寄存器自动加1,以实现对下一个存储单元的操作。所有字节都
以单一操作方式读取。为降低总的写入时间亮皮槐,一次操作可写入多达8字节的数据。
图6为AT24C系列芯片的封装图。各引脚功能如下: SCL:串行时钟。在该引脚的上升沿时,系统将握轿数据输入到每个 EEPROM 器件,在
下降沿时输出。
SDA:串行数据。该引脚为开漏极驱动,可双向传送数据。
A0、A1、A2:器件/页面寻址。为器件地址输入端。
WP:硬件写保护。当该引脚为高电平时禁止写入,当为低电平时可正常读写数据。
VCC:电源。一般输入+5V电压敬友。
VSS:接地。