IC总线读写程序-51

发布者:小九分析仪最新更新时间:2015-10-08 来源: eefocus关键字:IC总线  读写程序 手机看文章 扫描二维码
随时随地手机看文章
//-----------------------函数声明,变量定义--------------------------------------------------------

#include
#include
sbit SDA=P1^0;                          // 将p1.0口模拟数据口
sbit SCL=P1^1;                          // 将p1.1口模拟时钟口
#define  NUM  10                      // 接收和发送缓存区的深度
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};                 
unsigned char idata sendbuf[NUM];       // 数据发送缓冲区
unsigned char idata receivebuf[NUM];    // 数据接收缓冲区
bit   bdata SystemError;                // 从机错误标志位
//--------------------------------------------------------------------------------------------------
// 函数名称: iic_start()
// 函数功能: 启动I2C总线子程序
//--------------------------------------------------------------------------------------------------
void iic_start(void)
{  EA=0;            //时钟保持高,数据线从高到低一次跳变,I2C通信开始
 SDA = 1;        
 SCL = 1;
 delayNOP();      // 延时5us
 SDA = 0;
 delayNOP();
 SCL = 0;
}
//--------------------------------------------------------------------------------------------------
// 函数名称: iic_stop()
// 函数功能: 停止I2C总线数据传送子程序
//--------------------------------------------------------------------------------------------------
void iic_stop(void)
{
 SDA = 0;       //时钟保持高,数据线从低到高一次跳变,I2C通信停止
 SCL = 1;
 delayNOP();
 SDA = 1;
 delayNOP();
 SCL = 0;
}
//--------------------------------------------------------------------------------------------------
// 函数名称: slave_ACK
// 函数功能: 从机发送应答位子程序
//--------------------------------------------------------------------------------------------------
void slave_ACK(void)
{
 SDA = 0;   
 SCL = 1;
 delayNOP();   
 SDA = 1;
 SCL = 0;
}
//--------------------------------------------------------------------------------------------------
// 函数名称: slave_NOACK
// 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束
//--------------------------------------------------------------------------------------------------
void slave_NOACK(void)
{
 SDA = 1;  
 SCL = 1;
 delayNOP();
 SDA = 0;
 SCL = 0;
}
//--------------------------------------------------------------------------------------------------
// 函数名称: check_ACK
// 函数功能: 主机应答位检查子程序,迫使数据传输过程结束
//--------------------------------------------------------------------------------------------------
void check_ACK(void)
{
 SDA = 1;      // 将p1.0设置成输入,必须先向端口写1
 SCL = 1;
 F0 = 0;
 if(SDA == 1)    // 若SDA=1表明非应答,置位非应答标志F0
  F0 = 1;
 SCL = 0;
}

