如何用IO口模拟I2C来实现两个STC单片机之间的通讯,求C语言写法

作者&投稿:夕婷 (若有异议请与网页底部的电邮联系)
如何用IO口模拟I2C来实现两个STC单片机之间的~

两个单片机之间通信用串口啊,距离较近,可用TTL连接。距离远点就用RS232连接,程序好写。I2C的协议和时序太复杂,要是用I2C存储器芯片,那没办法,只能用IO口模拟,单片机是主器件,芯片是从器件,还好办。
但是,两个单片机,还用l2C通信,你真是没事找事,一个是主器件,程序百度里可以找到,可另一个是从器件,这程序可从来没人写过,那两个单片机就不能通信。用宋丹丹一句话送你:你是没事找事,找抽型的。

困难,就以12c5a系列为例,最高频率最高频率35MHz。
你一个时钟做一个下降沿,至少要两个指令周期,一高一低。还要写数据线,加一个指令周期,写数据前要判断,判断前要移位。你写一个程序即可以算算要多少指令周期。这还不考虑,上升沿与下降沿的延时。stc单片机IO口由0变1会有两个周期的强推,这就说,在最高频率下可能需要两个周期才能确保低电平变高,也就是你写数据线后可能要等待一下,才能赋予时钟线下降沿。
你为什么需要这么高的速度,很多芯片都不支持这么高的速度,一般400k。
而且你还要看走线长短,和使用环境。

这是我写的模拟程序,只有一个发送函数和一个接收函数,EP为接收标志位,发送没有标志位,通过外部中断来发送起始信号,无应答与非应答,无结束信号,实测可以正常收发数据
#ifndef _IOPORTSEND_H__
#define _IOPORTSEND_H__
#include<reg52.h>
unsigned char DAT,EP=0;//可以把DAT当作串口中的SBUF,主机发送完后接收机从DAT提取数据
sbit flag = P3^3;//外部中断口
sbit ok = P2^7;//起始信号发送口
sbit PCL = P2^6;//时钟线
sbit PDA = P2^5;//数据线
void delay() //延时函数控制波特率
{
unsigned char a,b;
for(b=3;b>0;b--)
for(a=13;a>0;a--);
}
void PortInit()//中断配置
{
EA=1;
EX1=1;
IT1=1;
}
void SendPort(unsigned char dat)//发送函数
{
unsigned char i;
PCL=0;
ok=1;//通过ok来启动接收机的中断
ok=0;
for(i=0;i<8;i++)//开始发送数据
{
PCL=0;
delay();
if(dat&0x80)
PDA=1;
else
PDA=0;
PCL=1;
delay();
dat<<=1;
}
PCL=0;
delay();
ok=1;//ok置1以便下次发送时启动中断
PCL=1;//发送完毕释放时钟线与数据线
PDA=1;
}
void ReadPort()interrupt 2//接收函数,在中断函数中接收数据
{
unsigned char i;
static unsigned int b;
PCL=1;
PDA=1;//防止接收机的PCL口和PDA口影响数据的接收
for(i=0;i<8;i++)//开始接收数据
{
DAT<<=1;
while(PCL==0);
b=0;
while(PCL==1)
{
b++;
if(b==1)
if(PDA)
DAT|=0x01;
}
}
EP=1;//接收完毕后置EP为1,需要在其他函数中清零
}
#endif

如果要实再两个单片机的通信,完全可以用串口实现,非常简单,写程序更加容易。
为什么非要用I2C的方式呢,是题目要求的,非得这么做吗?为什么简单的不用,非要用麻烦的呢?为了显示什么能力吗?可自己并不会写呀,还来求写法。
I2C的通信协议很严格的,也很麻烦,写程序就更难了。何况还要用I/O脚来模拟,自找麻烦,真搞不明白。
只在用I2C的芯片时,没有办法,就得用I2C的协议。否则,不会故意来用I2C的协议来通信的。


