I2c通讯介绍及代码演示

I2c通讯介绍及代码演示

1.启动和停止波形图

图片

2.程序

就SDA有区别

启动

停止

Sda=1

扫描二维码关注公众号,回复: 13344862 查看本文章

Sda=0

Scl=1

Scl=1

Sda=1

Sda=1

Scl=0

Scl=0

/*------------------------------------------------启动IIC总线
------------------------------------------------*/void Start(void){
   
   Sda=1;_nop_();Scl=1;_nop_();Sda=0;_nop_();Scl=0;}/*------------------------------------------------停止IIC总线
------------------------------------------------*/void Stop(void){
   
   Sda=0;_nop_();Scl=1;_nop_();Sda=1;_nop_();Scl=0;}

3.应答与非应答

图片

图片

应答

非应答

Sda=0

Sda=1

Scl=1

Scl=1

Scl=1

Scl=0

/*------------------------------------------------应答IIC总线
------------------------------------------------*/void Ack(void){
   
   Sda=0;_nop_();Scl=1;_nop_();Scl=0;_nop_();}/*------------------------------------------------非应答IIC总线
------------------------------------------------*/void NoAck(void){
   
   Sda=1;_nop_();Scl=1;_nop_();Scl=0;_nop_();}

4.发送与接收

发送数据

接收数据

Scl=0

Sda=1(执行1次)

数据

Scl=0

Scl=1(执行1次)

Scl=1

数据

/*------------------------------------------------发送一个字节
------------------------------------------------*/void Send(unsigned char Data){
   
   unsigned char BitCounter=8;unsigned char temp;do{
   
   temp=Data;Scl=0;_nop_();if((temp&0x80)==0x80)Sda=1;elseSda=0;Scl=1;temp=Data<<1;Data=temp;BitCounter--;}while(BitCounter);Scl=0;}/*------------------------------------------------读入一个字节并返回
------------------------------------------------*/unsigned char Read(void){
   
   unsigned char temp=0;unsigned char temp1=0;unsigned char BitCounter=8;Sda=1;do{
   
   Scl=0;_nop_();Scl=1;_nop_();if(Sda)temp=temp|0x01;elsetemp=temp&0xfe;if(BitCounter-1){
   
   temp1=temp<<1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);}

5.i2C总体程序

sbit Sda=P2^0; //定义总线连接端口sbit Scl=P2^1;/*------------------------------------------------启动IIC总线
------------------------------------------------*/void Start(void){
   
   Sda=1;_nop_();Scl=1;_nop_();Sda=0;_nop_();Scl=0;}/*------------------------------------------------停止IIC总线
------------------------------------------------*/void Stop(void){
   
   Sda=0;_nop_();Scl=1;_nop_();Sda=1;_nop_();Scl=0;}/*------------------------------------------------应答IIC总线
------------------------------------------------*/void Ack(void){
   
   Sda=0;_nop_();Scl=1;_nop_();Scl=0;_nop_();}/*------------------------------------------------非应答IIC总线
------------------------------------------------*/void NoAck(void){
   
   Sda=1;_nop_();Scl=1;_nop_();Scl=0;_nop_();}/*------------------------------------------------发送一个字节
------------------------------------------------*/void Send(unsigned char Data){
   
   unsigned char BitCounter=8;unsigned char temp;do{
   
   temp=Data;Scl=0;_nop_();if((temp&0x80)==0x80)Sda=1;elseSda=0;Scl=1;temp=Data<<1;Data=temp;BitCounter--;}while(BitCounter);Scl=0;}/*------------------------------------------------读入一个字节并返回
------------------------------------------------*/unsigned char Read(void){
   
   unsigned char temp=0;unsigned char temp1=0;unsigned char BitCounter=8;Sda=1;do{
   
   Scl=0;_nop_();Scl=1;_nop_();if(Sda)temp=temp|0x01;elsetemp=temp&0xfe;if(BitCounter-1){
   
   temp1=temp<<1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);}/*------------------------------------------------写入DA数模转换值
------------------------------------------------*/void DAC(unsigned char Data){
   
   Start();Send(AddWr); //写入芯片地址Ack();Send(0x40); //写入控制位,使能DAC输出Ack();Send(Data); //写数据Ack();Stop();}/*------------------------------------------------读取AD模数转换的值,有返回值
------------------------------------------------*/unsigned char ReadADC(unsigned char Chl){
   
   unsigned char Data;Start(); //写入芯片地址Send(AddWr);Ack();Send(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加//Chl的值分别为0、1、2、3,分别代表1-4通道Ack();Start();Send(AddRd); //读入地址Ack();Data=Read(); //读数据Scl=0;NoAck();Stop();return Data; //返回值}

拿去套用就行

i2C总流程

图片

/*------------------------------------------------写入DA数模转换值
------------------------------------------------*/void DAC(unsigned char Data){
   
   Start();Send(AddWr); //写入芯片地址Ack();Send(0x40); //写入控制位,使能DAC输出Ack();Send(Data); //写数据Ack();Stop();}/*------------------------------------------------读取AD模数转换的值,有返回值
------------------------------------------------*/unsigned char ReadADC(unsigned char Chl){
   
   unsigned char Data;Start(); //写入芯片地址Send(AddWr);Ack();Send(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加//Chl的值分别为0、1、2、3,分别代表1-4通道Ack();Start();Send(AddRd); //读入地址Ack();Data=Read(); //读数据Scl=0;NoAck();Stop();return Data; //返回值}

这个是我ad四路扫描程序部分

图片

end

猜你喜欢

转载自blog.csdn.net/daocaokafei/article/details/120790521
I2C
今日推荐