单片机IIC基础通信

1 接口定义
2 程序实例

阅读提示:本章主要讲解过去电路使用较多的24C02- 24C512存储器,对于现在 主流的STC15W系列单片机,通常都具有内部比较器与DataFlash存储器,可 直接代换代换本章各个例程功能(详见第7章)
1 接口定义

I2C总线是两线式串行总线(连同GND为3线),仅需要时钟和数据两根线就可 以进行数据传输,仅需要占用单片机的2个IO引脚,使用时十分方便,I2C总线可 以在同一总线上并接多个器件,每个器件都有自己的器件地址(作为对比:SPI 总线没有器件地址,通过CPU提供片选线确定是否选中芯片),读写操作时需要 先发送器件地址,与该地址相符的器件得到确认后便执行相应的操作,而在同一 总线上的其它器件不做响应,称之为器件寻址。

单片机外围使用I2C接口的器件比较多,最常见的是EEPROM存储器(如:
24C02)与ADC转换芯片(如:MCP3421) 。
24C02与单片机的连接电路如下图所示。

2 程序实例
24C系列芯片既然作为存储器使用,我们最关心的就是如何将数据写入芯片及 写入成功的数据如何读取出来。

例6.2 使用IAP15W4K58S4单片机的硬件仿真功能仿真观察24C02芯片读写结果
(也可用24C01/04/08/16) 。本例无页面限制,快速,适合连续读写多个字 节,本程序先向芯片写入一组数据,然后读出,若读出的数据与写入的数据相同 则表明实验结果是正确的。

为了简化,我们直接移植成熟的程序代码(配套例程中提供)。
① 除主程序MAIN.C外,其余*.C与*.H文件全部复制到你自己的文件夹并将*.C文 件加入工程,如图所示。

② 根据实际硬件连接修改引脚定义。在IIC.H中有如下语句,可设置为任意IO口,注
意上拉。

sbit SCL=P3^7; // 串行时钟(代码包必须)

sbit SDA=P4^1; // 串行数据(代码包必须)

③ 根据硬件修改从机地址。在24C01_02.H中有:#define SlaveADDR 0xA0 // 从机 地址格式为:1010 ***0。其中的***对应器件引脚 A2A1A0,,用于设置器件地 址,当硬件上A2A1A0接GND时, ***=000。
④ 在要求严格的情况下,根据R/C时钟频率修改延时函数参数。myfun.c中的延时函 数delay1ms()和delay10ms()延时参数由第1章介绍的软件计算得出。

⑤ 根据R/C时钟频率修改宏定义。IIC.H中的语句 “#define tt 26”的常数26对应
myfun.c中的延时函数void delay (unsigned char t)中的参数t,此常数值确定
5uS延时时间,延时可以更长,不能短,时钟频率为22.1184MHz时t=26。
⑥ 这里的例子使用的是24C02芯片,若换用24C04/08/16,为了提高多字节数据跨页 写入速度,则需要对24C01_02.C中函数WrToRomPageB内部常数0x07改为0x0f。

主程序代码如下(注意是硬件仿真观察实验结果):

#include “STC15W4K.H” // 注意宏定义后面没分号
#include “24C01_02.H”
#include “myfun.h” void main()
{
u8 i;
u8 test_data[20]={0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90,0xa0,
0x11,0x21,0x31,0x41,0x51,0x61,0x71,0x81,0x91,0xa1};
port_mode(); // 所有IO口设为准双向弱上拉方式。 WrToRomB(SlaveADDR, 5,test_data,20);
// 器件地址、存储单元地址、数据指针、写入字节数
for(i=0;i<20;i++)
{
test_data[ i ]=0;
}
RdFromROM(SlaveADDR, 5,test_data,20); // 连续读取20个字节数据
while(1);
}
例6.5利用24C02记录单片机上电次数(使用工作组方式)

头文件代码如下:

#define E2P_RECORD_ADDR 0x00 // 存储单元地址

#define POWER_UP_MARK 0xAB // 第一次使用标记

struct POWER_UP

{
u32 times;

u8 flag;

};
// 主程序代码如下:

#include “PowerUP.H”

#include “24C01_02.H”

#include “myfun.h”

struct POWER_UP Power_up;
void main()
{

RdFromROM(SlaveADDR,E2P_RECORD_ADDR,(u8*)&Power_up,sizeof(struct POWER_UP));

// 芯片硬件地址、存储单元地址、数据组、写入字节数

if (Power_up.flag != POWER_UP_MARK) // 存储器第一次使用
{

}
else
{

}

Power_up.flag = POWER_UP_MARK; Power_up.times = 1;

Power_up.times++;
WrToRomB(SlaveADDR, E2P_RECORD_ADDR,(u8 *)&Power_up,sizeof(struct POWER_UP));

// 芯片硬件地址、存储单元地址、数据组、写入字节数 UART_init(); UART_Send_StrNum(“上电次数:”,Power_up.times);
// 串口输出上电次数,波特率:9600 /22.1184MHZ
while(1);
}
结果如图所示。

例6.6 利用24C02断电瞬间存储数据。断电存储就是在系统断电瞬间保存RAM中的重要数据 到EEPROM,在下次系统上电时再读出EEPROM中的数据并运行,断电检测电路原理如图所 示。

