1、 2011 单片机 I2C 串行总线的 应用 Proteus 仿真单片机 I 2 C 串行总线 目录 一、电路图 . 2 二、源程序代码与注释 . 3 2.1 Main.C 文件 . 3 2.2 24C04.C 文件 3 三、I 2 C 串行 总线简介 5 四、I 2 C 总线 工作原理 7 五、使用 Keil 编写和编译 C 语言源代 码 . 8 六、Proteus 仿真单片机电路 15 七、Proteus 常用器件中英文对照 17 一、电路 图 图 1-1 二 、源程 序代码 与注释 本例通过 I 2 C 串行总线协议,单片机向 24C04 的0x00 到0x07 地址分别写入 8F 。
2、由 Main.C 和24C04.C 两个 文件构成。 2.1 Main.C 文件 #include #include #define uint unsigned int #define uchar unsigned char void Write_I2C(uchar addr,uchar dat); void DelayMS(uint ms) /延时 uchar i; while(ms-) for(i=0;i #include #define uint unsigned int #define uchar unsigned char #define NOP4() _nop_();nop_();
3、nop_();nop_(); sbit SCL=P10; sbit SDA=P11; void DelayMS(uint ms); void Start() /I2C 开始,SCL 线为高电平期间, SDA 线由高电平向低电平的变化表示起 始信号 SDA=1; SCL=1; NOP4(); SDA=0; NOP4(); SCL=0; void Stop() /I2C 停止 ,SCL 线为高电平期间,SDA 线由 低电平向高电平的变 化表示停止信号 SDA=0; SCL=0; NOP4(); SCL=1; NOP4(); SDA=1; void Read_ACK() /读取应答, 传完一个字节后
4、等待从机应答 SDA=1; NOP4(); SCL=1; NOP4(); SCL=0; void NO_ACK() / 发送非应 答信号 SDA=1; SCL=1; NOP4(); SCL=0; SDA=0; void Write_A_Byte(uchar b) /向 24C16 中 写一字节数据 uchar i; for(i=0;i8;i+) b=1; SDA=CY; _nop_(); SCL=1; NOP4(); SCL=0; Read_ACK(); void Write_I2C(uchar addr,uchar dat) /向指定地址 写数据 Start(); Write_A_Byte(
5、0xa0); /1010 0000 发出写数据指令, 0xa0 前 7 位是地 址, 第 8 位 0 是主机 发送数据 Write_A_Byte(addr); /先选择地址 Write_A_Byte(dat); Stop(); DelayMS(10); 三、I 2 C 串行总线 简介 I 2 C 总线是 PHLIPS 公司 推出的一种串行总线,是具备多主机系统所需的包括总线裁决 和高低速器件同步功能的高性能串行总线。 I 2 C 总线是双 向、 两线( 时钟线 SCL 、 数据线 SDA) 、 串行、 多主控 (multi-master)接口 标准, 具有总线仲裁机制, 非常适合在器件之间进行
6、近距离、 非经常性的数据通信。 在它 的 协议体系中,传输数据时都会带上目的设备的设备地址,因此可以实现设备组网。 如果用通用 IO 口模拟 I 2 C 总线,并 实现双向传输,则需一个输入输出口(SDA),另 外 还需一个输出口(SCL)。 I 2 C 总线通过 上拉电阻接正电源。 当总线空闲时, 两根线均为高电平。 连到总线上的任 一器件输出的低电平,都将使总线的信号变低,即各器件的 SDA 及SCL 都是线“与”关系。 图 2-1 特点: 每个连到总线上的器件都可由软件唯一的地址寻址, 并建立简单的主从关系。 主器 件既可作为发送器,又可作为接收器。 同步时钟允许器件通过总线以不同的波特
7、率进行通信 同步时钟可以作为停止和重新启动串行口发送的握手方式 连接到同一总线上的集成电路器件数只受 400PF 的总大总线 电容的限制 注:组成I 2 C 总线的串行数据线 SDA 和串 行时钟线 SCL 必须经过上 拉电阻 Rp 接 到正电 源上,连接到总线上的器件的输出极必须为“开漏”或“开集”的形式,以便完成“线与” 的功能。 I 2 C 需要有双向 IO 的支持 ,而且使用上拉电阻,抗干扰能力较弱,一般用于同一板卡 上芯片之间的通信, 较少用于远距离通信。 一般单片机系统里主要用来和 24C02 等小容 量存 储器连接 。 每个接到I 2 C 总线上的器件都有唯一的地址。 主机与其它
8、器件间的数据传送可以是由主 机发送数据到其它器件,这时主机即为发送器。由总线上接收数据的器件则为接收器。 在多主机系统中,可能同时有几个主机企图启动总线传送数据。为了避免混乱, I 2 C 总线要通过总线仲裁,以决定由哪一台主机控制总线。 在 80C51 单 片机应用系统的串行总线扩展中,我们经常遇到的是以 80C51 单片机 为主 机,其它接口器件为从机的单主机情况。 四、I 2 C 总线工作 原理 I2C 总线进行 数据传送时, 时钟信号为高电平期间, 数据线上的数据必须保持稳定, 只 有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。 起始和终止信 号 : SCL
9、线为高 电平期间,SDA 线由高电平向低电平的变化表示起始信号;SCL 线为高 电 平期间,SDA 线由低电平向高电平的变化表示终止信号。 数据传送格式 : 字节传送与应答 每一个字节必须保证是 8 位长度。 数据传送时, 先传送最高位 (MSB ) , 每一个被传送 的字节后面都必须跟随一位应答位(即一帧共有 9 位) 。 如果一段时间内没有收到从机的应 答信号,则自动认为从机已正确接收到数据。 五、使用 Keil 编写和编 译 C 语言源代 码 1 、打开 Keil ,新建工程 图 5-1 2 、在弹出的 对话框中输入新建工程文件名,然后按 保存 图 5-2 3 、选择单片 机型号 图 5
10、-3 4 、在弹出的 对话框里选择 否 ,因 为是用 C 语 言编写的代码 图 5-4 5 、新建文件 图 5-5 6 、按保存 ,输入 C 语言 主程序文件名:Main.C( 一定要写上扩展名.C) ,保存 图 5-6 7 、再创建 24C04.C 文件 图 5-7 8 、然后分别 把两个 C 文 件加入项目资源组内 图 5-8 图 5-9 图 5-10 图 5-11 9 、在 Main.C 和24C04.C 里分别输入相应的代码,记得保存。 图 5-12 图 5-13 10、然后选 择创建目标程序 图 5-14 11、编绎, 在输出窗口里显示编译信息,结果不能有错误项 图 5-15 六、P
11、roteus 仿真 单片机 电路 1 、打开 Proteus 的ISIS 仿真软件,按P 选择电 路所用到的元器件 图 6-1 2 、搭建电路 图 6-2 3 、双击 AT89C51 元件,弹 出编辑元件对话框,在Program File 栏里选择 刚才编译好 的目标文件“I2C 串行总 线通讯.hex”,按 OK 图 6-3 4 、按下 开始 , 仿真电 路就工作了。 图 6-4 5 、这时按 暂停 ,选择调试debug菜单,在下列列表里选择I2C Memory Internal Memory U2, 在弹出窗口 中就可以看到单片机向 24C04 里写的 内容了。 图 6-5 图 6-6 七
12、、Proteus 常用 器件中 英文 对照 Proteus 中常 用的元器件被分成了 25 大类,为了方便快速地查找到相应器件,在 Pick Devices (拾 取元器件)对话框中,首先选中相应的大类,然后使用关键词进行搜寻。 Proteus 的这 25 大类元 器件分别为: Analog ICs 模拟IC CMOS 4000 series CMOS 4000 系列 Data Converters 数据转换器 Diodes 二极管 Electromechanica 机电设备 (只有电机模型) Inductors 电感 Laplace Primitives Laplace 变换器 Memory
13、 ICs 存储器IC Microprocessor ICs 微处理器IC Transistors 三极管 Miscellaneous 杂类 (只有电灯和光敏电阻 组成的设备) Modelling Primitives 模型基元 Operational Amplifiers 运算放大器 Optoelectronics 光电子器件 Resistors 电阻 Simulator Primitives 仿真基元 Switches & Relays 开关和继电器 TTL 74、74ALS、74AS、74F、74HC、74HCT、 74LS、74S series 74 系列集成电路 表 6-1 常用器件的
14、英文名称,列举如下: AND 与门 ANTENNA 天线 BATTERY 直流电源(电池) BELL 铃,钟 BRIDEG 1 整流桥(二极管) BRIDEG 2 整流桥(集成块) BUFFER 缓冲器 BUZZER 蜂鸣器 CAP 电容 CAPACITOR 电容 CAPACITOR P 有极性电容 CAPVAR 可调电容 CIRCUIT BREAKER 熔断丝 COAX 同轴电缆 CON 插口 CRYSTAL 晶振 DB 并行插口 DIODE 二极管 DIODE SCHOTTKY 稳压二极管 DIODE VARACTOR 变容二极管 DPY_3-SEG 3 段LED DPY_7-SEG 7
15、段LED DPY_7-SEG_DP 7 段LED(带小 数点) ELECTRO 电解电容 FUSE 熔断器 INDUCTOR 电感 INDUCTOR IRON 带铁芯电感 INDUCTOR3 可调电感 JFET N N 沟道场效应管 JFET P P 沟道场效应管 LAMP 灯泡 LAMP NEDN 起辉器 LED 发光二极管 METER 仪表 MICROPHONE 麦克风 MOSFET MOS 管 MOTOR AC 交流电机 MOTOR SERVO 伺服电机 NAND 与非门 NOR 或非门 NOT 非门 NPN NPN 三极管 NPN-PHOTO 感光三极管 OPAMP 运放 OR 或门
16、PHOTO 感光二极管 PNP PNP 三极管 NPN DAR NPN 三极管 PNP DAR PNP 三极管 POT 滑线变阻器 PELAY-DPDT 双刀双掷继电器 RES1.2 电阻 RES3.4 可变电阻 BRIDGE 桥式电阻 RESPACK 电阻排 SCR 晶闸管 PLUG 插头 PLUG AC FEMALE 三相交流插头 SOCKET 插座 SOURCE CURRENT 电流源 SOURCE VOLTAGE 电压源 SPEAKER 扬声器 SW 开关 SW-DPDY 双刀双掷开关 SW-SPST 单刀单掷开关 SW-PB 按钮 THERMISTOR 电热调节器 TRANS1 变压器 TRANS2 可调变压器 TRIAC 三端双向可控硅 TRIODE 三极真空管 VARISTOR 变阻器 ZENER 齐纳二极管 表 6-2