51单片机的IIC总线

发布者:WhisperingWish最新更新时间:2018-07-14 来源: eefocus关键字:51单片机  IIC总线 手机看文章 扫描二维码
随时随地手机看文章

一、IIC

(一)、IIC有什么作用


穿插:

上垃电阻一般接电源,下拉电阻一般接地

上拉电阻作用:

1、增加驱动电流

2、让线悬空电平不好确定,让总线在浮空的状态下,有确定的电平,滤除干扰

(二)、IIC通信协议


1、起始信号

SCL为高电平时,SDA由高变低

SCL为高电平时,SDA由低变高

函数:

void iic_start()

{

    SDA = 1;//首先操作SDA,再操作SCK,防止SCK在高电平时,SDA出现高低电平的变化

      SCK = 1;

      delay_us(1);//10us

      SDA = 0;

      delay_us(1);//10us

      SCK = 0;//钳住总线,让iic总线失效

}

void iic_stop()

{

    SDA = 0;

      SCK = 1;

      delay_us(1);

      SDA = 1;

      delay_us(1);

      SCK = 0;

}

2、IIC总线的数据传送

规定:

SCK(时钟线)为1时,数据必须保持稳定

SCK为0时,数据允许变化

传送一个字节,先发数据最高位,再发次高位,直至最低位

IIC发送数据函数

unsigned char iic_send_byte(unsigned char byte)

{

    unsigned char i;

      for(i =0; i < 8; i++)

      {

              SDA = byte & 0x80;//51中,若unsigned char 赋给一个bit类型的,则bit类型的值当unsigned char非0时为1,                                                                 否则为0

              SCK = 1; //先给SCK赋值,保持时钟为高电平时,数据稳定

              delay_us(1);//10us

              SCK = 0;

              byte <<= 1;

        }

        //检测应答信号

        SDA = 1;

        SCK = 1;

        delay_us(1);//10us

     

        if(0 == SDA)

        {

              SCK = 0;

              return SUCC;

        }

        else

        {

              SCK = 0;

              return FAIL;

        }

}

IIC接收数据函数

unsigned char iic_rcv_byte()

{

    unsigned char i;

      unsigned char temp;

      SDA = 1;//防止上一次操作将SDA给拉低

      for(i = 0; i < 8; i++)

      {

              SCK = 0;

              delay_us(1);

              SCK = 1;

              delay_us(1);

              temp <<= 1;//发送最高位,先放在最低位,然后移位,一直移到第八次

              if(1 == SDA)

                {

                      temp += 1;//如果SDA为0,为temp+=0,所以省略

                }

        }

        SCK = 0;//钳住总线

        return temp;

}

3、应答信号和非应答信号

应答:在SCK为高电平期间,接收设备将SDA拉低为低电平,

应答信号函数:

void iic_ack()//应答函数

{

    SDA = 0;

      SCK = 1;

      delay_us(1);

      SCK = 0;//钳住总线

}

在发送函数末尾可以添加:

        //检测应答信号

        SDA = 1;

        SCK = 1;

        delay_us(1);//10us

     

        if(0 == SDA)

        {

              SCK = 0;

              return SUCC;

        }

        else

        {

              SCK = 0;

              return FAIL;

        }


非应答信号:

void iic_noack()//非应答信号

{

    SDA = 1;

      SCK = 1;

      delay_us(1);

      SCK = 0;//钳住总线

}

二、EEPROM

型号                    容量

AT24C02        256bit  (开发板)  

AT24C04        512bit

AT24C08        1024bit

AT24C16        2048bit

关于设备的地址:


对EEPROM写入

unsigned char at24c02_send_str(unsigned char device_addr,unsigned char rom_addr,unsigned char *str,unsigned char num)

{

    unsigned char result;

      unsigned char i;

      iic_start();

      result = iic_send_byte(device_addr);

      if(FAIL == result)

        {

              return FAIL;

        }

      result = iic_send_byte(rom_addr);

      if(FAIL == result)

        {

              return FAIL;

        }

        for(i = 0; i < num; i++)

      {

                result = iic_send_byte(*str++);

                if(FAIL == result)

                {

                        return FAIL;

                }

        }

        iic_stop();

        return SUCC;

}

对EERPOM读取:

unsigned char at24c02_rcv_str(unsigned char device_addr,unsigned char rom_addr,unsigned char *str,unsigned char num)

{

    unsigned char result;

      unsigned char i;

      iic_start();

      result = iic_send_byte(device_addr);

      if(FAIL == result)

        {

              return FAIL;

        }

      result = iic_send_byte(rom_addr);

      if(FAIL == result)

        {

              return FAIL;

        }

        iic_start();

      result = iic_send_byte(device_addr + 1);

      if(FAIL == result)

        {

              return FAIL;

        }

        for(i = 0; i < num - 1; i++)

      {

                *str++ = iic_rcv_byte();            

        iic_ack();                    

        }

        *str = iic_rcv_byte();

        iic_noack();

        iic_stop();

        return SUCC;

}


关键字:51单片机  IIC总线 引用地址:51单片机的IIC总线

上一篇:基于51单片机的按键控制超声波测距及显示的实现
下一篇:C51单片机IIC总线通信协议及简单应用例程

推荐阅读最新更新时间:2024-03-16 16:08

