历史上的今天
返回首页

历史上的今天

今天是:2025年01月26日(星期日)

2019年01月26日 | 关于单片机IIC总线的理解(附程序)

2019-01-26 来源:eefocus

#include


void delay10us(void){//误差 0us

    unsigned char a,b;

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

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

}


void iicStart(){

SDA = 1;

delay10us();

SCL = 1;

delay10us();

SDA = 0;

delay10us();

SCL = 0;//SCL=0时,SDA状态允许变化

delay10us();


}


unsigned char iicSendDate(unsigned char dat){

unsigned char i,a;

for(i=0;i<8;i++){

SDA = dat>>7;

dat>>=1;

SCL = 1;

delay10us();

SCL = 0;

delay10us();

}

//等待应答. SCL、SDA释放   等待应答时,SCL=1,SDA=1,应答后,SDA=0

SDA = 1;

delay10us();

SCL = 1;

//delay10us();  不需要延时,后面通过a++延时,来判断是否发送成功

//应答与否—————_是否发送成功

while(SDA){//若应答,则SDA=0,从而结束循环,返回1.

   a++;

   delay10us();

   if(a>200){

             SCL = 0;

             delay10us();

            return 0;

   }

   

}

SCL = 0;//SCL=0时,允许SDA状态发生变化,为了下一次发送

delay10us();

return 1;


}

//读取过程,主机先发送从机器件地址,要读取的地址,后要重复一次起始信号并发出器件地址和读取方向1 (发送函数包含等待从机应答过程即等待 SDA=0的过程)

//发送完后,scl = 0; 才开始读取数据过程——iicReadDate()函开始数执行

unsigned char iicReadDate(){

unsigned char i,dat = 0;

//scl =0;之前已经等于0了,不用写

SDA = 1;//读取字节前,先释放SDA,SDA=1不是将端口固定位高电平,而是关闭单片机

        //内部下MOG管,让SDA线的电平由信号决定。

delay10us();//等待SDA为状态的更新

for(i=0;i<8;i++){//接受8个字节

SCL = 1;//SDA为高电平时,数据是稳定的

delay10us();

dat<<=1;//iic是串行传输的,只能一位一位传输,并且最高位在前

dat |=SDA;//将dat左移一位,然后将SDA位的状态放到dat的最后一位,赋值给dat,循环8次,依次写到dat的8个位中。dat的最初的首位被移出,

delay10us();

SCL = 0;//SCL=0时,SDA状态才允许发生变化。为后续的终止信号做准备。

delay10us();


}

return dat;


}

void iccStop(){

SDA = 0;

delay10us();

SCL = 1;  //释放

delay10us();

SDA = 1;  //释放

delay10us();


}

//iic总线  相当于数据线,由单片机模拟。


//往24c02的一个地址写入数据

void at24co2WriteDate(unsigned char addr,unsigned char dat){


iicStart();//开始


iicSendDate(0xa0);//发送写器件地址 1010 000 0

iicSendDate(addr);//发送该器件的存储区的首地址

iicSendDate(dat);//发送数据


iicStop();//停止


}


//从24c02内读取数据

unsigned char at24c02ReadDate(unsigned char addr ){ //addr:器件的存储区的首地址。器件的地址已知

unsigned char num;

iicStart();//开始


iicSendDate(0xa0);//发送器件地址+0

iicSendDate(addr);//发送该器件的存储区的首地址

iicStart();

iicSendDate(0xa1);


num = iicReadDate();


iicStop();//结束


return num;

}


推荐阅读

史海拾趣

Gamewell-FCI ( Honeywell )公司的发展小趣事

在电子行业中,Gamewell-FCI作为霍尼韦尔(Honeywell)旗下的重要品牌,其发展历程充满了诸多关键节点和里程碑事件。以下是五个与Gamewell-FCI(Honeywell)公司发展相关的故事,每个故事均基于事实描述:

1. Gamewell-FCI的起源与并入霍尼韦尔

