MCS-51单片机模拟I2C经典软件包

上传人:飞*** 文档编号:47747153 上传时间:2018-07-04 格式:PDF 页数:8 大小:12.76KB
返回 下载 相关 举报
MCS-51单片机模拟I2C经典软件包_第1页
第1页 / 共8页
MCS-51单片机模拟I2C经典软件包_第2页
第2页 / 共8页
MCS-51单片机模拟I2C经典软件包_第3页
第3页 / 共8页
MCS-51单片机模拟I2C经典软件包_第4页
第4页 / 共8页
MCS-51单片机模拟I2C经典软件包_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《MCS-51单片机模拟I2C经典软件包》由会员分享,可在线阅读,更多相关《MCS-51单片机模拟I2C经典软件包(8页珍藏版)》请在金锄头文库上搜索。

1、MCS-51单片机模拟I2C软件包2010-09-16 09:15:35 来源:评论: 0 点击:注意:普通M51 单片机机器周期=12 个时钟周期, f020 机器周期 =时钟周期对于 nop 指令, F020 是一个时钟周期,例如f020 晶振为 22.1184M, 约为 45ns /* 函数是采用软件延时的方法产生SCL脉冲 ,固对高晶振频率要作一定的修改.( 本软件包是1us 机器周期 ,即晶振频率要小于12MHZ)总线时序符合I2C标准模式 ,100Kbit/S。*/ #include #include #define uchar unsigned char /* 宏定义 */ #d

2、efine uint unsigned int #define _Nop() _nop_() /* 定义空指令 1us*/ sbit SDA=P34; /* 模拟 I2C数据传送位 */ sbit SCL=P35; /* 模拟 I2C 时钟控制位 */ bit ack; /* 应答标志位 */ /* 起动总线函数函数原型 : void Start_I2c(); 功能 : 启动 I2C 总线 ,即发送 I2C起始条件 . */ void Start_I2c() SDA=1; /* 发送起始条件的数据信号*/ _Nop(); SCL=1; _Nop(); /* 起始条件建立时间大于4.7us,延时

3、 */ _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; /* 发送起始信号 */ _Nop(); /* 起始条件锁定时间大于4 s*/_Nop(); _Nop(); _Nop(); _Nop(); SCL=0; /* 钳住 I2C 总线,准备发送或接收数据*/ _Nop(); _Nop(); /* 结束总线函数函数原型 : void Stop_I2c(); 功能 : 结束 I2C 总线 ,即发送 I2C结束条件 . */ void Stop_I2c() SDA=0; /* 发送结束条件的数据信号*/ _Nop(); /* 发送结束条件的时钟信号*/ SCL=1;

4、/* 结束条件建立时间大于4 s*/_Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; /* 发送 I2C 总线结束信号*/ _Nop(); _Nop(); _Nop(); _Nop(); /* 字节数据发送函数 函数原型 : void SendByte(uchar c); 功能 : 将数据 c 发送出去 ,可以是地址 ,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答或非应答都使ack=0) 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。*/ void SendByte(uchar c) ucharBitCnt; for(

5、BitCnt=0;BitCnt8;BitCnt+) /* 要传送的数据长度为8 位*/ if(cBitCnt) /* 判断发送位 */ else SDA=0; _Nop(); SCL=1; /* 置时钟线为高,通知被控器开始接收数据位*/ _Nop(); _Nop(); /* 保证时钟高电平周期大于4 s*/_Nop(); _Nop(); _Nop(); SCL=0; _Nop(); _Nop(); SDA=1; /*8 位发送完后释放数据线,准备接收应答位*/ _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA=1)ack=0; els

6、e ack=1; /* 判断是否接收到应答信号*/ SCL=0; _Nop(); _Nop(); /* 字节数据接收函数函数原型 : uchar RcvByte(); 功能 : 用来接收从器件传来的数据,并判断总线错误(不发应答信号 ),发完后请用应答函数应答从机。*/ uchar RcvByte() ucharretc; ucharBitCnt; retc=0; SDA=1; /* 置数据线为输入方式*/ for(BitCnt=0;BitCnt8;BitCnt+) _Nop(); SCL=0; /* 置时钟线为低,准备接收数据位*/ _Nop(); _Nop(); /* 时钟低电平周期大于4

7、.7 s*/_Nop(); _Nop(); _Nop(); SCL=1; /* 置时钟线为高使数据线上数据有效*/ _Nop(); _Nop(); retc=retc1; if(SDA=1)retc=retc+1; /* 读数据位 ,接收的数据位放入retc 中 */ _Nop(); _Nop(); SCL=0; _Nop(); _Nop(); return(retc); /* 应答子函数函数原型 : void Ack_I2c(bit a); 功能 : 主控器进行应答信号(可以是应答或非应答信号,由位参数a 决定 ) */ void Ack_I2c(bit a) if(a=0)SDA=0; /

8、* 在此发出应答或非应答信号*/ else SDA=1; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); /* 时钟低电平周期大于4 s*/_Nop(); _Nop(); _Nop(); SCL=0; /* 清时钟线,钳住I2C 总线以便继续接收*/ _Nop(); _Nop(); /* 用户接口函数*/ /* 向无子地址器件发送字节数据函数函数原型 : bit ISendByte(ucharsla,ucahr c); 功能 : 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla. 如果返回1 表示操作成功,否则操作有误。注意:使用前必

9、须已结束总线。*/ bit ISendByte(ucharsla,uchar c) Start_I2c(); /* 启动总线 */ SendByte(sla); /* 发送器件地址 */ if(ack=0)return(0); SendByte(c); /* 发送数据 */ if(ack=0)return(0); Stop_I2c(); /* 结束总线 */ return(1); /* 向有子地址器件发送多字节数据函数函数原型 : bit ISendStr(ucharsla,ucharsuba,ucahr *s,uchar no); 功能 : 从启动总线到发送地址,子地址,数据,结束总线的全过

10、程,从器件地址 sla,子地址suba,发送内容是s 指向的内容,发送no 个字节。如果返回1 表示操作成功,否则操作有误。注意:使用前必须已结束总线。*/ bit ISendStr(ucharsla,ucharsuba,uchar *s,uchar no) uchar i; Start_I2c(); /* 启动总线 */ SendByte(sla); /* 发送器件地址 */ if(ack=0)return(0); SendByte(suba); /* 发送器件子地址*/ if(ack=0)return(0); for(i=0;ino;i+) SendByte(*s); /* 发送数据 */ if(ack=0)return(0); s+; Stop_I2c(); /* 结束总线 */ return(1); /* 向无子地址器件发送多字节数据函数函数原型 : bit ISendStr(ucharsla,ucahr *s,uchar no); 功能 : 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件地址 sla,发送内容是s 指向的内容,发送no 个字节。如果返回1 表示操作成功,否则操作有误。注意:使用前必须已结束总线。*

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号