如何用IO口模拟I2C来实现两个STC单片机之间的通讯,求C语言写法
} void ReadPort()interrupt 2\/\/接收函数,在中断函数中接收数据 { unsigned char i;static unsigned int b;PCL=1;PDA=1;\/\/防止接收机的PCL口和PDA口影响数据的接收 for(i=0;i<8;i++)\/\/开始接收数据 { DAT<<=1;while(PCL==0);b=0;while(PCL==1){ b++;if(b==1)if(PDA)DAT|...

硬件II2C和软件I2C有什么区别
模拟I2C 是通过GPIO,软件模拟寄存器的工作方式,而硬件(固件)I2C是直接调用内部寄存器进行配置。如果要从具体硬件上来看,可以去看下芯片手册。因为固件I2C的端口是固定的,所以会有所区别。至于如何区分它们 可以看底层配置,比如IO口配置,如果配置了IO口的功能(IIC功能)那就是固件IIC,否则就是模拟...

如何实现gpio口模式的配置
可以作为普通I\/O口\\x0d\\x0a\\x0d\\x0a - CAN模块; - JTAG调试接口;- 大部分定时器的引出接口; - 大部分USART引出接口\\x0d\\x0a\\x0d\\x0a - I2C1的引出接口; - SPI1的引出接口

MSP430FG439模拟I2C,从机没有响应
1) 两颗芯片I2C电路的电平是否相同。如果其中一颗芯片是输出1.8V,但是从机是3.3V的I\/O,就无法正常收到地址。2) 时钟的配置。是否其中一颗芯片SCL跑得过快(比如400K),但是从机只支持100K 最好用示波器对比两颗芯片运行时的波形(SCL、SDA都需要),就一目了然了 ...

单片机串行口是怎么进行解码的?
反正单片机硬件是没有编码系统的 此外,用一般的IO通信看你是实现什么协议,按照该协议来提供时序 一般来说能够模拟的串行通讯有I2C,SPI,SSP等等 再来说说并行通信 假如单片机A往P0口送01110111B,A的p0口接上单片机B的P0口,假如都能识别TTL电平,那么B的p0口上读到的数据就是01110111B ...

单片机串行口是怎么进行解码的?
反正单片机硬件是没有编码系统的 此外,用一般的IO通信看你是实现什么协议,按照该协议来提供时序 一般来说能够模拟的串行通讯有I2C,SPI,SSP等等 再来说说并行通信 假如单片机A往P0口送01110111B,A的p0口接上单片机B的P0口,假如都能识别TTL电平,那么B的p0口上读到的数据就是01110111B ...

怎么51单片机定时器来模拟PWM波?
对于用定时器来模拟,最基本的方法就是使用一个IO口循环设置其输出值为高电平和低电平。那么定时器在这里起计时作用,而且需要两个时间:高电平持续时间、低电平持续时间。只要做到这两个时间的计时,那么就可以实现基本的PWM了。而要做到两个时间的计时,有两种方案:1.单计时器方案 int i;\/\/计时变量...

用单片机的I\/O口通过什么方式可以控制PC817
在图中的IO上接到单片机,控制这个IO就可以控制PC817的导通与截止了。。。至于参数可以看手册!

ioio端口怎么接Hdmi口
IOIO通过USB接口与Android手机相连,高度集成了数字I/O端口、PWM、模拟输入端口、I2C总线、SPI,以及UART控制器等功能组件,只需通过简单、直观的JavaAPI驱动程序即可直接操作外部硬件I/O端口,既无需嵌入式编程,又不用外部编程器,使用方便灵活。因此,通过IOIO模块,Android手机可以方便地整合3G通信网络...

串口通信,spi通信和i^2c通信的数据帧有什么不同?
1、接口标准不同 串口通信可将接受的串行数据流转换为并行的数据字符供给CPU的器件。SPI通信由三条信号线组成:串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI)。I2C总线是双向、两线(SCL、SDA)、串行、多主控(multi-master)接口标准。2、使用线的根数不同 串口通信可以在使用一根线发送数据...

苍梧县19183775943: 如何用IO口模拟I2C来实现两个STC单片机之间的 -
朱郎高特: 两个单片机之间通信用串口啊,距离较近,可用TTL连接.距离远点就用RS232连接,程序好写.I2C的协议和时序太复杂,要是用I2C存储器芯片,那没办法,只能用IO口模拟,单片机是主器件,芯片是从器件,还好办. 但是,两个单片机,还用l2C通信,你真是没事找事,一个是主器件,程序百度里可以找到,可另一个是从器件,这程序可从来没人写过,那两个单片机就不能通信.用宋丹丹一句话送你:你是没事找事,找抽型的.

