51单片机模拟IIC总线问题

51单片机模拟IIC总线问题,第1张

IIC的地址你可以自己定义的

在硬件上提供过IIC地址的你可以直接选择他的地址进行发送

像你这种情况的话可以自己定义地址:

假设你有两台或者以上的S3C2410,单片机作为主机,然后单片机发送数据,所有S3C接收(接收的前提是他的接收端口上获得IIC的开始信号,你可以选择利用中断进行检测),然后你在软件里可以预先设置好每台S3C的地址,即接收单片机的前8BIT,然后对照地址,一样的话就开始接收接下来的信息,没有就放弃这个通信,这样的话8BIT就可以控制256台S3C了

其实IIC也只是一种通信方式,你可以选择自己的协议,以IIC为基础,比如地址位选择16BIT甚至更多,如果从机是S3C这种32位的RAM9的话,数据位的传输可以32位的传。所谓的开始信号跟终止信号也只是双方默认的方式而已,就像是“点头YES,摇头NO”,你也可以选择相反的方式,只要两台通信的机子能懂就好。

不过最好是采用大家一起的,这样在软件移植的时候会有帮助,也方便别人看懂。当大家在某一领域都用一种方式的时候也就形成所谓的协议,比如TCP/IP,UART,IIC等等。

为了防止IIC的sda信号异常导致在while的死循环,用i来限定sda跳变为0等待时间,如果sda==0则跳出while循环,如果sda==1,最多等待i的255次增量计数后跳出循环,i++是在while循环体内的。IIC对时序有严格的要求,由于各种原因接口上信号异常是有可能发生的。

器件地址0101是器件的标识,多种IIC器件通信时没有这个标识就乱套了,这与i<255八辈子扯不上关系,i就是一个计时等待的变量。

你的问题补充中对24C08器件地址的理解是错误的,有的还用i <100,有的连i都没有,那又怎么理解呢。

你仔细再看看,iic通讯的开始和结束的条件不是数据线和时钟线的状态,而是变化,即时钟线高的时候,数据线由高到低,而不是看时序图刚开始两根线的状态,补充有时为了有效保证通讯,所以有些看起来没必要的语句,例如sda=0;就跟着sda=1;

51 单片机的引脚,输出 1 的能力很差。

这时,引脚的电压,取决于外来的信号。

输出 1,就是设置为输入状态。就是准备读取数据。

8次循环后,dat即为 IIC 器件送来的数据。

将以下程序保存为IICc,粘贴到你建的工程目录下面,在程序中#include<reg52h>下面写上#include"IICc"

/

IIc读写24cxx驱动 MCU 89C52 晶振:110592HZ

使用:在主函数中调用 write_add(uchar address,uchar date);写地址和数据到24c02

在主函数中调用 read_add(uchar address);读取24c02某地址数据

/

#include<reg52h>

#define uchar unsigned char

sbit sda=P0^6;//自己修改

sbit scl=P0^7;//自己修改

void delay_ns_ns()

{ ;; }

void start() //开始信号

{

sda=1;

delay_ns_ns();

scl=1;

delay_ns_ns();

sda=0;

delay_ns();

}

void stop() //停止

{

sda=0;

delay_ns();

scl=1;

delay_ns();

sda=1;

delay_ns();

}

void respons() //应答

{

uchar i;

scl=1;

delay_ns();

while((sda==1)&&(i<250))i++;

scl=0;

delay_ns();

}

void write_byte(uchar date)

{

uchar i,temp;

temp=date;

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

{

temp=temp<<1;

scl=0;

delay_ns();

sda=CY;

delay_ns();

scl=1;

delay_ns();

}

scl=0;

delay_ns();

sda=1;

delay_ns();

}

uchar read_byte()

{

uchar i,k;

scl=0;

delay_ns();

sda=1;

delay_ns();

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

{

scl=1;

delay_ns();

k=(k<<1)|sda;

scl=0;

delay_ns();

}

return k;

}

void write_add(uchar address,uchar date)

{

start();

write_byte(0xa0);

respons();

write_byte(address);

respons();

write_byte(date);

respons();

stop();

}

uchar read_add(uchar address)

{

uchar date;

start();

write_byte(0xa0);

respons();

write_byte(address);

respons();

start();

write_byte(0xa1);

respons();

date=read_byte();

stop();

return date;

}

以上就是关于51单片机模拟IIC总线问题全部的内容,包括:51单片机模拟IIC总线问题、单片机 iic 应答信号程序中有一句 while((sda==1)&&(i<250))i++ 我想知道 为什么i<250,250这个数字从哪、IIC通信的时序图问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9768673.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存