C51单片机模拟I2C总线驱动程序设计(1)

发布者:cannon928最新更新时间:2015-10-08 来源: eefocus关键字:C51单片机  模拟I2C  总线驱动 手机看文章 扫描二维码
随时随地手机看文章
/********************************** I2C 总线驱动 ****************************** 
模块名:I2C 总线驱动 型号:I2C 
功能描述: 
此模块包括发送数据及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,能
很方便的与用户程序进行连接并扩展。需要注意的是,函数是采用延时方法产生 SCL 脉冲,
对高晶振频率要做一定的修改!!在写 E2PROM 的时候一定要延时!!! 
说明: 
1us机器周期,晶振频率要小于12MHz 
返回1:则操作成功,返回0:则操作失败。 
sla为器件从地址,suba为器件子地址。 
******************************************************************************* 
#i nclude "AT89X52.h" 
#i nclude  
 
#define SomeNOP(); {_nop_();_nop_();_nop_();_nop_();_nop_();} //定义空指令
 
sbit SDA = P1^3; //模拟 I2C 数据传输位 
sbit SCL = P1^2; //模拟 I2C 时钟控制位 
 
bit bdata I2C_Ack; //应答标志位 
 
/************************************ I2C_Start ******************************* 
函数名:void I2C_Start() 
入口: 
出口: 
功能描述:启动 I2C 总线,即发送 I2C 初始条件 
解释: 在 I2C 总线协议中规定的起始位格式是:在 SCL 高电平期间,SDA 发生从高到低的电平
跳变.它与其它数据格式的区别在于,协议中规定有效的数据必须在 SCL 的高电平期间保持
不变,只有在 SCL 的低电平期间才能发生跳变.所以这一有别与其它格式的数据才能做为起
始位. 
调用函数: 
全局变量: 
******************************************************************************* 
void I2C_Start() 
     SDA = 1; //发送起始条件的数据信号 
     _Nop(); 
     SCL = 1; 
     SomeNOP();  //起始条件建立时间大于 4.7us,延时 
     SDA = 0; //发送起始信号 
     SomeNOP(); //起始条件建立时间大于 4us,延时 
     SCL = 0; //钳住 I2C 总线准备发送或接收数据 
     //解释:I2C 总线在空闲状态下都是被上拉为高电平的,所以当它们处于低电平时就表示忙的状态.
     _nop_(); 
     _nop_(); 
 
/************************************ I2C_Stop ******************************** 
函数名:void I2C_Stop() 
入口: 
出口: 
功能描述:结束 I2C 总线,即发送 I2C 结束条件 
解释:同起始条件的格式类似,结束条件的格式是在 SCL 高电平期间,SDA 由低电平向高电平
跳变. 
调用函数: 
全局变量: 
******************************************************************************* 
void I2C_Stop() 
     SDA = 0; //发送结束条件的数据信号 
     _Nop(); 
     SCL = 1; //发送结束条件的时钟信号 
     SomeNOP();//结束条件建立时间大于 4us,延时 
     SDA = 1; //发送 I2C 总线结束信号 
     SomeNOP(); 
 
/************************************ I2C_CheckAck **************************** 
函数名:bit I2C_CheckAck(void) 
入口: 
出口:0(无应答),1(有应答) 
功能描述: 
检验 I2C 总线应答信号,有应答则返回 1,否则返回 0,超时值取 255. 
解释:I2C 总线协议中规定传输的每个字节之后必须跟一个应答位,所以从器件在接收到每
个字节之后必须反馈一个应答信号给主控制器,而主控制器就需要检测从器件回传的应答信
号,根据其信息做出相应的处理.另外,主从之别是相对的,接收数据的即为从,发送数据的及
为主.
 
再看看应答信号的格式:在由发送器产生的时钟响应周期里,发送器先释放 SDA(置高),然后
由接受器将 SDA 拉低,并在这个时钟脉冲周期的高电平期间保持稳定的低电平.即表示从器
件做出了应答.
调用函数:void I2C_Stop() 
全局变量: 
******************************************************************************* 
bit I2C_CheckAck(void) 
     uchar errtime = 255;  // 因故障接收方无 Ack,超时值为 255 
     SDA = 1;  //发送器先释放 SDA 
     SomeNOP(); 
     SCL = 1; 
     SomeNOP();  //时钟电平周期大于 4 us 
     while(SDA)  //判断 SDA 是否被拉低
    { 
          errtime--; 
          if(errtime==0) 
         
               I2C_Stop(); 
               return(0); 
          } 
     
     SCL = 0; 
     _nop_(); 
     return(1); 
 
/************************************ I2C_SendB ******************************* 
函数名:void I2C_SendB(uchar c) 
入口:uchar 型数据 
出口: 
功能描述: 
字节数据传送函数,将数据 c 发送出去,可以是地址,也可以是数据,发完后等待应答,
并对 
此状态位进行操作 
注意:在传送数据时,数据(SDA)的改变只能发生在SCL的低电平期间,在SCL的高电平期间保
持不变
调用函数:bit I2C_CheckAck() 
全局变量:I2C_Ack 
******************************************************************************* 
void I2C_SendB(uchar c) 
     uchar BitCnt; 
     for (BitCnt=0; BitCnt<8; BitCnt++) //要传送的数据长度为 8 位 
     
          if((c<
          { 
               SDA = 1; 
          } 
          else 
          { 
               SDA = 0; 
           
          _nop_(); 
          _nop_(); 
          SCL = 1; //置时钟线为高通知被控器开始接收数据位 
          SomeNOP(); //保证时钟高电平周期大于 4us 
          SCL = 0; 
     
     _nop_(); 
     _nop_(); 
     I2C_Ack = I2C_CheckAck(); //检验应答信号,作为发送方,所以要检测接收器反馈的应答信号. 
     _nop_(); 
     _nop_(); 


 

关键字:C51单片机  模拟I2C  总线驱动 引用地址:C51单片机模拟I2C总线驱动程序设计(1)

上一篇:I-wire总线(单总线)读写51程序
下一篇:C51单片机模拟I2C总线驱动程序设计(2)

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

基于MAX195转换器和AT89C51单片机实现应用接口的设计
MAX195是16位逐次逼近方式的ADC。它将高精度、高速度、低电源功耗(消耗电流仅10μA)的关闭方式等性能结合在一起。内部校准电路对线性度与偏置误差进行校正,所以无需外部调整便可达到全部额定的性能指标。电容性的DAC结构使之具有特有的85kbps跟踪/保持功能,变换时间仅需9.4μs。三态串行数据输出及引脚可选的单极性(0~VREF)或双极性(-VREF~+VREF)的输入范围使之可广泛应用于便携式仪表、医用信号采集及多传感器测量等系统中。 1 MAX195引脚及说明 MAX195有16个引脚,其排列如图1所示。 2 MAX195转换原理及时序 MAX195片内含有电容性的数字模拟变换器(DAC),可对模拟输入进行特有
[单片机]
基于MAX195转换器和AT89<font color='red'>C51单片机</font>实现应用接口的设计
基于AT89C51单片机的微型可编程控制器
可编程控制器PC(Programmable Controller),为与个人计算机PC(Personal Computer)相区别,可简称为PLC。它是按照成熟而有效的继电控制概念和设计思想,用先进的单片机技术来实现I/O的实时检测和控制,可靠性高,编程简单、易学,因此,得到广泛应用。 将PLC技术引进电工学、电力拖动课程,是课程建设现代化的重要措施。在教学经费相对紧张的情况下,我们自己动手,以AT89C51单片机为核心,设计并研制了LD型微型PLC,应用于继电控制实验,取得了良好的效果。 用单片机构成的PLC,实际上就是一个单片机测控系统。用这样一个程序控制的计算机系统去执行继电控制的梯形图程序,由于继电控制梯形图
[单片机]
基于AT89<font color='red'>C51单片机</font>的微型可编程控制器
CAN总线在嵌入式Linux下驱动程序的实现
1 引言 基于嵌入式系统设计的工业控制装置,在工业控制现场受到各种干扰,如电磁、粉尘、天气等对系统的正常运行造成很大的影响。在工业控制现场各个设备之间要经常交换、传输数据,需要一种抗干扰性强、稳定、传输速率快的现场总线进行通信。文章采用CAN总线,基于嵌入式系统 32位的S3C44B0X微处理器,通过其SPI接口,MCP2510 CAN控制器扩展CAN总线;将嵌入式操作系统嵌入到S3C44B0X微处理器中,能实现多任务、友好图形用户界面;针对S3C44B0X微处理器没有内存管理单元MMU,采用uClinux嵌入式操作系统。这样在嵌入式系统中扩展CAN设备关键技术就是CAN设备在嵌入式操作系统下驱动程序的实现。文章重点解决了CAN
[单片机]
CAN<font color='red'>总线</font>在嵌入式Linux下<font color='red'>驱动</font>程序的实现
单片机模拟I2C总线通信的几个关键程序
I2C总线由数据线SDA和时钟线SCL两条线构成通信线路,既可以发送数据,也可以接收数据。以下为单片机模拟I2C总线通信的几个关键程序: 1、总线初始化 void main() { SCl=1; delay(); SDA=1; delay(); } //将总线都拉高以释放总线 2、启动信号 void start() { SDA=1; delay(); SCL=1; delay(); SDA=0; delay(); } //SCL在高电平期间,SDA一个下降沿启动信号 3、应答信号 void respons() { uchar i=0; SCL=1; dela
[单片机]
基于IEEEl394b总线双向数据传输设备驱动程序设计
  介绍了基于IEEEl394b总线双向数据传输系统PC机端设备驱动程序。结合IEEEl394b总线规范,以Windows环境为例详细介绍了利用Fir-eAPI SDK开发IEEE1394b设备驱动程序的设计原理、实现方法。   现有的大部分数据传输接口总线造价比较高,且难以满足实际运用中对传输速率的要求,成了阻碍整个系统性能提高的一大屏障。IEEE-1394是现今最高速的串行总线接口之一,IEEE1394lb更是在原有IEEE1394的基础上速度更快,支持距离更长,在实时批量数据传输方面有广泛的应用前景。   基于1394传输系统设备驱动文献,大部分都是基于IEEE1394a的,而IEEE1394b以其更高的速度展现出了更大的
[嵌入式]
基于AT89C51单片机控制LED摇摇棒的研究
0 引言 随着现代科技的发展,高科技产品以其简洁化、便携等,给人们带来了很大的方便。而“摇摇棒”以其更加简捷与新颖的信息传递方式给人们带来耳目一新的感受,也必将会给人们带来一种新的方便的文化传递方式,常用在晚会及大型的娱乐节目场合。 本文通过研究和设计一个利用事先编好程序来控制16个LED发光二极管,并配合左右手的摇晃来显示字符和简易图形的电子装置(简称为“摇摇棒”),来传递有趣的信息。此装置利用AT89C51单片机对发光二极管阵列进行控制。用滚珠开关检测当前摇动状态,单片机控制16个发光二极管进行不同频率的亮灭刷新,则只要摇动就可以可显示输出文字及图案等信息,从而达到在该视觉平面上传达信息的作用。 1 硬件系统的组成
[单片机]
基于AT89<font color='red'>C51单片机</font>控制LED摇摇棒的研究
SynqNet运动控制总线和直接驱动技术在数控系统中的应用
   直接驱动 技术    数控系统 对精度和快速性的要求   现代数控系统(如数控机床和数控加工中心等等)向着高速、高精度方向发展,如为了缩短辅助操作时间、提高生产率,伺服轴的移动速度要求超过120 m/min;正在研制的超高精度镜面铣削加工中心,要求位置分辨率为1纳米;数控磨齿机的分度精度要求小于0.1角秒;惯导测试设备要求位置分辨率小于0.001角秒等等。这样高的精度,常规的旋转伺服电机+机械执行机构(减速箱或滚珠丝杆付等)的传动技术不可能达到。因为机械执行机构和联轴器的误差、间隙和柔性,使伺服轴产生成带状分布的运动误差和失动,而不是一个恒值,严重影响伺服轴的运动精度和系统快速性。 BM 系列 ■ 定子内径0.4”(
[嵌入式]
基于80C51单片机的智能小车设计
O 引言 在现有玩具电动车的基础上,加装光电检测器,实现对电动小汽车的速度、位置、运行状况的实时测量,并将测量数据传送至单片机进行处理,然后由单片机根据所检测的各种数据实现对电动车的智能控制。 1 直流调速系统采用PWM调速 直流调速系统采用晶闸管的直流斩波器与整流电路。晶闸管不受相位控制,而是工作在开关状态。当晶闸管被触发导通时,电源电压加到电动机上,当晶闸管关断时,直流电源与电动机断开,电动机经二极管续流,两端电压接近于零。脉冲宽度调制(Pulse Width Modulat-ion),简称PWM。脉冲周期不变。只改变晶闸管的导通时间,即通过改变脉冲宽度来进行直流调速。 脉宽调速也可通过单片机控制继电器的闭
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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