打印
[AVR单片机]

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

[复制链接]
4151|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口相应位来控制高低电平比较合适。

使用特权

评论回复
5
zhiwei| | 2007-4-13 12:32 | 只看该作者

AVR

的速度比51快很多,所以要注意延时要足够,才能保证时序。
AVR系列都有TWI或USI接口,可以硬件实现IIC,没有必要用软件模拟。

使用特权

评论回复
6
ayb_ice| | 2007-4-13 15:37 | 只看该作者

C8051F 100MIPS比AVR快很多...

使用特权

评论回复
7
wolver| | 2007-4-16 11:55 | 只看该作者

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

使用特权

评论回复
8
NE5532| | 2007-4-17 22:17 | 只看该作者

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

51是OC输出,时许上不容易出现冲突,用AVR要小心,想好先转方向还是先送数。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

0

粉丝