设为首页 加入收藏

TOP

51单片机 | 基于I2C总线的秒表模拟应用(一)
2017-10-11 15:06:00 】 浏览:336
Tags:单片机 基于 I2C 总线 秒表 模拟 应用

————————————————————————————————————————————

参考地址:

http://blog.csdn.net/junyeer/article/details/46480863

http://blog.csdn.net/bob_fly1984/article/details/22690381

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

硬件结构:

  • SDA数据线
  • SCL时间线
  • 上拉电阻

    p.s. 当总线空闲状态时,两根线被上拉电阻拉高,保持高电平。连接总线上的任一器件输出的低电平都将使总线的信号变低

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

总线特征:

  • I2C总线上的每一个设备都可以作为主设备或从设备
  • 每个设备会对应一个唯一的地址,主从设备之间通过地址来确定与哪个器件通信

    p.s. 地址分为7位或10位,此处只介绍7

  • 通常情况下,把CPU带有I2C总线接口的模块作为主设备,其他挂在总线上的作为从设备
  • 主从设备之间以字节为单位进行双向数据传输

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

工作方式:

  • 主从工作方式:主器件启动数据的发送,产生时钟信号,发出停止信号

    p.s. 是没有I2C总线硬件接口的单片机采用软件模拟I2C总线常用的工作方式

  • 多主工作方式:需要总线竞争或仲裁

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

通信时序(主从工作方式):

  • 空闲状态:
    • SCL和SDA保持高电平状态
  • 忙状态:

    p.s. SDA线必须在SCL时钟的高电平周期才能保持稳定,SDA数据线的高或低电平状态只能在SCL低电平时才能改变

    • 起始条件 S:
      • SCL为高电平,SDA下降沿1→0时,主器件产生起始信号
      • 起始信号产生后,总线处于忙状态,其他I2C器件无法访问总线
    • 停止条件 P:
      • SCL为高电平,SDA上升沿0→1时,主器件产生停止信号

        p.s. 非应答信号规定:当主机为接收设备,主机对最后一个字节不应答,以向发送设备表示数据传送结束

      • 停止条件产生后,主从设备释放总线,总线再次处于空闲状态

    • 传输过程:
      • 主设备在传输有效数据之前先指定从设备的地址,设备地址为7 位时,再加一个最低位表示数据传输的方向,0 表示主设备→从设备写数据,1 表示主设备读数据。

        7位地址码:其中DA3~DA0(硬件出厂时固有的地址编码)及A2~A0(用户设定)为从机地址

      • 主设备在SCL线上产生每个时钟脉冲的过程中将在SDA线上传输一个bit
      • 当一个字节按数据位从高到低顺序传输完之后,接收设备将SDA拉为低电平,表示数据传输正确,回传给主设备一个应答位。一个字节传输完毕。

        p.s. 并不是所有的字节传输都必须有一个应答位,比如:当从设备不能再接收主设备发送的数据时,从设备回传一个非应答位

        在一次传输中可以传输多个字节,图中只画出首字节

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  • 当主机向从机发送1 字节数据时

    p.s. 实际上主从机的SDA信号是在同一根线上的,分开画有助于理解各自的行为

  • 当主机从从机接收1 字节数据时

————————————————————————————————————————————

AT24C02

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

主要型号:

ATMEL公司生产的AT24C系列EEPROM中具有I2C总线接口。

这类芯片可以解决掉电而造成的数据丢失的问题,可以保存数据100年,擦写100w次以上。

芯片地址固定部分为1010

型号

存储容量

AT24C01

128*8

AT24C02

256*8

AT24C04

512*8

AT24C08

1024*4

AT24C16

2048*8

芯片特性:略

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

引脚描述:

  • A0/A1/A23条地址线,用于确定芯片的硬件地址,在上图系统中均接地,选择000
  • 4脚和第8脚为正负电源
  • 5脚为SDA串行数据输入/输出,与单片机P3.5相连
  • 6脚为SCL串行时钟输入线,与单片机P3.6相连
  • SDASCL都需要与正电源间接一个5.1k欧上拉电阻
  • 7脚写保护功能接地
  • 24C02中带有片内地址寄存器,每写入或读出一个数据字节后,该地址寄存器自动+1,实现对下一个存储单元的读写。为降低总的写入时间,一次操作可以写入多达8个字节的数据。

————————————————————————————————————————————

AT24C02应用实例

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

设计要求:

  • 采用定时中断方式,设计一个0~59s变化的秒表,将每次显示在数码管上的时间存入AT24C02中

   

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

设计思路:

  • 通过定时器50ms触发中断,每次触发中断时中断计数,到达1s时flag标识为1
  • 在死循环中始终显示当前秒数
  • 每次秒数变化时写入flag清零并写入AT24C02中

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

硬件清单及连线情况:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

实现代码:

  1 #include <reg51.h>
  2 typedef unsigned char uchar;
  3 typedef unsigned int uint;
  4 sbit scl = P3 ^ 0;
  5 sbit sda = P3 ^ 1;
  6 uchar second = 0;
  7 uchar count = 0;
  8 bit flag = 0;
  9 uchar code table[] =
 10 {
 11     0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6, 0xE
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇浅谈路由器软硬件架构 下一篇51单片机 | 模拟PWM调制控制实验

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目