9952
- 收藏
- 点赞
- 分享
- 举报
I2C总线万能程序(C语言)
"reg51.h"
#include "intrins.h"
unsigned char SystemError;
sbit SCL= P1^6; //定义串行时钟线所在口 使用时根据自己的需要来定义
sbit SDA= P1^7; //定义串行数据线所在口 使用时根据自己的?枰?炊ㄒ?
#define SomeNOP(); {_nop_();_nop_();_nop_();_nop_();}
/*--------------------------------------------------------------------------------
调用方式:void AD7416_I2CStart(void) 2003/05/04
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
[hide]
void I2CStart(void)
{
EA=0;
SDA=1; SCL=1; SomeNOP();//数据线保持高,时钟线从高到低一次跳变,I2C通信开始
SDA=0; SomeNOP();
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void AD7416_I2CStop(void) 2003/05/04
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStop(void)
{
SCL=0; SDA=0; SomeNOP(); //数据线保持低,时钟线从低到高一次跳变,I2C通信停止
SCL=1; SomeNOP(); SDA=1;
EA=1;
}
/*--------------------------------------------------------------------------------
调用方式:I2CAck(void) 2003/05/13
函数说明:私有函数,I2C专用,等待从器件接收方的应答
ACK BY AD7416
---------------------------------------------------------------------------------*/
WaitAck(void)
{
unsigned char errtime=255;//因故障接收方无ACK,超时值为255。
SDA=1;
SCL=1;
SystemError=0x10;
while(SDA)
{ errtime--;
if(!errtime)
{ AD7416_I2CStop();
AD7416_SystemError=0x11; //出错后给全局变量赋值
return;
}
}
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2003/05/13
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
---------------------------------------------------------------------------------*/
void SendAck(void)
{
SDA=0; SomeNOP(); //数据线保持低,时钟线发生一次从高低的跳变 发送一个应答信号
SCL=1; SomeNOP();
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2003/05/13
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
--------------------------------------------------------------------------------*/
void SendNotAck(void)
{
SDA=1; SomeNOP(); //数据线保持高,时钟线发生一次从高低的跳变 没有应答
SCL=1; SomeNOP();
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void I2CSend(uchar ch) 2003/05/13
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CSendByte(Byte ch)
{
unsigned char i=8;
while (i--)
{
SCL=0;_nop_();
SDA=(bit)(ch&0x80); ch<<=1; SomeNOP(); //时钟保持低可以发送数据
SCL=1; SomeNOP();
}
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:uchar I2CReceive(void) 2003/05/13
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
Byte I2CReceiveByte(void)
{
unsigned char i=8,data=0;
SDA=1;
while (i--)
{
data<<=1;
SCL=0;SomeNOP();
SCL=1;SomeNOP(); //时钟做一次从低到高的跳变 可以接收数据
data|=SDA;
}
SCL=0;
return data;
}
[/hide]
#include "intrins.h"
unsigned char SystemError;
sbit SCL= P1^6; //定义串行时钟线所在口 使用时根据自己的需要来定义
sbit SDA= P1^7; //定义串行数据线所在口 使用时根据自己的?枰?炊ㄒ?
#define SomeNOP(); {_nop_();_nop_();_nop_();_nop_();}
/*--------------------------------------------------------------------------------
调用方式:void AD7416_I2CStart(void) 2003/05/04
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
[hide]
void I2CStart(void)
{
EA=0;
SDA=1; SCL=1; SomeNOP();//数据线保持高,时钟线从高到低一次跳变,I2C通信开始
SDA=0; SomeNOP();
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void AD7416_I2CStop(void) 2003/05/04
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStop(void)
{
SCL=0; SDA=0; SomeNOP(); //数据线保持低,时钟线从低到高一次跳变,I2C通信停止
SCL=1; SomeNOP(); SDA=1;
EA=1;
}
/*--------------------------------------------------------------------------------
调用方式:I2CAck(void) 2003/05/13
函数说明:私有函数,I2C专用,等待从器件接收方的应答
ACK BY AD7416
---------------------------------------------------------------------------------*/
WaitAck(void)
{
unsigned char errtime=255;//因故障接收方无ACK,超时值为255。
SDA=1;
SCL=1;
SystemError=0x10;
while(SDA)
{ errtime--;
if(!errtime)
{ AD7416_I2CStop();
AD7416_SystemError=0x11; //出错后给全局变量赋值
return;
}
}
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2003/05/13
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
---------------------------------------------------------------------------------*/
void SendAck(void)
{
SDA=0; SomeNOP(); //数据线保持低,时钟线发生一次从高低的跳变 发送一个应答信号
SCL=1; SomeNOP();
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2003/05/13
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
--------------------------------------------------------------------------------*/
void SendNotAck(void)
{
SDA=1; SomeNOP(); //数据线保持高,时钟线发生一次从高低的跳变 没有应答
SCL=1; SomeNOP();
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void I2CSend(uchar ch) 2003/05/13
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CSendByte(Byte ch)
{
unsigned char i=8;
while (i--)
{
SCL=0;_nop_();
SDA=(bit)(ch&0x80); ch<<=1; SomeNOP(); //时钟保持低可以发送数据
SCL=1; SomeNOP();
}
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:uchar I2CReceive(void) 2003/05/13
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
Byte I2CReceiveByte(void)
{
unsigned char i=8,data=0;
SDA=1;
while (i--)
{
data<<=1;
SCL=0;SomeNOP();
SCL=1;SomeNOP(); //时钟做一次从低到高的跳变 可以接收数据
data|=SDA;
}
SCL=0;
return data;
}
[/hide]
我来回答
回答91个
时间排序
认可量排序
认可0
认可1
认可1
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
加载中···
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片
相关问答
-
2019-01-18 09:16:56
-
2013-04-26 14:19:40
-
02008-11-24 10:13:32
-
02018-07-23 08:49:20
-
22020-03-17 11:56:06
-
42019-12-20 09:46:51
-
2012-12-04 13:21:40
-
22020-02-19 11:30:44
-
02019-03-22 09:52:53
-
42018-09-25 12:19:17
-
22019-05-24 18:19:17
-
2008-08-24 12:44:37
-
62015-11-18 15:51:59
-
2017-07-14 20:57:07
-
2020-05-18 10:09:36
-
2018-09-01 11:11:36
-
42015-03-11 10:56:05
-
2020-01-07 19:44:24
-
2017-03-31 11:05:35
无更多相似问答 去提问

点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认