Gamewell-FCI的起源可以追溯到其前身Gamewell Fire Alarm Telegraph Company,该公司成立于19世纪末,以生产创新的火灾报警系统而闻名。随着技术的不断进步和市场需求的扩大,Gamewell逐渐发展成为火灾安全领域的领导者。20世纪后期,Gamewell被FCI(Fire Control Instruments)收购,进一步巩固了其在消防报警技术领域的地位。随后,随着霍尼韦尔在工业自动化和安全领域的扩展,Gamewell-FCI被并入霍尼韦尔大家庭,成为其安全与生产力解决方案集团的一部分。这一合并不仅为Gamewell-FCI带来了更广阔的市场和资源,也使其能够继续推动消防安全技术的创新与发展。

2. 技术创新与产品线扩展

在并入霍尼韦尔后,Gamewell-FCI凭借其深厚的技术底蕴和创新能力,不断推出新产品和技术解决方案。从传统的火灾报警系统到先进的智能火灾探测和预警系统,Gamewell-FCI始终走在行业前列。公司还积极拓展产品线,涵盖了气体检测、紧急通讯、安全疏散等多个领域,为客户提供全方位的消防安全解决方案。这些技术创新和产品线扩展不仅增强了Gamewell-FCI的市场竞争力,也为其在全球范围内的业务扩展奠定了坚实基础。

3. 全球化布局与战略合作

随着全球化进程的加速,Gamewell-FCI也积极实施全球化战略,通过在全球各地设立分支机构、与当地企业建立合作关系等方式,不断扩大其市场覆盖面。同时,公司还注重与行业内的领军企业建立战略合作关系,共同推动消防安全技术的创新与发展。这些合作不仅为Gamewell-FCI带来了更多的商业机会,也促进了全球消防安全领域的交流与合作。

4. 应对市场挑战与转型

面对不断变化的市场环境和客户需求,Gamewell-FCI始终保持着敏锐的洞察力和灵活的反应能力。当传统消防安全市场逐渐饱和时,公司及时调整战略方向,将重心转向智能消防、物联网等新兴领域。通过引入先进的物联网技术、大数据分析等手段,Gamewell-FCI成功实现了从传统消防设备制造商向智能消防安全解决方案提供商的转型。这一转型不仅为公司带来了新的增长点,也为其在全球消防安全领域的领先地位提供了有力支撑。

5. 可持续发展与社会责任

作为霍尼韦尔的一部分,Gamewell-FCI始终将可持续发展和社会责任视为企业发展的重要组成部分。公司致力于通过技术创新和高效运营来降低产品对环境的影响,并积极推广节能减排、绿色建筑的理念。同时,Gamewell-FCI还积极参与社会公益事业,为灾区提供紧急救援、为教育机构提供安全培训等,展现了其作为行业领导者的社会责任感。这些努力不仅提升了公司的品牌形象和社会声誉,也为公司的长远发展奠定了坚实基础。

AUK Contractors Co Ltd公司的发展小趣事

随着公司业务的不断扩展,AUK Contractors Co Ltd意识到单一市场已无法满足其增长需求。于是,公司积极寻求国际合作,与多个国家的电子企业建立了战略伙伴关系。通过技术交流和资源共享,公司成功打开了新的市场,实现了业务的快速增长。

Excelsys公司的发展小趣事

品质是Excelsys公司的生命线。公司始终坚持严格的品质控制标准,从原材料采购到生产制造的每一个环节,都经过严格的质量检测。这种对品质的执着追求,让Excelsys的产品在市场上赢得了良好的口碑。同时,公司还建立了完善的售后服务体系,为客户提供及时、专业的技术支持,进一步提升了品牌的信誉度。

ELNA(依娜)公司的发展小趣事

随着全球对环保和可持续发展的重视,ELNA也开始关注绿色制造和环保产品。公司积极采用环保材料和清洁能源,减少生产过程中的污染和排放。同时,ELNA还加强了对废旧产品的回收和再利用,推动循环经济的发展。