利用单片机外中断检测交流电源的有无,交流供电正常时INT2每10mS进入一次中断,在中断
程序中重装定时器T1初值让定时器一直不产生溢出中断,交流断电时,定时器计数值不断增 加直到溢出,溢出中断程序中单片机立即保存数据到EEPROM 。定时器定时时间要求大于
10mS即可,比如取12或15mS,另外特别注意单片机外中断引脚必须外接上拉电阻。
对于现在主流的STC15W系列单片机,通常都具有内部比较器与DataFlash存储器,可直接 代换24C系列存储器使用,断电检测电路更加简单,如上图单片机VCC与GND间接2只电阻即可。

扫盲教程:单片机IIC基础通信相关推荐

  1. 16F877A和24C02通信汇编语言,pic单片机IIC通信读24C02程序例 16F877A 主频4M

    #define _iic_h_//pic单片机IIC通信初始化函数声明 void iiccsh(void); //pic单片机IIC通信读外围设备函数声明 //功能:传送一个8位地址,返回一个8位数据 ...

  2. Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析

    关于Exynos4412 IIC 裸机开发请看 :Exynos4412 裸机开发 -- IIC总线 ,下面回顾下 IIC 基础概念 一.IIC 基础概念 IIC(Inter-Integrated Ci ...

  3. Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析 (iic驱动框架,i2c驱动框架)...

    转载于 : http://blog.csdn.net/zqixiao_09/article/details/50917655 关于Exynos4412 IIC 裸机开发请看 :Exynos4412 裸 ...

  4. LPC2124单片机的基础操作——GPIO、外部中断、定时器和串口

    LPC2124单片机的基础操作--GPIO.外部中断.定时器和串口 LPC2124的简介 LPC2124之GPIO GPIO简介 编程习惯 代码编写 LPC2124之EINT(外部中断) EINT简介 ...

  5. 如何学好单片机编程?学好单片机的基础是什么?

    大家好,我是无际. 最近几个推文都比较烧脑,今天水一篇轻松的,免得大家头发越来越稀疏. 在我即将毕业的那年,我一直很羡慕学校学计算机专业的同学. 他们的未来充满了前景,工作几年拿个几万块,而且上限也高 ...

  6. Java基础教程:多线程基础(3)——阻塞队列

    Java基础教程:多线程基础(3)--阻塞队列 快速开始 引入问题 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 模 ...

  7. 120分钟React快速扫盲教程

    在教程开端先说些题外话,我喜欢在学习一门新技术或读过一本书后,写一篇教程或总结,既能帮助消化,也能加深印象和发现自己未注意的细节,写的过程其实仍然是一个学习的过程.有个记录的话,在未来需要用到相关知识 ...

  8. 区块链教程(二):基础概念介绍

    注:本教程为技术教程,不谈论且不涉及炒作任何数字货币 本系列重点在于以太坊基础知识.以太坊客户端以及以太坊solidity编程,因此博客重点在于以太坊核心知识点的掌握,区块链部分的基础知识可以作为补充 ...

  9. STM32 HAL I2C(IIC)通信的序列传输(restart condition)

    STM32 HAL I2C(IIC)通信的序列(Seq)传输函数(restart condition) neozng1@hnu.edu.cn 文章目录 STM32 HAL I2C(IIC)通信的序列( ...

最新文章

  1. 程序员涨薪必备技能(1-5年必看!!!)
  2. a href=#与 a href=javascript:void(0) 的区别 打开新窗口链接的几种办法
  3. 山西地区领取2020年下、2021年上半年证书
  4. 安卓学习笔记---Activity
  5. java set spliterator_Java HashSet spliterator() 方法
  6. jvm运行时类加载机制_JVM体系结构:JVM类加载器和运行时数据区
  7. 今天完成了share memory的测试
  8. oracle wm_concat listagg,oracle分析函数:四、listagg和wmsys.wm_concat
  9. 02. Win32 API简介
  10. List集合的各种排序
  11. DDNS设置(自用)
  12. matlab数组输出字符,Matlab字符型数组的输入输出
  13. outlook邮箱显示一直启动中_outlook邮箱打不开一直在加载
  14. 得意不张狂失败不气妥
  15. Python3-标准库概览
  16. 用HTML+CSS简单仿制了一个bilibili电脑界面⚆_⚆(做着玩的)
  17. 【Java SE】SE“细节”知识大总结
  18. 【网络组网】:H3C的vSYS参考
  19. What is the difference between a theorem, a lemma, and a corollary?
  20. 贴吧顶贴php脚步,【技术贴安卓按键精灵】贴吧顶贴脚本源码分享

热门文章

  1. Android开发模式万佛朝中MVX(MVC、MVP、MVVM)
  2. JS实现HTM搜索关键词高亮显示
  3. phpnow测试PHP源码,phpnow php探针环境检测代码
  4. DNS的工作过程详解
  5. silverlight 无法启动调试 数据无效
  6. 数据资产目录建设之数据分类全解(上)
  7. 测序中,什么是“测通”
  8. 2022河南萌新联赛第(二)场:河南理工大学 补题题解(A、B、C、F、J、L)
  9. 崔希凡JavaWeb笔记day28(JavaWeb完毕)(期末,暂停更新)(2016年11月16日12:24:03)
  10. 2016年总结和2017年计划