第三节 趣讲51单片机之P1P2P3口深入讲解
一、P1口 P1口是4组Parallel Ports中最简单的。其结构图如下: 与P0口的区别是:由于没有端口复用功能,所以,P0口的V1变成了一个上拉电阻。 由于内部就有上拉电阻,所以,作为GPIO时,P1口不需要接上拉电阻,当然,您接了也没关系啦,就相当于两个上拉电阻并联嘛。 读端口、读引脚、写功能在P0中已经讲得非常详细了,此处略个一万字。 二、P2口 P2口的原理图如下图: 咋一看,和P0口有点像,都有控制信号,选择作为 地址/数据 总线还是作为GPIO;又和P0口有些不同,P2口没有推挽式输出的结构,即没有V1 MOS管。 我们说过,P0在作为 地址/数据 总线时
[单片机]
第三节 趣讲<font color='red'>51单片机</font>之P1P2P3口深入讲解
51单片机——多功能电子钟
实现的功能有:走 时、校时、闹钟、温度、遥控这几个功能。要想实现这几个功能,其中走时所需要的就是时 钟芯片,即 DS1302;时间需要显示给人看,就需要显示器件,我们用到了点阵、数码管、 独立 LED、液晶;再来看校时,校时需要输入器件。 注重模块化思想: // 工程配置头文件config.h: #ifndef _CONFIG_H #define _CONFIG_H /* 通用头文件 */ #include reg52.h #include intrins.h /* 数据类型定义 */ typedef signed char int8; // 8位有符号整型数 t
[单片机]
51单片机实现音频信号的频谱显示
思路:外来音频信号经过51单片机,在单片机中进行频谱分析,并将结果显示在LCD(12864或1602)上 要求:频谱显示如同千千静听播放音乐时的频谱显示 希望各位高手能给出详细的解决方案,感激。。。。。。 51做FFT有些困难,可以使用增强型(RAM)的51机子进行 参考程序: #include STC12C5A.H #define uchar unsigned char #define uint unsigned int #define channel 0x01 //设置AD通道为 P1.1 //------------------------------------------------------------
[单片机]
51单片机外围模块——A/D模数转换
一、A/D转换器的主要技术指标 1、分辨率 ADC的分辨率是指使输出数字量变化一个相邻数码所需输入模拟电压的变化量。常用二进制的位数表示。例如12位ADC的分辨率就是12位,或者说分辨率为满刻度的1/(2^12)。 一个10V满刻度的12位ADC能分辨输入电压变化最小值是10V×1/(2^12 )=2.4mV。 2、量化误差 ADC把模拟量变为数字量,用数字量近似表示模拟量,这个过程称为量化。量化误差是ADC的有限位数对模拟量进行量化而引起的误差。实际上,要准确表示模拟量,ADC的位数需很大甚至无穷大。一个分辨率有限的ADC的阶梯状转换特性曲线与具有无限分辨率的ADC转换特性曲线(直线)之间的最大偏差即是量化误差。 3、偏
[单片机]
<font color='red'>51单片机</font>外围模块——A/D模数转换
基于51单片机的智能温控风扇
硬件设计 数码管作为显示器,按键设置温控范围,当环境温度低于最低值,风扇关闭,在温度范围内,风扇为1挡,环境高于最高值,风扇为2挡; 仿真图: 0挡 1挡 2挡 程序设计 #include reg51.h #include intrins.h //包含头文件 #define uchar unsigned char #define uint unsigned int //宏定义 sbit dj=P1^0;//电机控制端接口 sbit DQ=P1^6;//温度传感器接口 //按键接口/ sbit key1=P3^5;//设置温度 sbit key2=P3^6;//温度加 sbit key3=P3^7;//温度减 //
[单片机]
基于<font color='red'>51单片机</font>的智能温控风扇
51单片机串口调试程序一列
51单片机串口调试程序一列 /*定义为中断方式串口处理*/ #define INTERSENDSTR /*不为8032系列芯片 */ //#define CHIP_8032 #i nclude absacc.h #i nclude reg51.h #i nclude string.h #i nclude err.h #ifdef INTERSENDSTR unsigned char xdata sSendComBuf ,sRecComBuf ; unsigned char data bOut,bIn,bSout,bSin; #else #define DEFSENDCHAR TI=0;SBUF=ACC;while(!T
[单片机]
51单片机程序——按键控制LED灯
#include reg52.h void Delay(unsigned int t); sbit key=P3^2; //对应单片机开发板上s19按键 void main (void) { while (1) //函数开始后,一直在检测按键是否被按下 { if(key==0) { unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255 P0=0x7f; //赋初始值,右边第一个灯亮起来 for(i=0;i 8;i++) //加入 for循环,表明for循环大括号中的程序循环执行8次 { Delay
[单片机]
MCS-51单片机与无线调制器的综合应用
GPS是目前技术上最成熟且已实用的一种定位系统,但是在GPS定位系统中,由于其是一个单向导航系统,他是把星历数据等传给地面接收机,可在许多具体应用时,例如在车辆调度系统中,一般都需要把利用GPS测得的信息数据传到调度中心,由于其系统由一个基准站和多个用户台组成,基准站与用户台之间的联系,即由基准站计算出的各种校正值发送到用户台,上边这一切都需要用到数据链来完成数据的传输。其中,数据链由调制解调器和电台组成。在无线数据传输系统中,调制解调器足一个关键部分,调制解调器(Modem)是将数据进行编码和调制,然后输入到电台发射出去,用户台将其接收下来,并将数据解调后,送入GPS接收机进行改正。本文介绍了单片机控制Modem的原理和方法。
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved