weixin_45884480 2020-04-24 00:59 采纳率: 0%
浏览 824

单片机,用AT24C02扩展,代码有问题。 存四个数到指定的AT24c02连续的4个单元地址中,再从此地址中连续读出4个数据显示到数码管上。

#include
#include
#define uchar unsigned char
#define Addwr 0xa0;
#define AddRd 0xa1;
sbit SDA=P1^7;
sbit SCL=P1^6;
sbit WP=P1^5;
void Delay(int len)
{
int i,j;
for(i=0;i<len;i++)
for(j=0;j<100;j++);
}
void Start(void) //起始
{
SDA=1;
SCL=1;
_Nop();_Nop();_Nop();_Nop();_Nop();//延时5us
SDA=0;
_Nop();_Nop();_Nop();_Nop();_Nop();//延时5us
SCL=0;
}
void Stop(void)//终止
{
SDA=0;
SCL=1;
_Nop();_Nop();_Nop();_Nop();_Nop();//延时5us
SDA=1;
_Nop();_Nop();_Nop();_Nop();_Nop();//延时5us
SDA=0;
}
void Ack(void) //应答位函数
{
uchar i;
SDA=1;
SCL=1;
_Nop();_Nop();_Nop();_Nop();//延时4us
SCL=0;
_Nop();_Nop();_Nop();_Nop();//延时4us
}
void NoAck(void)//非应答位函数
{
SDA=1;
SCL=1;
_Nop();_Nop();_Nop();_Nop();//延时4us
SCL=0;
SDA=0;
}
void send(uchar Data)
{
uchar BitCounter=8;
uchar ack;
uchar temp;
do
{
temp=Data;
SCL=0;
_Nop();_Nop();_Nop();_Nop();
if((temp&0x80)==0x80)//最高位是1
SDA=1;//发送的数据的左移1位
else SDA=0;
SCL=1;
temp=Data<<1;
Data=temp;
BitCounter--;
}
while(BitCounter);
SCL=0;
_Nop();_Nop();_Nop();_Nop();
SDA=1;
_Nop();_Nop();_Nop();_Nop();
SCL=1;
_Nop();_Nop();_Nop();_Nop();
if(SDA==1)
ack=0;
else ack=1;
SCL=1;
_Nop();_Nop();
}
Read(void)//读一个字节的函数
{
uchar temp=0;
uchar temp1=0;
uchar BitCounter=8;
SDA=1;
do
{
SCL=0;
_Nop();_Nop();_Nop();_Nop();
SCL=1;
_Nop();_Nop();_Nop();_Nop();
if(SDA)
temp=temp|0x01;
else temp=temp&0xfe;
if(BitCounter=1)
{
temp=temp<<1;
temp=temp1;
}
BitCounter--;
}
while(BitCounter);
return(temp);
}
void WriteROM(uchar Data[],uchar Address,uchar Num)
{
uchar i;
uchar ack;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start();
send(0xa0);
if(ack==0)

send(Address+i);
if(ack==0)

send(*(PData+i));
if(ack==0)

Stop();
Delay(20);

}
}
void main(void)
{
uchar Number[4]={9,9,7,5};
TMOD=0x11;
TH0=0xee;
TL0=0x00;
TR0=1;
ET0=1;
EA=1;
WP=1;
WriteROM(Number[4],4); //将数组中的数据写入存储器
Delay(20);
Numder[0]=0;
Numder[1]=0;
Numder[2]=0;
Numder[3]=0;//将数组清0
ReadROM(Number[4],4); //写入存储器的数据读回到数组
while(1);
}
void WriteROM(uchar Data[],uchar Address,uchar Num)
{
uchar i;
uchar PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start();
send(0xa0);
if(ack==0)
return(0);
send(Address+i);
if(ack==0)
return(0);
send(
(PData+i));
if(ack==0)
return(0);
Stop();
Delay(20);
}
}
void ReadROM(uchar Data[],uchar Address,uchar Num)
{
uchar i;
uchar *PData;
PData=Data;
for(i=0;i {
Start();
send(0xa0);
if(ack==0)
return(0);
send(Address+i);
if(ack==0)
return(0);
Star();
send(0xa1);
if(ack==0)
return(0);
*(PData+i)=Read();
SCL=0;
NoAck();
Stop();
}
}
void timer0() interrupt 1
{
static unsigned char Bit=0;
TH0=THCO;
TL0=TLCO;
Bit++;
if(Bit>=4)
Bit=0;
P2|=0xf0;
P0=Duan[Data[Bit]];
switch(Bit)
{
case 0: P24=0;
break;
case 1: P25=0;
break;
case 2: P26=0;
break;
case 3: P27=0;
break;
}
}

  • 写回答

1条回答

  • jianqiang.xue 嵌入式领域优质创作者 2020-05-03 15:43
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器