9

帖子

0

TA的资源

一粒金砂(初级)

21
 
我做的并口模拟IIC程序。能用的。你参考一下吧!

延时可以自己适当调整。
sbit    SCL=P0^1;            //IIC
sbit    SDA=P0^0;            //IIC
//****************************************
//
//     IIC 总线
//
//****************************************

//不可调用,程序私有


bit IIC_START(void)    //IIC开始
{  SDA=1;
   Delay_10us(1);
   SCL=1;
if (SDA==1)
{
   SDA=0;
   Delay_10us(1);
   SCL=0;
   SDA=1;
   return 1;
}
else
    return 0;
}


void IIC_STOP(void)   //IIC停止
        {  SDA=0;
           Delay_10us(1);
           SCL=1;
           Delay_10us(1);
           SDA=1;
           Delay_10us(1);            
        }


void IIC_ACK(void)   //发送应答
        {
           SDA=0;
           Delay_10us(1);
           SCL=1;
           Delay_10us(1);
           SCL=0;
           Delay_10us(1);
           SDA=1;
           Delay_10us(1);
        }


void IIC_NACK(void)  //发送无应答
        {      
            SDA=1;
            Delay_10us(1);
            SCL=1;
            Delay_10us(1);
            SCL=0;   
            Delay_10us(1);
            SDA=0;
            Delay_10us(1);      
        }

bit IIC_WACK(void)        //等待应答信号
{ unsigned char errtime=255;//因故障接收方无ACK,超时值为255。
SDA=1;
Delay_10us(1) ;
SCL=1;
while(SDA)
{ errtime--;
if (!errtime)
{ IIC_STOP();
return 0;
} }
Delay_10us(1) ;
SCL=0;
Delay_10us(1) ;
return 1; }
                     

bit IIC_SEND_BYTE( uchar d)//IIC输出1字节,并口模拟IIC输出
{
uchar i = 8;

while( i-- )
{
  Delay_10us(1);
  if ( d &0x80 )   SDA =1;
  else             SDA =0;
Delay_10us(1);
SCL = 1;
Delay_10us(1);
SCL = 0;
  d = d << 1;
}
IIC_WACK();
return (1);
}


uchar IIC_RECEIVE_BYTE(void) //IIC接受1字节,并口模拟IIC输入
{
uchar i=8;
uchar d=0;     
SDA=1;
while (i--)
{
  d=d<<1;
  SCL =0;
  Delay_10us(1);
  SCL =1;
  Delay_10us(1);

  if ( SDA==1 )
  d|=0x01;
  else if(SDA==0)
  d&=0xfe;
  Delay_10us(1);
  SCL =0;
}
return d;
}

[ 本帖最后由 爆裂 于 2008-7-12 00:45 编辑 ]
此帖出自单片机论坛
 

回复

66

帖子

0

TA的资源

一粒金砂(中级)

22
 

回复 21楼 爆裂 的帖子

你好,现在才看到。
谢谢你啊!
我是用iic做两个单片机的通讯,而这两个单片机都包含有iic逻辑单元,所以就不用自己写模拟时序的程序了。
但是了解这些对于真正理解iic是很有好处的,我也有一些这方面的例程,是书上的,等我整理一下再分享出来。

还有我想针对你的帖子问两个问题:
1、iic是一种串行通信总线,那你说的“并口模拟iic程序”中的并口是什么意思呢?
2、你说延时的时间是可以调整的,这好像正好是我不明白的iic的时钟选择问题。你选择的是T=20us, f=1/T=50KHz。我不全面的看了一些资料,频率是不是要在10KHz~400KHz这个范围内呢?(这个问题等我明天仔细看看再问吧,困了:D )
此帖出自单片机论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表