//--------------------------------------------------------------------------------------------------
// 函数名称: IICSendByte
// 入口参数: ch
// 函数功能: 发送一个字节
//--------------------------------------------------------------------------------------------------
void IICSendByte(unsigned char ch)
{
 unsigned char idata n=8;     // 向SDA上发送一位数据字节,共八位
 while(n--)
 {
  if((ch&0x80) == 0x80)    // 若要发送的数据最高位为1则发送位1
  {
   SDA = 1;    // 传送位1
   SCL = 1;
   delayNOP();
   SDA = 0;
   SCL = 0;   
  }
  else
  
   SDA = 0;    // 否则传送位0
   SCL = 1;
   delayNOP();
   SCL = 0; 
  }
  ch = ch<<1;    // 数据左移一位
 }
}
//--------------------------------------------------------------------------------------------------
// 函数名称: IICreceiveByte
// 返回接收的数据
// 函数功能: 接收一字节子程序
//--------------------------------------------------------------------------------------------------
unsigned char IICreceiveByte(void)
{
 unsigned char idata n=8;    // 从SDA线上读取一上数据字节,共八位
 unsigned char tdata;
 while(n--)
 {
  SDA = 1;
  SCL = 1;
  tdata = tdata<<1;    // 左移一位,或_crol_(temp,1)
  if(SDA == 1)
   tdata = tdata|0x01;    // 若接收到的位为1,则数据的最后一位置1
  else
   tdata = tdata&0xfe;    // 否则数据的最后一位置0
  SCL=0;
 }
 return(tdata);
}
//--------------------------------------------------------------------------------------------------
// 函数名称: writeNbyte
// 入口参数: slave_add从机地址,n要发送的数据个数
// 函数功能: 发送n位数据子程序
//--------------------------------------------------------------------------------------------------
void writeNbyte(unsigned char slave_add, unsigned char n)
        
 unsigned char idata send_da,i=0;
 iic_start();                // 启动I2C
 IICSendByte(slave_add);     // 发送地址位
 check_ACK();                // 检查应答位
    if(F0 == 1)
 {
  SystemError = 1;
  return;    // 若非应答表明器件错误或已坏,置错误标志位SystemError
 }
 while(n--)
 {
 send_da = sendbuf[i++]; 
 IICSendByte(send_da);
  check_ACK();    // 检查应答位
  if (F0 == 1)
  {
   SystemError=1;
   return;    // 若非应答表明器件错误或已坏,置错误标志位SystemError
  }
 }
 iic_stop();         // 全部发完则停止
}
//--------------------------------------------------------------------------------------------------
// 函数名称: receiveNbyte
// 入口参数: slave_add从机地址,n要接收的数据个数
// 函数功能: 接收n位数据子程序
//--------------------------------------------------------------------------------------------------
void receiveNbyte(unsigned char idata slave_add, unsigned char n)
{
 unsigned char idata receive_da,i=0;
 iic_start();
 IICSendByte(slave_add);
 check_ACK();
 if(F0 == 1)
 {
  SystemError = 1;
  return;
 }
 while(n--)
 {
  receive_da=IICreceiveByte();
  receivebuf[i++]=receive_da;
  slave_ACK();    // 收到一个字节后发送一个应答位
 }
 slave_NOACK();    // 收到最后一个字节后发送一个非应答位
 iic_stop();
}

关键字:IC总线  读写程序 引用地址:IC总线读写程序-51

上一篇:MCS51单片机的外部中断触发方式
下一篇:SPI总线读写程序-51

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

51单片机汇编中断程序
首先,介绍一下51单片机的定时计数器,51有两个定时计数器,分别为T0,T1,基本一样,;有一点不同,下面我们介绍定时计数器T0 ;了解8051的timer0中断的程序写法,用中断法产生定时 ;上面显示的是proteus仿真图,下面的是源程序 ;说明:(源程序中的中断入口地址很重要(这个是固定的),程序中断时,会在对应中断固定的 ;入口地址进入,因为规定的相隔入口间的空进有限,只能用跳转指令跳转,最终用RETI强制返回 ;这个程序把所有的中断入口地址都写上了,没有用到的,用RETI直接屏蔽) ;运行结果是使led灯明一下,暗一下。 COUNT EQU 9217;对于11.0592的晶振来说,延时10ms LED EQ
[单片机]
单片机AT89C51--7.按键(独立按键,矩阵按键)
1.键盘类型 1.1 编码键盘 通过硬件电路产生被按按键的键值码,程序简单但是硬件电路复杂 如计算机键盘 1.2 非编码键盘 软件编程来识别的称为非编码键盘,非编码键盘硬件电路简单,单片机中最常是非编码键盘 2.独立键盘和矩阵键盘 非编码键盘分为独立键盘和矩阵键盘 2.1 独立键盘 一开始线寄存器默认都是高电平,G为0V,G,S不导通。管脚为5V 这就是上拉电阻。 按下按键,管脚和地导通,电压变为0V 未按下按键,管脚和Vcc连接,电压为5V 2.2 矩阵键盘 3. 按键特性 4. 编程 4.1 独立键盘 按下S2按钮,数字加1,按下S3数字减1,最高不超过9,最低不低于0.高于9变为0.小
[单片机]
单片机AT89C<font color='red'>51</font>--7.按键(独立按键,矩阵按键)
基于MCS-51单片机的环境噪声测量仪
环境噪声监测,是人类提高生活质量,加强环境保护的一个重要环节,在各大城市的繁华街区和居民区,已有大型环境噪声显示器竖立街头。但目前国内的便携式噪声测试仪,多为价格昂贵的进口专用设备,除卫生、计量等环保专业部门拥有外,无法作为民用品推广普及。本文介绍一种以89C51单片机为核心,采用V/F转换技术构成的低成本、便携式数字显示环境噪声测量仪。该仪器工作稳定、性能良好,经校验定标后能满足一般民用需要,可广泛应用于工矿企业、机关学校等需要对环境噪声进行测量和控制的场合。 1 声压级的测量机理 人耳的听阈一般是20m Pa (微帕),痛阈一般是200Pa(帕),其间相差107倍,这样宽广的声压范围很不易测量,而且人耳对声压的相对变化的分
[单片机]
基于ARM和W5100的嵌入式以太网通信接口设计
 随着以太网技术在工业远程监控和数据采集领域的飞速发展,基于以太网的应用接口设备也迅速普及到医疗设备、工厂电力系统等应用。然而,嵌入式以太网接口设计的核心器件是网络控制芯片,其性能优劣直接影响网络通信的效率。  本文结合ARM技术,采用32 bit STM32F105V微处理器和高性能的以太网控制芯片W5100实现高性能、高可靠性的嵌入式以太网通信接口设计,其系统各功能模块容易扩展和升级。 1 总体设计  在嵌入式系统设计高速发展的过程中,与传统的基于现场总线方式相比,结合嵌入式系统和以太网技术来实现数据采集和控制功能越来越受到广大嵌入式设计者的青睐,而通信接口设计实质是能够实现TCP/IP网络通信协议。使用本接口模块的核心控制器
