历史上的今天
返回首页

历史上的今天

今天是:2025年04月23日(星期三)

正在发生

2020年04月23日 | 51单片机——I2C总线驱动程序

2020-04-23 来源:eefocus

为方便移植,采用多文件工程的方式。


void Delay10us()//延时10us

{

unsigned char a,b;

for(b=1;b>0;b--)

for(a=2;a>0;a--);

 

}

起始信号:在SCL时钟信号在高电平期间SDA信号产生一个下降沿


void I2cStart()//为方便与其他函数衔接,起始之后SDA和SCL都为0,虽然这与I2C总线空闲状态不符,但并不影响程序运行

{

SDA=1;

Delay10us();

SCL=1;

Delay10us();//建立时间是SDA保持时间>4.7us

SDA=0;

Delay10us();//保持时间是>4us

SCL=0;

Delay10us();

}

终止信号:在SCL时钟信号高电平期间SDA信号产生一个上升沿


void I2cStop()//结束之后保持SDA和SCL都为1;表示总线空闲

{

SDA=0;

Delay10us();

SCL=1;

Delay10us();//建立时间大于4.7us

SDA=1;

Delay10us();

}

I2cSendByte(unsigned char dat) : 通过I2C发送一个字节。在SCL时钟信号高电平期间,保持发送信号SDA保持稳定


unsigned char I2cSendByte(unsigned char dat)//发送成功返回1,发送失败返回0

{

unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。

for(a=0;a<8;a++)//要发送8位,从最高位开始

{

SDA=dat>>7; //起始信号之后SCL=0,所以可以直接改变SDA信号

dat=dat<<1;

Delay10us();

SCL=1;

Delay10us();//建立时间>4.7us

SCL=0;

Delay10us();//时间大于4us

}

SDA=1;//¥¥¥

Delay10us();

SCL=1;

while(SDA)//等待应答,也就是等待从设备把SDA拉低

{

b++;

if(b>200) //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束

{

SCL=0;

Delay10us();

return 0;

}

}

SCL=0;

Delay10us();

  return 1;

}

I2cReadByte() :使用I2c读取一个字节


unsigned char I2cReadByte()

{

unsigned char a=0,dat=0;

SDA=1; //¥¥¥

Delay10us();

for(a=0;a<8;a++)//接收8个字节

{

SCL=1;

Delay10us();

dat<<=1;

dat|=SDA;

Delay10us();

SCL=0;

Delay10us();

}

return dat;

}

在以上两个函数中,在“¥¥¥”处,都将SDA置为1,这是将SDA线释放。原因如下:


I2C的数据和时钟线上都有一个上拉电阻,电阻的另一端接一个高电平。当I2C工作时,SDA上的电平取决于SDA上的数据。当I2C不工作时,因为集成电路的输入端为高阻状态,SDA上的电压就取决于电阻另一端的高电平了,因此I2C在释放总线后,SDA就等于1了。


对于I2C总线的解释:https://blog.csdn.net/cax1165/article/details/86755169


void At24c02Write(unsigned char addr,unsigned char dat) :往24c02的一个地址写入一个数据


void At24c02Write(unsigned char addr,unsigned char dat)

{

I2cStart();

I2cSendByte(0xa0);//发送写器件地址

I2cSendByte(addr);//发送要写入内存地址

I2cSendByte(dat); //发送数据

I2cStop();

}

unsigned char At24c02Read(unsigned char addr) :读取24c02的一个地址的一个数据


unsigned char At24c02Read(unsigned char addr)

{

unsigned char num;

I2cStart();

I2cSendByte(0xa0); //发送写器件地址

I2cSendByte(addr); //发送要读取的地址

I2cStart();

I2cSendByte(0xa1); //发送读器件地址

num=I2cReadByte(); //读取数据

I2cStop();

return num;

}

多文件工程 头文件


#ifndef __I2C_H_

#define __I2C_H_

 

#include

 

sbit SCL=P2^1;

sbit SDA=P2^0;

 

void I2cStart();

void I2cStop();

unsigned char I2cSendByte(unsigned char dat);