Discrete Semiconductor Industries公司的发展小趣事

在电子行业的早期,一家名为“晶元科技”的Discrete Semiconductor Industries公司凭借其独特的技术革新,成功地在市场中脱颖而出。该公司专注于研发新型半导体材料,通过不断的实验和测试,最终成功开发出了具有更高性能、更低功耗的半导体产品。这些产品迅速得到了市场的认可,晶元科技也因此成为了半导体行业的领军企业之一。随着技术的不断进步,晶元科技不断推出新产品,满足市场对高性能半导体元件的需求,逐渐巩固了其市场地位。

C&K公司的发展小趣事

通过不断的努力和创新,C&K在90年代中期已经成为世界领先的开关制造商之一,也是业内最受信赖的品牌之一。这一成就的取得离不开公司对产品质量的严格把控和对技术创新的持续追求。同时,C&K还积极与全球各地的客户合作,根据他们的需求量身定制开关产品,赢得了广泛的赞誉。

问答坊 | AI 解惑

公共汽车自动报站设计

本帖最后由 paulhyde 于 2014-9-15 03:23 编辑 我的毕业设计选的是公共汽车自动报站设计,要怎么写啊. 我无从下手啊,谁指点一下了拉.  …

查看全部问答>

基于LabVIEW的虚拟振动测试系统

基于LabVIEW的虚拟振动测试系统…

查看全部问答>

wince下ffmpeg库跑不起来怎么回事?很着急,谢谢各位

参考网上的方法,我用cygwin编译了ffmpeg的库,所不同的是我要用在X86的wince环境下,所以配置的编译选项也是X86的,如下,编译器用的x86mingw32ce-0.59.1.tar: ./configure --enable-memalign-hack --target-os=mingw32ce --enable-cross-compil ...…

查看全部问答>

关于内核api

     本人接触过一段时间的驱动开发,知道有一些函数是内核专用的,当时用的时候是装了DDK写的,但我想知道那些内核的api在不装DDK时是否存在于windows系统中的一个文件中呢?就像ring3下的api常常在kernel32.dll中一样。高手 ...…

查看全部问答>

自制简单条形码识别仪

一维条形码识别http://v.youku.com/v_show/id_XMjM0MTMyMzA4.html这个是我23岁生日那天完成的,每次生日我都会送自己一样东西留做纪念。程序是用matlab编辑的,一台电脑一个摄像头再加上我的软件就能完成一维条形码识别了,当然识别的速度比较慢。 ...…

查看全部问答>

F2812 初始化错误,请教原因

在打开CCS 2000时出现不能初始化CPU的错误. 出错信息如下: can\\\'t Initialize Target CPU: Error 0x00001200/-1145 Error during:OCS, Target Unrecoverable emulation error I/O port=0 有时打开了在程序运行过程中也会显示CPU 工作在low ...…

查看全部问答>

请教各位斑竹和大虾关于通过串口更新程序的事情

430的jtag方式和bsl方式都在现场的环境下显的不实用,现场的外部接口只有串口,请教下有什么方式可以实现程序的更新呢?…

查看全部问答>

请教430串口buffer定义???谢谢

TI给提供的参考程序:经测试没有定义  P3DIR |= 0x10 时串口仍然可以发送数据给PC机     WDTCTL = WDTPW + WDTHOLD;            &nb ...…

查看全部问答>

全民DIY ACDC实验电源

前段时间曾透露过,打算联手资深专业人员参与本次数控电源的DIY活动并且尝试一种全新的模式,系统及电路将围绕该模式展开,因需说明的内容较多,故单独发帖而未利用站方提供的现成报名模板。   DIY活动的中心应该是有益、有趣、实用。通过DI ...…

查看全部问答>

msp430F2**改进了

最近用msp430f249代替原来用的149,经过测试,发现249比149有了较大改进。复位性能大大好于149,可以使用内部时钟达到16M,功耗还明显降低。…

查看全部问答>