本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
延时函数和头文件都对的
sbit SDA = P2^0; //iic数据线
sbit SCL = P2^1; //iic地址线
/******************* 函数申明 *******************/
void init_iic() ;
void start_iic();
void stop_iic();
void anwser_iic();
void noanwser_iic();
void write_iic(uchar i);
uchar read_iic();
void write_add_date(uchar add,uchar date);
uchar read_add_date(uchar add);
void write_add_date_count (uchar add,uchar b[],uchar count);
void read_add_date_count (uchar add,uchar *rd,uchar count);
/******************* iic总线初始化 *******************/
void init_iic()
{
SDA = 1;
SCL = 1;
}
/******************* iic开始信号 *******************/
/******************* 在SCL为高电平时,SDA有一个下降沿触发开始信号 *******************/
void start_iic()
{
SDA = 1;
SCL = 1;
delay5us();
SDA = 0;
delay5us();
}
/******************* iic停止信号 *******************/
/******************* 在SCL为高电平时,SDA有一个上升沿触发开始信号 *******************/
void stop_iic()
{
SDA = 0;
SCL = 1;
delay5us();
SDA = 1;
delay5us();
}
/******************* iic应答 *******************/
/******************* 在SCL为高电平时,SDA是一个低电平 *******************/
void anwser_iic()
{
SCL = 0;
SDA = 1; //主机释放SDA
delay5us();
SDA = 0;
delay5us();
SCL = 1;
delay5us();
SCL = 0;
}
/******************* iic不应答 *******************/
/******************* 在SCL为高电平时,SDA是一个高电平 *******************/
void noanwser_iic()
{
SCL = 0;
SDA = 1; //主机释放SDA
delay5us();
SDA = 1;
delay5us();
SCL = 1;
delay5us();
SCL = 0;
}
/******************* iic写 *******************/
/******************* 在SCL为高电平时,SDA要保持数据稳定;在SCL为低电平时,SDA可以改变,传送时先高后低 *******************/
void write_iic(uchar i)
{
uchar count;
for(count=0;count<8;count++)
{
SCL = 0;
i = i<<1;
SDA = CY;
delay5us();
SCL = 1;
delay5us();
SCL = 0;
delay5us();
}
}
/******************* iic读 *******************/
/******************* 在SCL为高电平时,SDA要保持数据稳定;在SCL为低电平时,SDA可以改变,传送时先高后低 *******************/
uchar read_iic()
{
uchar i,j;
for(i=0;i<8;i++)
{
SDA = 1; //主机释放数据线
SCL = 0;
delay5us();
SCL = 1;
j = (j<<1)|SDA;
delay5us();
SCL = 0;
delay5us();
}
return j;
}
/******************* iic在指定地址写一个字节 *******************/
/******************* 在SCL为高电平时,SDA要保持数据稳定;在SCL为低电平时,SDA可以改变,传送时先高后低 *******************/
void write_add_date(uchar add,uchar date)
{
start_iic();
write_iic(0xA0); //1010 000 0 最后一位为0------写 器件地址
anwser_iic();
write_iic(add); //内存地址
anwser_iic();
write_iic(date); //写数据
anwser_iic();
stop_iic();
}
/******************* iic在指定地址读一个字节 *******************/
/******************* 在SCL为高电平时,SDA要保持数据稳定;在SCL为低电平时,SDA可以改变,传送时先高后低 *******************/
uchar read_add_date(uchar add)
{
uchar w;
start_iic();
write_iic(0xA0); //1010 000 0 最后一位为0------写 器件地址
anwser_iic();
write_iic(add); //内存地址
anwser_iic();
start_iic();
write_iic(0xa1); //1010 000 1 最后一位为1------读 器件地址
anwser_iic();
w = read_iic(); //读数据
// noanwser_iic();
stop_iic();
return w;
}
/******************* iic在指定地址写连续字节 *******************/
/******************* 在SCL为高电平时,SDA要保持数据稳定;在SCL为低电平时,SDA可以改变,传送时先高后低 *******************/
void write_add_date_count (uchar add,uchar* buf,uchar count)
{
while(count--)
{
write_add_date(add++,*buf++) ;
}
// uchar i;
// start_iic();
// write_iic(0xA0); //1010 000 0 最后一位为0------写 器件地址
// anwser_iic();
// write_iic(add);
// anwser_iic();
// while(count--)
// {
// write_iic(b[i]); //写数据
// i++;
// anwser_iic();
// }
// stop_iic();
}
/******************* iic在指定地址读一段字节 *******************/
/******************* 在SCL为高电平时,SDA要保持数据稳定;在SCL为低电平时,SDA可以改变,传送时先高后低 *******************/
void read_add_date_count (uchar add,uchar *rd,uchar count)
{
start_iic();
write_iic(0xA0); //1010 000 0 最后一位为0------写 器件地址
anwser_iic();
write_iic(add); //内存地址
anwser_iic();
start_iic();
write_iic(0xa1); //1010 000 1 最后一位为1------读 器件地址
anwser_iic();
while(count--)
{
*rd= read_iic(); //读数据
rd++;
anwser_iic;
}
// noanwser_iic();
stop_iic();
}
void main()
{
uchar buff[3];
uchar arr[]={0,0xaa,0xaa,0xaa,0xaa,5,6,7,8,9,10,11,12,13,14,15,16,17,18,9,20,21,22,23,24,25,26,27,28,29,30,31,32,33};
hjc52_init();//HL-1/HJ-3G/HJ-C52主板初始化函数
init_iic(); //iic初始化
write_add_date_count (0,arr,sizeof(arr));
delay50ms();
read_add_date_count (2,buff,sizeof(buff));
P1=buff[1];
while(1) ;
}
最后BUFF里面的值都是0xff,求高手哪里出错了 |