unsigned char I2cReadByte();

void At24c02Write(unsigned char addr,unsigned char dat);

unsigned char At24c02Read(unsigned char addr);

 

#endif

推荐阅读

史海拾趣

GE公司的发展小趣事

对于光电控制电子生日蛋糕电路,网友可能提出多种问题。以下是一些可能的问题及其详细回答:

1. 光电控制电子生日蛋糕电路的基本工作原理是什么?

回答:光电控制电子生日蛋糕电路通常由一个光敏二极管(如VD1)、一个控制电路(如IC1,常为555时基集成电路或音乐芯片)以及其他外围元器件组成。当蜡烛被点燃并照射到光敏二极管上时,光敏二极管的电阻会发生变化,导致控制电路中的电压改变。这一电压变化进而触发控制电路,使其输出控制信号,驱动音乐芯片工作并输出音乐信号(如“祝你生日快乐”),同时可能还驱动发光二极管等元件闪烁,增加节日气氛。

2. 如何选择合适的元器件来构建这个电路?

回答:选择合适的元器件是构建光电控制电子生日蛋糕电路的关键。光敏二极管应选择灵敏度适中、响应速度快的型号;控制电路可以选择555时基集成电路或专用的音乐芯片,具体取决于电路设计的复杂度和功能需求;发光二极管可以选择高亮度、颜色鲜艳的型号以增强视觉效果;此外,还需要根据电路设计选择合适的电阻、电容等元器件。

3. 这个电路存在哪些安全隐患,如何避免?

回答:虽然光电控制电子生日蛋糕电路本身在正常情况下是安全的,但如果不当使用或制作过程中存在瑕疵,仍可能带来安全隐患。例如,电路中的电池如果处理不当,可能会导致电池液泄漏或短路;电子元件过热也可能引发火灾等。为了避免这些安全隐患,应确保电池安装牢固、电路连接正确无误;在使用过程中避免长时间连续工作,以防过热;同时,应让儿童在成人监护下使用此类电子生日蛋糕。

4. 如何调试和优化这个电路的性能?

回答:调试和优化光电控制电子生日蛋糕电路的性能可以通过以下步骤进行:首先检查电路连接是否正确无误;然后逐步测试各个元器件的功能是否正常;接着调整光敏二极管的灵敏度、控制电路的输出电压等参数以优化电路性能;最后在实际使用环境中进行整体测试,确保电路能够稳定可靠地工作。在调试过程中可以使用万用表等测试工具来监测电路中的电压、电流等参数变化。

5. 除了音乐和发光效果外,这个电路还可以实现哪些功能?

回答:除了基本的音乐和发光效果外,光电控制电子生日蛋糕电路还可以根据具体设计实现多种功能。例如可以加入烟雾效果装置来模拟真实的蜡烛燃烧效果;或者加入语音模块来播放生日祝福语等。这些功能的实现需要增加相应的元器件和电路设计复杂度但能够显著提升生日蛋糕的趣味性和观赏性。需要注意的是在实现这些功能时应充分考虑安全性和实用性避免过度复杂导致电路不稳定或安全隐患增加。

CIF公司的发展小趣事

C公司是一家专注于电子产品贸易的CIF公司。为了降低成本、提高效率,C公司积极整合全球供应链资源,与多家优质的电子产品生产商建立了长期合作关系。通过优化采购、生产和物流等环节,C公司成功降低了运营成本,提高了市场竞争力。

FERYSTER公司的发展小趣事

随着市场的不断扩大,FERYSTER公司意识到产品质量对于企业的重要性。因此,公司投入大量资金用于提升质量管理体系,引入国际先进的生产设备和检测仪器。同时,公司还加强了员工的质量意识培训,确保每一个环节都符合质量标准。这些措施的实施,使得FERYSTER公司的产品质量得到了显著提升,赢得了客户的广泛赞誉。

客益(Guestgood)公司的发展小趣事

