llC总线at24C02储存数据

本文通过描述作者在学习和实践IIC通信过程中遇到的问题,如数据接收应答的处理和数据溢出,详细解释了如何解决并深化了对IIC协议的理解。展示了如何在嵌入式系统中使用IIC函数发送和接收数据,以及主函数的实现。
摘要由CSDN通过智能技术生成

向江协科技学习,自己敲一遍的思路和命名都很乱,一直不理解iic的接受应答和发送应答,自己写完一遍后,一直显示255,检查了很久,在接受数据那一函数里if循环外加上SCL=0就可以了,不明白为什么,由于储存的数据是unsigned char类型,储存上限是255,存入300显示的就是45,加深了对iic协议的理解,在后面运用也有更大的启发

iic函数模块

#include <REGX52.H>

sbit SCL=P2^1;

sbit SDA=P2^0;

void start(void){

 SCL=1;

 SDA=1;

 SDA=0;

 SCL=0;

}

//发送数据

void send(unsigned char byte){

 unsigned char i;

 SDA=1;

 SCL=0;

 for(i=0;i<8;i++){

  SDA=byte&(0x80>>i);

  SCL=1;

  SCL=0;

 }

}

//读取数据

unsigned char receive(void){

 int i;unsigned char byte=0x00;

 SDA=1;

 SCL=0;

 for(i=0;i<8;i++){

   SCL=1;

      if(SDA){byte|=(0x80>>i);}

   SCL=0;

   

 }

 return byte;

}

void stop(void){

 SDA=0;

 SCL=1;

 SDA=1;

}

//发送应答

void sendREX(unsigned char sendREX){

 SDA=sendREX;

 SCL=1;

 SCL=0;

}

//接受应答

unsigned char receiveREX(void){

 unsigned char receiveREX;

 SDA=1;

 receiveREX=SDA;

 SCL=1;

 SCL=0;

 return receiveREX;

}

主函数模块

#include <REGX52.H>

#include <LCD1602.H>

#include <IIC.H>

#define address 0xA0

void Delay5ms(void) //@12.000MHz

{

 unsigned char data i, j;

 

 i = 59;

 j = 90;

 do

 {

  while (--j);

 } while (--i);

}

void write(unsigned char b,byte){

 start();

 send(address);

 receiveREX();

 send(b);

 receiveREX();

 send(byte);

 receiveREX();

 stop();

}

unsigned char read(unsigned char b){

 unsigned char byte;

 start();

 send(address);

 receiveREX();

 send(b);

 receiveREX();

 start();

 send(address|0x01);

 receiveREX();

 byte=receive();

 sendREX(1);

 stop();

 return byte;

}

void main(){

 unsigned char byte;

 LCD_Init();

 write(1,255);

 Delay5ms();

 byte=read(1);

 Delay5ms();

 LCD_ShowNum(1,1,byte,3);

 while(1);

 

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值