单片机初学者,帮我看看哪里错了,我实在卡的不行了
时间:10-02
整理:3721RD
点击:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA=P3^2;
sbit SCL=P3^3;
uchar date;
void start_iic() //起始信号
{
SCL=1;
SDA=1;
_nop_();
_nop_();
SDA=0;
_nop_();
SCL=0;
}
void stop_iic() //停止信号
{
SCL=1;
_nop_();
_nop_();
SDA=0;
SDA=1;
_nop_();
_nop_();
SCL=0;
}
void ack_iic() //应答信号
{
uchar i;
SCL=1;
_nop_();
_nop_();
while(SDA==1&&i<250)
{
i++;
SCL=0;
_nop_();
_nop_();
}
}
void noack_iic() //非应答信号
{
SCL=1;//第9个时钟
_nop_();
_nop_();
SDA=1;
SDA=0;
SCL=0;
}
void write_byte(uchar dat) //写入一个字节到总线
{
uchar temp,i;
temp=dat;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
_nop_();
_nop_();
SDA=CY ;
_nop_();
_nop_(); //SCL=0时,SDA电平变换
SCL=1; //送数
_nop_();
_nop_();
}
SCL=0;
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_(); //释放总线
}
uchar read_byte() //读入一个字节到总线
{
uchar i,j,k;
SCL=0;
_nop_();
_nop_();
for(i=0;i<8;i++)
{
SCL=1;
_nop_();
_nop_();
j=SDA;
k=(k<<1)|j; //j为0或1,K不管为何值,左移一位变成0
SCL=0;
_nop_();
_nop_();
}
return k;
}
void write_at24c02(uchar add,uchar dataa)
{
start_iic();
write_byte(0xa0);
ack_iic();
write_byte(add);
ack_iic();
write_byte(dataa);
ack_iic;
stop_iic();
}
uchar read_at24c02(uchar add)
{
start_iic();
write_byte(0xa0);
ack_iic();
write_byte(add);
ack_iic();
start_iic();
write_byte(0xa1);
ack_iic;
date=read_byte();
noack_iic();
stop_iic();
return date;
}
void at24c02_init() //总线初始化
{
SCL=1;
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_(); //把总线拉高以释放总线
}
main()
{
unsigned char dat;
at24c02_init();
write_at24c02(0x33,0);
dat= read_at24c02(0x33);
while(1)
P0=dat;
}
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA=P3^2;
sbit SCL=P3^3;
uchar date;
void start_iic() //起始信号
{
SCL=1;
SDA=1;
_nop_();
_nop_();
SDA=0;
_nop_();
SCL=0;
}
void stop_iic() //停止信号
{
SCL=1;
_nop_();
_nop_();
SDA=0;
SDA=1;
_nop_();
_nop_();
SCL=0;
}
void ack_iic() //应答信号
{
uchar i;
SCL=1;
_nop_();
_nop_();
while(SDA==1&&i<250)
{
i++;
SCL=0;
_nop_();
_nop_();
}
}
void noack_iic() //非应答信号
{
SCL=1;//第9个时钟
_nop_();
_nop_();
SDA=1;
SDA=0;
SCL=0;
}
void write_byte(uchar dat) //写入一个字节到总线
{
uchar temp,i;
temp=dat;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
_nop_();
_nop_();
SDA=CY ;
_nop_();
_nop_(); //SCL=0时,SDA电平变换
SCL=1; //送数
_nop_();
_nop_();
}
SCL=0;
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_(); //释放总线
}
uchar read_byte() //读入一个字节到总线
{
uchar i,j,k;
SCL=0;
_nop_();
_nop_();
for(i=0;i<8;i++)
{
SCL=1;
_nop_();
_nop_();
j=SDA;
k=(k<<1)|j; //j为0或1,K不管为何值,左移一位变成0
SCL=0;
_nop_();
_nop_();
}
return k;
}
void write_at24c02(uchar add,uchar dataa)
{
start_iic();
write_byte(0xa0);
ack_iic();
write_byte(add);
ack_iic();
write_byte(dataa);
ack_iic;
stop_iic();
}
uchar read_at24c02(uchar add)
{
start_iic();
write_byte(0xa0);
ack_iic();
write_byte(add);
ack_iic();
start_iic();
write_byte(0xa1);
ack_iic;
date=read_byte();
noack_iic();
stop_iic();
return date;
}
void at24c02_init() //总线初始化
{
SCL=1;
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_(); //把总线拉高以释放总线
}
main()
{
unsigned char dat;
at24c02_init();
write_at24c02(0x33,0);
dat= read_at24c02(0x33);
while(1)
P0=dat;
}