苍梧县19183775943: 用IO模拟I2C从模式 -
朱郎高特: 有条件的话,建议用示波器量一下波形,一目了然.个人觉得有以下几点需要搞清楚:1、该IO口是设置为外部中断、I2C中断还是普通IO口,这直接关系到接收方式的不同;2、I2C的频率设置为多少,IO口接收时的速度是否能匹配该频率;3、楼主说“只响应一部分中断”,是指漏收了几个字节、还是漏收了几比特?4、是否有优先级更高的中断占用,导致I2C未被响应;

苍梧县19183775943: 串行通讯方式 spi和 i2c各有何优点(适合在何种场合使用),两单片机板上相连,采用何种方式好. -
朱郎高特: 1,SPI总线就是三根. 片选CS一根,这个由各自芯片决定,有高平或者低平的.这个其实是必须的,因为只有片选到了才能找到.和我用的总线74HC573(或者74LS373)锁存器一个道理.如果片选成功,就上第二根线SCL,这个上面就是时...

苍梧县19183775943: 两块单片机之间用IO口可否实现通讯? -
朱郎高特: 就你的例如简单回答一下.将A单片机的P1^0脚接到B单片机的任意一个管脚,用B单片机检测这个管脚,if(此管脚高) { P1^1,3,5高电平 } else { P1^2,4,6高电平 } 这样就是A的任意管脚控制B了,建议你用一下74LS373,很简单.方案综合起来也比较简单 很简单的.不过要注意下一细节.我也是初学者,回答错误请指教.

苍梧县19183775943: 单片机的I2C接口可以用通用IO模拟吗?
朱郎高特: IO口要接上拉电阻.

苍梧县19183775943: 51单片机串口不够用,怎么样模拟 -
朱郎高特: 用一个普通IO口作为TXD发送口,外部中断口作为RXD接收口,就可以模拟串口通讯了.

苍梧县19183775943: 使用单片机如何实现I2C转RS232? -
朱郎高特: 你如果把I2C和RS232的读写时序都驱动起来,那么就把他们的数据互相交换就行了,比如232接收到数据,你就发到I2C上,反之亦然.

苍梧县19183775943: stc89c52单片机怎么实现用两个串口控制两个模块? -
朱郎高特: stc89c52单片机的确就有一个串口,当然可以在外部加一个模拟开关来扩展两个串口,但是两个串口是分时工作的,就是不能同时收发.其实,选择STC12C5A60S2,就完全解决了这个问题吗,它就有两个独立串口,价格上不比stc89c52高多少,还有STC现在推出了最新的STC15系列的单片机,都是有两个独立串口的,价格更低了,还完全可以省掉外部复位电路和时钟电路的晶振,非常方便,为什么不选择这款昵?何苦还用stc89c52,还不能解决两个串口的问题,换个思路问题就全解决了.

苍梧县19183775943: 两个51单片机如何通过i2c通讯?
朱郎高特: 一般情况下,要进行I2C通讯,你最起码其中有一个芯片要本身就带有I2C通讯接口,用这个带有I2C接口的芯片来作从器件,这样就相对好处理一点.你要是两个都不带这个接口,来模拟的话,很有难度.除非你对I2C协议很清楚,不过从楼主的提问来看,估计就不怎么熟悉这种协议. 所以建议还是用别的通讯方式吧,比如用SPI,相对会好处理一点,用其中一个芯片的INTx来模拟CS接口,作为从器件在中断中来处理,另外一个就模拟主器件来控制从器件,这样或许会好弄点.如果楼主确实需要通讯,还是赶快换个思路吧,要是卡在一个地方动不了,会耽误你的进程的,祝你好运!

苍梧县19183775943: 求救:两片AT24C02与单片机如何连接 -
朱郎高特: 用专用的I2C外设口连接2根线,SDA, SCL 或者用IO口模拟I2C时序,

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网