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单片机
    +关注

    关注

    269

    文章

    5641

    浏览量

    120358
  • C语言
    +关注

    关注

    180

    文章

    7500

    浏览量

    123167
  • I2C
    I2C
    +关注

    关注

    27

    文章

    1327

    浏览量

    120542
收藏 人收藏

    评论

    相关推荐

    C51单片机模拟I2C总线C语言源程序

    C51单片机模拟I2C总线C语言实现 1.&nbs
    发表于 08-13 17:07

    C51模拟I2C总线

    本帖最后由 eehome 于 2013-1-5 09:53 编辑 C51模拟I2C总线
    发表于 08-15 20:45

    C51模拟I2C总线

    C51模拟I2C总线
    发表于 08-20 17:48

    51单片机C语言实例浅析》

    51单片机C语言实例浅析》
    发表于 08-20 19:33

    51单片机C语言实

    51单片机C语言实例 下载
    发表于 03-14 20:14

    怎样用51单片机c语言实现可变的频率输出

    怎样用51单片机c语言实现可变的频率的频率输出并显示到数码管上
    发表于 12-21 09:57

    使用多种编程语言实现I2C总线设备(传感器)进行控制

    使用多种编程语言实现I2C总线设备(传感器)进行控制1、概述Ginkgo I2C总线适配器可以使用各类编程
    发表于 05-17 10:01

    51单片机接AT24C02模拟I2C总线问题

    我用51单片机接AT24C02模拟I2C总线,编写程序的时候其中向AT24
    发表于 09-17 14:16

    【下载】《单片机语言C51应用实战集锦》

    一种在C51中写二进制的方法程序十 CRC算法原理及C语言实现程序十一 软件陷阱程序十二 一个简单的VB串口发送程序程序十三 12864汉字液晶显示驱动程序程序十四 12232点阵液晶基本驱动程序……附录A MCS-
    发表于 02-09 15:30

    单片机C语言实例有哪些

    例(400例)/1-IO输出-点亮1个LED灯方法1/IO输出.Uv2单片机C语言实例(400例)/1-IO输出-点亮1个LED灯方法1/obj/
    发表于 07-15 10:06

    80c51单片机使用c语言实现P2接口

    80c51单片机使用c语言实现P2接口led灯依次点亮周期循环#include unsigned int a ;unsigned char
    发表于 07-15 09:38

    51单片机模拟I2C简介

    目录51单片机模拟I2CI2C简介I2C实现51
    发表于 01-05 08:23

    89c51单片机模拟i2c总线怎么实现一主多从呢?

    i2c总线上,连接多个89C51,把一个89C51做为主控器,其他的作为被控器,能否实现一个单片机
    发表于 05-08 18:05

    51单片机能不能io模拟i2c

    51单片机能不能io模拟i2c,两个单片机之间通讯,主机可以
    发表于 11-02 07:00

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

    I2C总线单片机C语言实现及其应用 本文介绍了I2C总线的概念、接口特性和传输时序,提出了一
    发表于 10-17 08:36 2822次阅读
    <b class='flag-5'>I2C</b><b class='flag-5'>总线</b>的<b class='flag-5'>单片机</b>C<b class='flag-5'>语言实现</b>及其应用