在快速发展的过程中,FERYSTER公司非常注重企业文化的塑造。公司倡导“创新、协作、责任、卓越”的价值观,鼓励员工勇于创新、敢于担当。同时,公司还注重员工的成长和发展,为员工提供各种培训和学习机会。这些措施使得FERYSTER公司成为了一个充满活力、积极向上的团队,为公司的发展提供了源源不断的动力。

Ho Chien Electronics Group Inc公司的发展小趣事

随着市场的不断扩大,FERYSTER公司意识到产品质量对于企业的重要性。因此,公司投入大量资金用于提升质量管理体系,引入国际先进的生产设备和检测仪器。同时,公司还加强了员工的质量意识培训,确保每一个环节都符合质量标准。这些措施的实施,使得FERYSTER公司的产品质量得到了显著提升,赢得了客户的广泛赞誉。

HSMC公司的发展小趣事

HSMC的项目进展迅速,按照规划稳步推进。公司的一期项目设计产能为月产4.5万片晶圆,并计划于2019年底投产。二期项目则采用最新的制程工艺技术,设计月产能同样为4.5万片,预计于2021年第四季度投产。这些项目的顺利推进,不仅提升了HSMC的产能规模,也进一步巩固了其在行业内的地位。

问答坊 | AI 解惑

AD9852资料(程序,原理图)

本帖最后由 paulhyde 于 2014-9-15 02:54 编辑 包括测试程序,原理图,是买的一块开发板上给的。 [ 本帖最后由 chbaaic 于 2008-10-30 11:52 编辑 ]  …

查看全部问答>

石英振荡体名企诚招 研发部总工

百利通公司总部设在硅谷,是Nasdaq上市公司,在晶体振荡器领域位居世界前十大。百利通公司在香港和美国都设有研发中心,拥有一批经验丰富的专业设计人员。随着产品线的扩充和区域市场的成熟,先后在台湾、香港、上海设立公司,凭借其遍布全球的销售 ...…

查看全部问答>

光敏电阻

哪位仁兄介绍个好点的光敏电阻? 功率可调…

查看全部问答>

隔离器选型要点

隔离器选型要点 一.共模干扰抑制能力,隔离器优势先决条件。 隔离器在独有行业范围内,无论是温度隔离变送器、信号分配器、隔离配电器及电流、电压变送器等产品内,它们共有特点是端口之间要绝对电气隔离,也就是一次仪表、电源及采集设备之间没有任 ...…

查看全部问答>

如何选择生物识别产品?

  采用生物识别技术的门禁系统在安防行业应用已经越来越多,包括银行、监狱、部队等单位已经采用生物识别的门禁系统来加强其管理的安全性和使用的方便性。由于生物识别技术已经开始达到大规模的应用水平,包括产品价格、品质和技术都已经相对成熟 ...…

查看全部问答>

LM3S系列电源管理方式

本文以TI 公司的cortex M3芯片为例,说明了如何降低其功耗 …

查看全部问答>

window media player下添加菜单

大家好:      请教大家一个问题:      在微软window mobile 的windows media player下的右软键菜单下添加一个菜单项,该怎么添加? 微软是否提供相应的接口?      有谁知道 ...…

查看全部问答>

怎样读出试图列表里文件的名,用OnClickList么?

程序大概这样的,一个试图列表里显示了CF卡中所有的文件,鼠标焦点可以放在文件上,但现在想做一个选取功能,就是,当鼠标单击了一个文件就能直接或按另一个按钮读出他的名字,这样好去CF卡中查找这个文件并对这个文件操作。问题是,怎么读出文件的 ...…

查看全部问答>

美企招聘Java Engineer (SW 6#)

公司名称: Carrier Access 公司网址: http://www.carrieraccess.com 电子邮箱: lshi@carrieraccess.com,简历请注明信息出处 工作地点: 上海 外语要求: 英文良好 简历接收方式: 英文及中文 学历: 本科以上 职位描述: -Candidates will ha ...…

查看全部问答>

单片机浮点与字节数组的转换

void FloatToByte(float floatNum,unsigned char* byteArry){    char* pchar=(char*)&floatNum;    for(int i=0;i<sizeof(float);i++)    {  &nb ...…

查看全部问答>