[工业控制]
基于ARM和W<font color='red'>51</font>00的嵌入式以太网通信接口设计
MAX325 采用微小的模拟开关解决IC总线的地址矛盾
I2C1总线能够控制两个内部地址相同的智能外围器件,这两个外围器件可以是相同的器件,也可以是不同的器件,只是碰巧它们具有相同的内部地址。然而众所周知,I2C 总线上的每一个外围器件必须具有唯一的地址,否则将导致混乱。
[模拟电子]
[51单片机学习笔记THREE]----继电器
继电器是一种电控制器件,它是当输入量(如电压,电流,温度等)达到规定值时,使得被控量发生阶跃性变化的一种电器。 比如说:我们只需要用一个12V,0.1A的参数量去控制一个继电器,然后让继电器去充当几百万伏特,几百万安培的设备的开关。 无论在什么地方,如果想让控制者处于安全的环境中,就可以用继电器。让我们去接触安全的一边,让继电器去接触危险的一边,我们只要控制继电器的动作,继电器就会帮助我们连接我们不想亲自去碰的一些线路。 继电器的分类千千万,这里就不多说了。 最近因为好像没什么地方要用到,这里先给出最基本的通过按键来控制继电器开关的程序源码,以后若有其他用处,到时候再说。 1 /**************
[单片机]
51手记之标准51(三)
51手记之标准51---中断系统 MCS51提供5个中断源,每个中断源有2个中断优先级,可实现两级中断服务程序嵌套;优先级相同的中断服务程序不会发生嵌套。 1.中断源 包括两个外部中断、两个定时器溢出中断和一个串行口中断。 1)外部中断源: MCS51有两条外部中断请求输入线,允许外部中断源以低电平或负边沿两种中断触发方式来输入中断请求信号 中断请求标志位IE0、IE1, 控制寄存器:TCON 2)定时器溢出中断源: 属于内部中断,8031内部有两个16位的定时器/计数器,受内部定时脉冲(主脉冲经12分频后)或T0/T1引脚上输入的外部定时脉冲控制。定时器T0/T
[单片机]
<font color='red'>51</font>手记之标准<font color='red'>51</font>(三)
8051、ARM和DSP指令周期的测试与分析
在实时控制系统中,选择微控制器的指标时最重要的是计算速度的问题。指令周期是反映计算速度的一个重要指标,为此本文对三种最具代表性的微控制器(AT89S51单片机、ARM7TDMI核的LPC2114型单片机和TMS320F2812)的指令周期进行了分析和测试。为了能观察到指令周期,将三种控制器的GPIO口设置为数字输出口,并采用循环不断地置位和清零,通过观察GPIO口的波形变化得到整个循环的周期。为了将整个循环的周期与具体的每一条指令的指令周期对应起来,通过C语言源程序得到汇编语言指令来计算每一条汇编语言的指令周期。 1 AT89S51工作机制及指令周期的测试   AT89S51单片机的时钟采用内部方式,时钟发生器对振荡脉冲进
[测试测量]
80<font color='red'>51</font>、ARM和DSP指令周期的测试与分析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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