历史上的今天

今天是:2026年03月21日(星期六)

2023年03月21日 | 如何使用C语言实现51单片机模拟I2C总线

发布者:转眼人老 来源: elecfans关键字:C语言  51单片机  模拟I2C总线 手机看文章 扫描二维码
随时随地手机看文章

电路原理图

EEPROM为ATMEL公司的AT24C01A。单片机为ATMEL公司的AT89C51

软件说明

C语言为Franklin C V3.2。将源程序另存为testi2c.c,用命令

C51 testi2c.c

L51 TESTI2C.OBJ

OHS51 TESTI2C

编译,连接,得到TESTI2C.HEX文件,即可由编程器读入并进行写片,实验。

3.源程序

#include 《reg51.h》

#include 《intrins.h》

#define uchar unsigned char

#define uint unsigned int

#define AddWr 0xa0 /*器件地址选择及写标志*/

#define AddRd 0xa1 /*器件地址选择及读标志*/

#define Hidden 0x0e /*显示器的消隐码*/

/*有关全局变量*/

sbit Sda= P3^7; /*串行数据*/

sbit Scl= P3^6; /*串行时钟*/

sbit WP= P3^5; /*硬件写保护*/

void mDelay(uchar j)

{ uint i;

for(;j》0;j--)

{ for(i=0;i《125;i--)

{;}

}

}

/*发送起始条件*/

void Start(void) /*起始条件*/

{

Sda=1;

Scl=1;

_nop_ ();

_nop_ ();

_nop_ ();

_nop_ ();

Sda=0;

_nop_ ();

_nop_ ();

_nop_ ();

_nop_ ();

}

void Stop(void) /*停止条件*/

{

Sda=0;

Scl=1;

_nop_ ();

_nop_ ();

_nop_ ();

_nop_ ();

Sda=1;

_nop_ ();

_nop_ ();

_nop_ ();

_nop_ ();

}

void Ack(void) /*应答位*/

{

Sda=0;

_nop_ ();

_nop_ ();

_nop_ ();

_nop_ ();

Scl=1;

_nop_ ();

_nop_ ();

_nop_ ();

_nop_ ();

Scl=0;

}

void NoAck(void) /*反向应答位*/

{

Sda=1;

_nop_ ();

_nop_ ();

_nop_ ();

_nop_ ();

Scl=1;

_nop_ ();

_nop_ ();

_nop_ ();

_nop_ ();

Scl=0;

}

void Send(uchar Data) /*发送数据子程序,Data为要求发送的数据*/

{

uchar BitCounter=8; /*位数控制*/

uchar temp; /*中间变量控制*/

do

{

temp=Data;

Scl=0;

_nop_ ();

_nop_ ();

_nop_ ();

_nop_ ();

if((temp&0x80)==0x80)/* 如果最高位是1*/

Sda=1;

else

Sda=0;

Scl=1;

temp=Data《《1; /*RLC*/

Data=temp;

BitCounter--;

}while(BitCounter);

Scl=0;

}

uchar Read(void) /*读一个字节的数据,并返回该字节值*/

{

uchar temp=0;

uchar temp1=0;

uchar BitCounter=8;

Sda=1;

do{

Scl=0;

_nop_ ();

_nop_ ();

_nop_ ();

_nop_ ();

Scl=1;

_nop_ ();

_nop_ ();

_nop_ ();

_nop_ ();

if(Sda) /*如果Sda=1;*/

temp=temp|0x01; /*temp的最低位置1*/

else

temp=temp&0xfe; /*否则temp的最低位清0*/

if(BitCounter-1)

{ temp1=temp《《1;

temp=temp1;

}

BitCounter--;

}while(BitCounter);

return(temp);

}

void WrToROM(uchar Data[],uchar Address,uchar Num)

{

uchar i;

uchar *PData;

PData=Data;

for(i=0;i《Num;i++)

{

Start(); /*发送启动信号*/

Send(0xa0); /*发送SLA+W*/

Ack();

Send(Address+i); /*发送地址*/

Ack();

Send(*(PData+i));

Ack();

Stop();

mDelay(20);

}

}

void RdFromROM(uchar Data[],uchar Address,uchar Num)

{

uchar i;

uchar *PData;

PData=Data;

for(i=0;i《Num;i++)

{

Start();

Send(0xa0);

Ack();

Send(Address+i);

Ack();

Start();

Send(0xa1);

Ack();

*(PData+i)=Read();

Scl=0;

NoAck();

Stop();

}

}

void main()

{

uchar Number[4]={1,2,3,4};

WP= 1;

WrToROM(Number,4,4); /*将初始化后的数值写入EEPROM*/

mDelay(20);

Number[0]=0;

Number[1]=0;

Number[2]=0;

Number[3]=0; /*将数组中的值清掉,以验证读出的数是否正确*/

RdFromROM(Number,4,4);

}


关键字:C语言  51单片机  模拟I2C总线 引用地址:如何使用C语言实现51单片机模拟I2C总线

上一篇:如何使用AT89C51的串口和电脑的串口进行通信原理与实验
下一篇:AT89C51单片机对智能语音拨号报警系统的设计

推荐阅读

工业用可携式装置须同时兼具低功耗、高可靠度和高性能要求,因此设计人员在开发产品时,须选用支援低电压操作与具备时脉监控功能的工规微控制器(MCU),以延长可携式产品电池使用寿命,同时避免因频率不稳而造成性能降低的问题发生。 工业领域中的可携式应用均要求低功耗、高可靠度和高性能。这类工业应用的例子包括条码器、出货数据记录器、高...
在20日举行的MSIG人工智能与物联网论坛上,ST模拟&MEMS全球副总裁兼MEMS传感器部门总经理Andrea Onetti表示,在人工智能,万物互联时代到来之际,优质的数据将更好地保证人工智能进行机器学习。而传感器扮演着至关重要的角色,高精度,低功耗,高安全性或内嵌人工智能应用将是未来传感器新的挑战。未来将会有许多应用需要精确测量来实现,小到穿戴设备,...
  特种机器人的概念是什么   特种机器人指除工业机器人、公共服务机器人和个人服务机器人以外的机器人。一般专指专业服务机器人。   特种机器人应用于专业领域,一般由经过专门培训的人员操作或使用的,辅助和/或代替人执行任务的机器人。   特种机器人有哪些   根据特种机器人所应用的主要行业,可将特种机器人分为:农业机器人、电力机...
本周消息,工信部发布工业和信息化标准工作要点;深圳首座12英寸晶圆厂正式启动;富芯400亿元模拟芯片IDM项目开工;汪挺先生被任命为泛林集团公司副总裁兼中国区总裁……工信部/地方动态工信部发布工业和信息化标准工作要点3月16日,工信部发布《2021年工业和信息化标准工作要点》,提出积极推进重点标准的有效实施等六大点内容。大力开展5G及下一代移动通...

史海拾趣

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

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved