0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用C语言实现51单片机模拟I2C总线

Wildesbeast 来源:网络整理 作者:佚名 2020-05-05 15:32 次阅读

电路原理

EEPROMATMEL公司的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);

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 51单片机
    +关注

    关注

    274

    文章

    5702

    浏览量

    123478
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136676
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1484

    浏览量

    123613
收藏 人收藏

    评论

    相关推荐

    C51单片机模拟I2C总线C语言实现

    EEPROM为ATMEL公司的AT24C01A。单片机为ATMEL公司的AT89C512. 软件说明 C
    发表于 08-13 13:55 88次下载

    亿恒C166 系列单片机I2C 总线的软件模拟

    亿恒C166 系列单片机I2C 总线的软件模拟
    发表于 05-14 16:11 6次下载

    基于I2C总线单片机暖水锅炉测温系统实现

    基于I2C总线单片机暖水锅炉测温系统实现:摘要:温度测量是工程控制领域常见的一种情况,本文介绍了一种基于I2C
    发表于 06-21 22:40 23次下载

    I2C总线单片机C语言实现及其应用

    I2C总线单片机C语言实现及其应用 本文介绍了I2C总线
    发表于 10-17 08:36 2968次阅读
    <b class='flag-5'>I2C</b><b class='flag-5'>总线</b>的<b class='flag-5'>单片机</b><b class='flag-5'>C</b><b class='flag-5'>语言实现</b>及其应用

    基于pic单片机模拟I2C通信

    基于pic单片机模拟I2C通信设计
    发表于 05-25 08:58 2463次阅读

    i2c

    单片机i2c总线操作;单片机i2c总线操作;单片机
    发表于 05-17 11:09 35次下载

    80C51单片机模拟I2C总线的主机程序分享

    I2C总线协议程序 在使用的过程中一定要注意时序、时间的问题。 i2c.c /* I2C.c 标准80C51
    发表于 12-05 15:39 3431次阅读
    80<b class='flag-5'>C51</b><b class='flag-5'>单片机</b><b class='flag-5'>模拟</b><b class='flag-5'>I2C</b><b class='flag-5'>总线</b>的主机程序分享

    使用51单片机模拟I2C总线的驱动程序免费下载

    本文档的主要内容详细介绍的是使用51单片机模拟I2C总线的驱动程序免费下载。
    发表于 04-17 17:27 0次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>模拟</b><b class='flag-5'>I2C</b><b class='flag-5'>总线</b>的驱动程序免费下载

    使用C语言模拟51单片机I2C总线的资料和程序免费下载

    本文档的主要内容详细介绍的是使用C语言模拟51单片机I2C
    发表于 08-06 17:34 11次下载
    使用<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>模拟</b><b class='flag-5'>51</b><b class='flag-5'>单片机</b>的<b class='flag-5'>I2C</b><b class='flag-5'>总线</b>的资料和程序免费下载

    使用51单片机模拟I2C总线的程序免费下载

    本文档的主要内容详细介绍的是使用51单片机模拟I2C总线的程序免费下载我见过最好的,与大家共享。
    发表于 06-18 17:44 3次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>模拟</b><b class='flag-5'>I2C</b><b class='flag-5'>总线</b>的程序免费下载

    基于MCS-51单片机I2C总线接口电路的设计

    单片机控制系统中,广泛使用I2C器件。如果单片机自带I2C总线接口,则所有I2C器件对应连接到
    发表于 10-15 16:13 3399次阅读
    基于MCS-<b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>I2C</b><b class='flag-5'>总线</b>接口电路的设计

    I2C总线驱动的C语言源程序详细说明

     i2c 总线单片机系统中常用到的总线技术这里给大家介绍一个I2C总线驱动的
    的头像 发表于 09-26 11:07 5227次阅读

    使用单片机实现I2C接口存储器AT24C04的读写与显示的C语言实

    本文档的主要内容详细介绍的是使用单片机实现I2C接口存储器AT24C04的读写与显示的C语言实
    发表于 03-31 11:20 16次下载

    使用单片机实现I2C存储器设计的中文硬件字库应用的C语言实

    本文档的主要内容详细介绍的是使用单片机实现I2C存储器设计的中文硬件字库应用的C语言实例。
    发表于 03-31 14:45 2次下载

    使用单片机实现I2C接口数字电位器AD5242应用的C语言实例免费下载

    本文档的主要内容详细介绍的是使用单片机实现I2C接口数字电位器AD5242应用的C语言实例免费下载。
    发表于 03-31 16:31 56次下载