• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

51单片机能做IIC吗?有没有列程

88f9bc38cc9d5238 2018-09-19 浏览量:1843
51单片机能做IIC吗?有没有列程
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 可以通过IO口模拟IIC

    #include "iic.h"


    /********************************/
    /*函数名称:IICstart
    /*函数输入:无
    /*函数输出:无
    /*函数功能:IIC起始信号
    /*编写日期:2017-8-6
    /********************************/
    void IICstart() //IIC总线起始信号,在SCL为高电平时,SDA出现一个下降沿表示开始
    {
    SCL = 1; SDA = 1; delay_us(1);
    SDA = 0; delay_us(1);
    SCL = 0; delay_us(1);
    }
    /********************************/
    /*函数名称:IICstop
    /*函数输入:无
    /*函数输出:无
    /*函数功能:写数据
    /*编写日期:2017-8-6
    /********************************/
    void IICstop() //IIC总线结束信号,在SCL为高电平时,SDA出现一个上升沿表示结束
    {
    SCL = 0; SDA = 0; delay_us(1);
    SCL = 1; delay_us(1);
    SDA = 1; delay_us(1);
    }
    /********************************/
    /*函数名称:IICwrite
    /*函数输入:dat
    /*函数输出:ack
    /*函数功能:写数据
    /*编写日期:2017-8-6
    /********************************/
    bit IICwrite(uchar dat) //每写成功一位从机都要返回一个应答值(0),不成功返回费应答值(1)
    {
    bit ack;
    uchar mask; //mask为分离出dat每一位的掩码变量

    for(mask=0X80;mask!=0;mask>>=1)
    {
    SDA = mask&dat; //SDA取决于dat这正是我们想要的

    delay_us(1); SCL = 1;
    delay_us(1); SCL = 0;
    }
    SDA = 1; delay_us(1); //释放SDA,如果SDA被拉低读的数始终为0
    SCL = 1; ack = SDA; delay_us(1);
    SCL = 0;

    return ~ack; //应答位取反符合我们的日常逻辑
    }
    /********************************/
    /*函数名称:IICread
    /*函数输入:ack
    /*函数输出:dat
    /*函数功能:读数据
    /*编写日期:2017-8-6
    /********************************/
    uchar IICread(bit ack) //单片机读取数据,此时单片机为从机
    { //应答由从机给出(单片机)
    uchar dat = 0mask;

    SDA = 1;
    for(mask=0X80;mask!=0;mask>>=1)
    {
    SCL = 1; delay_us(1);
    dat |= SDA ? mask : 0;
    SCL = 0; delay_us(1);
    }
    SDA = ~ack; delay_us(1);
    SCL = 1; delay_us(1);
    SCL = 0;

    return dat; //返回读取到的数据
    }
    • 发布于 2018-09-19
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:21

相关问题

问题达人换一批

51单片机能做IIC吗?有没有列程