
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通信的时序图问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)