[AVR单片机] 51和AVR单片机模拟I2C的区别?

[复制链接]
5111|7
 楼主| 大路 发表于 2007-4-12 21:56 | 显示全部楼层 |阅读模式
感觉AVR的IO模拟I2C和51模拟还是有区别的,下面是AVR和51的模拟I2C的例子。小弟现在有点迷惑,那位达人能解释一下?
/***********************AVR
unsigned char I2C_Read(unsigned char bEnd) 

     unsigned char i,mb; 
     
     Set_SDA;     //release sda line 
     mb=0; 
     for(i=0;i<8;i++) 
     { 
         mb=mb<<1; 
         
         I2C_Delay(); 
         Set_SCL; 
         I2C_Delay(); 
         if( SDA_High ) mb++; 
         I2C_Delay(); 
         Cls_SCL; 
         if(i!=7)         I2C_Delay(); 
     } 
     if( bEnd )       Set_SDA;         //end read 
     else             Cls_SDA;         //ack 
     I2C_Delay(); 
     
     Set_SCL; 
     I2C_Delay(); 
     Cls_SCL; 
     I2C_Delay(); 
     Set_SDA; 
     
     return mb; 


////////////////////////51
unsigned char I2C_Read()
{
    unsigned char dat;
    unsigned char t = 8;
    I2C_SDA = 1;    //在读取数据之前,要把SDA拉高,使之处于输入状态
    do
    {
        I2C_SCL = 1;    I2C_Delay();
        dat <<= 1;
        if ( I2C_SDA ) dat++;
        I2C_SCL = 0;    I2C_Delay();
    } while ( --t != 0 );
    return dat;
}
ddb_21ic 发表于 2007-4-13 07:29 | 显示全部楼层

可以做得一样

但是要通过宏来做个指令转换
最大的区别就是AVR有DDR设置,51没有类似的需求
ayb_ice 发表于 2007-4-13 08:00 | 显示全部楼层

注意IO方向问题...

BitFu 发表于 2007-4-13 11:06 | 显示全部楼层

我觉得AVR应该接外部上拉电阻

我觉得AVR应该接外部上拉电阻
之后PORT口一直保持0
通过改变DDR口相应位来控制高低电平比较合适。
zhiwei 发表于 2007-4-13 12:32 | 显示全部楼层

AVR

的速度比51快很多,所以要注意延时要足够,才能保证时序。
AVR系列都有TWI或USI接口,可以硬件实现IIC,没有必要用软件模拟。
ayb_ice 发表于 2007-4-13 15:37 | 显示全部楼层

C8051F 100MIPS比AVR快很多...

wolver 发表于 2007-4-16 11:55 | 显示全部楼层

AVR有硬件I2C啊,为什么不用,还用仿真?!

NE5532 发表于 2007-4-17 22:17 | 显示全部楼层

回楼上,那个硬口不见得好用。

51是OC输出,时许上不容易出现冲突,用AVR要小心,想好先转方向还是先送数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部