51单片机I2C总线驱动程序

发布者:CreativeDreamer最新更新时间:2016-09-22 来源: eefocus关键字:51单片机  I2C总线  驱动程序 手机看文章 扫描二维码
随时随地手机看文章
SI2I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。

I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。

一.I2C系统结构

这里写图片描述

每个接到I2C总线上的器件都有唯一的地址。主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。由总线上接收数据的器件则为接收器。

二.数据位的有效性规定

这里写图片描述

I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。

三.字节传送与应答

这里写图片描述

每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。

四.驱动程序

#define uchar unsigned char
#define uint unsigned int
#define somenop() _nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_()
sbit SCL=P2^1;
sbit SDA=P2^0;
  • 1
  • 2
  • 3
  • 4
  • 5

1.起始信号和终止信号

这里写图片描述

SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号; 
SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。

起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态

void I2C_Start()     //起始
{
   SCL=1;
   somenop();
   SDA=1;
   somenop();
   SDA=0;
   somenop();
   SCL=0;
   somenop();
}

void I2C_Stop()      //终止
{  
   SDA=0;
   somenop();
   SCL=1;
   somenop();
   SDA=1;
   somenop();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

2.发送数据

void I2C_SendByte(uchar dat, uchar ack)   //发送一个字节
{
   uchar i,j,b=0;
   for(i=0;i<8;i++)
   {    
       SCL=0;  
       somenop();   
       SDA=(bit)(dat&0x80);     //每次取最高位进行发送
       dat<<=1;        //从最高位开始发送,左移使每一位逐渐成为最高位
       SCL=1;          //上升沿时发送数据
       somenop();      
   }
   SCL=0;
   somenop(); 
   SDA=1;     
   somenop();
   SCL=1;
   _nop_();
   while((SDA==1)&&(j<250))  j++;  //等待应答,也就是等待从设备把SDA拉低
   SCL=0;
   _nop_();   
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

3.读取数据

uchar I2C_ReadByte()     //读一个字节
{
   uchar i,dat=0;
   SCL=0;         //此处也可以不置低,因为起始和发送一个字节之后SCL都是0
   somenop();
   SDA=1;      //拉高准备数据读取
   _nop_();
   for(i=0;i<8;i++)   //读取8位数据
   {
      SCL=1;
      somenop();
      dat<<=1;
      if(SDA==1)
         dat=dat|0x01;
      somenop();
      SCL=0;     //下降沿时读取数据
      somenop();
    }
    return dat;
}
关键字:51单片机  I2C总线  驱动程序 引用地址:51单片机I2C总线驱动程序

上一篇:LCD1602程序显示字符串
下一篇:24C02的存储与读取

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

51单片机教程(八):图型带字库液晶128×64
简介:上期我向大家介绍了字符型液晶1602的基本功能,并用51单片机的驱动显示,你可以用它表达你的幸运日期或者你喜欢的数字。虽然说1602液晶使用方便,但如果你想用它表达更多的语言,就难以满足要求了。 一、原理简介 我手里的这款128×64液晶内部是以ST7920芯片作为控制器,是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16×16点汉字,和128个16×8点ASCII字符集。可以显示8×4行16×16点阵的汉字。因此利用该液晶模块可以灵活的构成全中文人机交互图形界面,也可完成图形显示。低电压低功耗也是其一显着特点。
[单片机]
<font color='red'>51单片机</font>教程(八):图型带字库液晶128×64
基于80C51单片机的智能小车设计
O 引言 在现有玩具电动车的基础上,加装光电检测器,实现对电动小汽车的速度、位置、运行状况的实时测量,并将测量数据传送至单片机进行处理,然后由单片机根据所检测的各种数据实现对电动车的智能控制。 1 直流调速系统采用PWM调速 直流调速系统采用晶闸管的直流斩波器与整流电路。晶闸管不受相位控制,而是工作在开关状态。当晶闸管被触发导通时,电源电压加到电动机上,当晶闸管关断时,直流电源与电动机断开,电动机经二极管续流,两端电压接近于零。脉冲宽度调制(Pulse Width Modulat-ion),简称PWM。脉冲周期不变。只改变晶闸管的导通时间,即通过改变脉冲宽度来进行直流调速。 脉宽调速也可通过单片机控制继电器的闭
[单片机]
基于51单片机IP核的FPGA实现与应用
  1 引言   长期以来,单片机以其性价比高、体积小、功能灵活等方面的独特优点被广泛应用。但受其内部资源的限制,单片机需要在片外扩展相关资源。为了达到处理速度和控制灵活性方面的需求,采用微控制器和可编程逻辑器件设计单片机嵌入式系统。随着现场可编程逻辑阵列(FPGA)及EDA技术的发展,百万门级的FPGA、可重构的嵌入式MCU核、功能复杂的IP核及各种功能强大的EDA工具的出现,实现将MCU、存储器和一些外围电路集成到一个芯片成为可能。随着IP核技术在FPCA中的应用,特别是MCU IP核技术的发展。出现了性能不同的嵌入式MCU软核。MCS-51系列MCU是目前应用时间最长、最普及、可获得应用资料最多的功能强大的8位MCU,
[单片机]
基于<font color='red'>51单片机</font>IP核的FPGA实现与应用
c51单片机定时中断的精确定时编程方法大全
引 言   MCS-51单片机的中断响应延迟时间,取决于其它中断服务程序是否在进行,或取决于正在执行的是什么样的指 令。单中断系统中的中断响应时间为3~8个机器周期 。无论是哪一种原因引起的误差,在精确定时的应用场合, 必须考虑它们的影响,以确保精确的定时控制。根据定时中断的不同应用情况,应选择不同的精确定时编程方法。   文中以定时器T1工作在定时方式1为例,晶振频率为12MHz 。 1 方法1   在定时器溢出中断得到响应时,停止定时器计数,读出计数值(反映了中断响应的延迟时间),根据此计数值算 出到下一次中断时,需多长时间,由此来重装载和启动定时器。例如定时周期为1ms,则通常定时器重装载值为- 1000(0FC18H)。下
[单片机]
51单片机系列连载6—定时器初始化补充
在上一节中提到定时器很重要,而对于定时器来说,就是简单的一个初始化,只要把这个弄明白了,后面的编程操作也就水到渠成了,今天再简单地对定时器初始化做个补充。 首先,再说一下T/C(定时器/计数器)的基本结构,它们基本部件是2个8位的计数器,其中TH1和TL1是T1的计数器,TH0和TL0是T0的计数器,记住这两个计数器,后面的操作都是围绕这两个展开的,要有这种意识。 在作为定时器使用时,是对单片机内部机器周期的计数,因其内部频率为晶振频率的1/12,如果晶振频率为12MHz,则定时器每接受一个输入脉冲的时间为1us,后面很多定时都用到这个基本常识。 当它用作对外部事件计数时,接相应的外部引脚T0(P3.4)或T1(P
[单片机]
51单片机STC89C52 DA数模转换
CSDA BIT P3.2 WRR BIT P3.6 WELA BIT P2.7 DULA BIT P2.6 ORG 0000H LOOP0: MOV P0,#0FFH ;关数码管显示 SETB WELA CLR WELA CLR DULA SETB CSDA SETB WR MOV A,#0 LOOP1: MOV P0,A CLR CSDA CLR WRR LCALL DELAY SETB WRR SETB CSDA INC A SJMP LOOP1 DELAY: ;延时 SETB RS1 MOV R2,#04H DELAY2: MOV R1,#10 DELAY1:
[单片机]
51单片机的延时计算
前言 我使用51,STC这一类的单片机做控制好几年,一直是使用现成的程序,在其上修修改改,以达到需求动作目的即可。从来都是不求甚解。想法既是如此,会用即可,了解那么多做什么。 此次又在做一项目,里面用到I2C通讯。本来是直接复制粘贴了事,却没想对里面的一个小小的延时函数起了兴趣,由于本人是基础功底只有5战斗力的渣渣,写写画画了一天才搞了个大体明白。 以前总是在看其他博主的文章,默默潜水。然而此次,突然就忍不住想写篇文章发表一下费尽心思的微不足道的心得体会。 正文 void Delay10us() //@12.000MHz { unsigned char i; _nop_(); _nop_(); i = 27
[单片机]
<font color='red'>51单片机</font>的延时计算
51单片机+ds1302+ds18b20+1602液晶万年历
这是我写的单片机小程序,将单片机开发板上的ds1302,ds18b20和1602综合起来,在1602上显示年月日周时分秒和温度;望各位好友指点,此程序仅适用于我的开发板,用在其他开发板上应该改下端口就可以。 #include reg52.h typedef unsigned char uint8; typedef unsigned int uint16; typedef long int uint32; //**************************************************************************************************** sbit DQ
[单片机]
<font color='red'>51单片机</font>+ds1302+ds18b20+1602液晶万年历
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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