
通过iic在24c02的地址1中写入数据再读出来点亮一个led灯,为什么没反应
//试验AT24C02EEPROM芯片程序#include<reg51.h>#include<intrins.h>#defineuintunsignedint#defin...
//试验AT24C02EEPROM芯片程序
#include<reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit sda=P2^0; //IO口定义
sbit scl=P2^1;
unsigned char j,k;
void delay(unsigned char i) //延时程序
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void nop()
{
_nop_();
_nop_();
_nop_();
}
/////////24C02读写驱动程序////////////////////
void delay1(unsigned char m) //延时
{ unsigned int n;
for(n=0;n<m;n++);
}
void init() //24c02初始化子程序
{
scl=1;
nop();
sda=1;
nop();
}
void start() //启动I2C总线
{
sda=1;
nop();
scl=1;
nop();
sda=0;
nop();
scl=0;
nop();
}
void stop() //停止I2C总线
{
sda=0;
nop();
scl=1;
nop();
sda=1;
nop();
}
void writebyte(unsigned char j) //写一个字节
{
unsigned char i,temp;
temp=j;
for (i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
nop();
sda=CY; //temp左移时,移出的值放入了CY中
nop();
scl=1; //待sda线上的数据稳定后,将scl拉高
nop();
}
scl=0;
nop();
sda=1;
nop();
}
unsigned char readbyte() //读一个字节
{
unsigned char i,j,k=0;
scl=0; nop(); sda=1;
for (i=0;i<8;i++)
{
nop(); scl=1; nop();
if(sda==1)
j=1;
else
j=0;
k=(k<<1)|j;
scl=0;
}
nop();
return(k);
}
void clock() //I2C总线时钟
{
unsigned char i=0;
scl=1;
nop();
while((sda==1)&&(i<255))
i++;
scl=0;
nop();
}
////////从24c02的地址address中读取一个字节数据/////
unsigned char read24c02(unsigned char address)
{
unsigned char i;
start();
writebyte(0xa0);
clock();
writebyte(address);
clock();
start();
writebyte(0xa1);
clock();
i=readbyte();
stop();
delay1(10);
return i;
}
//////向24c02的address地址中写入一字节数据info/////
void write24c02(unsigned char address,unsigned char info)
{
start();
writebyte(0xa0);
clock();
writebyte(address);
clock();
writebyte(info);
clock();
stop();
delay1(50);
}
void main()
{
init(); //初始化24C02
write24c02(1,0xfe); //在24c02的地址1中写入数据再读出来点亮led灯
delay1(100);
P1=read24c02(1); //点亮led
while(1);
}
//两个延时函数没有问题,实在不知道问题出在哪里
在学iic,所以在练习,最终目的是学iic,通过24c02芯片来点亮指定的其中一个led来判断写出来的程序有没有问题,但现在led不亮,不知道问题出在哪了,实验板也没问题,用单片机点亮过, 硬件都没问题 展开
#include<reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit sda=P2^0; //IO口定义
sbit scl=P2^1;
unsigned char j,k;
void delay(unsigned char i) //延时程序
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void nop()
{
_nop_();
_nop_();
_nop_();
}
/////////24C02读写驱动程序////////////////////
void delay1(unsigned char m) //延时
{ unsigned int n;
for(n=0;n<m;n++);
}
void init() //24c02初始化子程序
{
scl=1;
nop();
sda=1;
nop();
}
void start() //启动I2C总线
{
sda=1;
nop();
scl=1;
nop();
sda=0;
nop();
scl=0;
nop();
}
void stop() //停止I2C总线
{
sda=0;
nop();
scl=1;
nop();
sda=1;
nop();
}
void writebyte(unsigned char j) //写一个字节
{
unsigned char i,temp;
temp=j;
for (i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
nop();
sda=CY; //temp左移时,移出的值放入了CY中
nop();
scl=1; //待sda线上的数据稳定后,将scl拉高
nop();
}
scl=0;
nop();
sda=1;
nop();
}
unsigned char readbyte() //读一个字节
{
unsigned char i,j,k=0;
scl=0; nop(); sda=1;
for (i=0;i<8;i++)
{
nop(); scl=1; nop();
if(sda==1)
j=1;
else
j=0;
k=(k<<1)|j;
scl=0;
}
nop();
return(k);
}
void clock() //I2C总线时钟
{
unsigned char i=0;
scl=1;
nop();
while((sda==1)&&(i<255))
i++;
scl=0;
nop();
}
////////从24c02的地址address中读取一个字节数据/////
unsigned char read24c02(unsigned char address)
{
unsigned char i;
start();
writebyte(0xa0);
clock();
writebyte(address);
clock();
start();
writebyte(0xa1);
clock();
i=readbyte();
stop();
delay1(10);
return i;
}
//////向24c02的address地址中写入一字节数据info/////
void write24c02(unsigned char address,unsigned char info)
{
start();
writebyte(0xa0);
clock();
writebyte(address);
clock();
writebyte(info);
clock();
stop();
delay1(50);
}
void main()
{
init(); //初始化24C02
write24c02(1,0xfe); //在24c02的地址1中写入数据再读出来点亮led灯
delay1(100);
P1=read24c02(1); //点亮led
while(1);
}
//两个延时函数没有问题,实在不知道问题出在哪里
在学iic,所以在练习,最终目的是学iic,通过24c02芯片来点亮指定的其中一个led来判断写出来的程序有没有问题,但现在led不亮,不知道问题出在哪了,实验板也没问题,用单片机点亮过, 硬件都没问题 展开
展开全部
只要你的电源不超过4V 电流不超过20MA控制通断就可以了,具体的有卖LED控制器,你可以把LED直接接上,也可以用单片机控制一个脚的通断,来达到控制LED灯的闪.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询