历史上的今天
返回首页

历史上的今天

今天是:2025年02月21日(星期五)

正在发生

2020年02月21日 | 注释非常详细的51单片机IIC源程序

2020-02-21 来源:51hei

自己写的IIC程序,因为初学,还是有借鉴的地方,但是所有程序均为手打,每一行都有详细的注释


单片机源程序如下:

#include

#include


sbit IIC_SDA=P2^6;        //声明IIC总线的数据线接在单片机的P2.6端口。

sbit IIC_SCL=P2^7;        //声明IIC总线的时钟线接在单片机的P2.5端口。



//void delay(unsigned int t)

//{//延时函数

//    while(t){t--;};                    //延时循环计数

//}

//-------------------------------------------------------------------

void delay_IIC(void)    

{//IIC总线限速延时函数。

//该函数是空函数,延时4个机器周期。

        ;

        ;

}

//-------------------------------------------------------------------

void IIC_Init(void)

{//IIC总线初始化函数

    IIC_SDA=1;//释放IIC总线的数据线。

    IIC_SCL=1;//释放IIC总线的时钟线。

}

//-------------------------------------------------------------------

void IIC_start(void)

{//IIC总线产生起始信号函数  

   IIC_SDA=1;//拉高数据线

         IIC_SCL=1;//拉高时钟线

         delay_IIC();

         IIC_SDA=0;//在时钟线为高电平时,拉低数据线,产生起始信号。

         delay_IIC();

   IIC_SCL=0;//拉低时钟线

}

//-------------------------------------------------------------------

void IIC_stop(void) 

{//IIC总线产生停止信号函数

    IIC_SDA=0;//拉低数据线

    delay_IIC();

    IIC_SCL=1;//拉高时钟线。

    delay_IIC();

    IIC_SDA=1;//时钟时线为高电平时,拉高数据线,产生停止信号。

    delay_IIC();

}

//-------------------------------------------------------------------

bit IIC_Tack(void)

{//接收应答信号函数

    bit ack;//定义一个位变量,来暂存应答状态。

    IIC_SDA=1;//释放数据总线,准备接收应答信号。

    delay_IIC();

    IIC_SCL=1;//拉高时钟线。

    delay_IIC();

    ack=IIC_SDA;//读取应答信号的状态。

    delay_IIC();

    IIC_SCL=0;//拉低时钟线。

    delay_IIC();

    return ack;//返回应答信号的状态,0表示应答,1表示非应答。

}

//-------------------------------------------------------------------

void IIC_write_byte(unsigned char Data)

{//向IIC总线写入一个字节的数据函数 

        unsigned char i;

         for(i=0;i<8;i++)//有8位数据

        {

                        IIC_SDA=Data&0x80;//写最高位的数据

                        delay_IIC();

                        IIC_SCL=1; //拉高时钟线,将数写入到设备中。

                        delay_IIC();

                        IIC_SCL=0;//拉低时钟线,允许改变数据线的状态

                        delay_IIC();

                        Data=Data<<1;//数据左移一位,把次高位放在最高位,为写入次高位做准备

        }

}

//-------------------------------------------------------------------

unsigned char IIC_read_byte()

{//从IIC总线读取一个字节的数据函数

    unsigned char i;

    unsigned char Data;       //定义一个缓冲寄存器。

    for(i=0;i<8;i++)//有8位数据

    {

        IIC_SCL=1;//拉高时钟线,为读取下一位数据做准备。

        delay_IIC();

        Data=Data<<1;//将缓冲字节的数据左移一位,准备读取数据。

        delay_IIC();

        

        if(IIC_SDA)//如果数据线为高平电平。

            Data=Data|0x1;//则给缓冲字节的最低位写1。

        IIC_SCL=0;//拉低时钟线,为读取下一位数据做准备。

        delay_IIC();

    }

    return Data;//返回读取的一个字节数据。

}

void IIC_single_byte_write(unsigned char Daddr,unsigned char Waddr,unsigned char Data)

{//向任意地址写入一个字节数据函数

    IIC_start();//产生起始信号

    IIC_write_byte(Daddr);//写入设备地址(写)

    IIC_Tack();//等待设备的应答

    IIC_write_byte(Waddr);//写入要操作的单元地址。

    IIC_Tack();//等待设备的应答。

    IIC_write_byte(Data);//写入数据。

    IIC_Tack();//等待设备的应答。

    IIC_stop();//产生停止符号。

}

//-------------------------------------------------------------------

unsigned char IIC_single_byte_read(unsigned char Daddr,unsigned char Waddr)

{//从任意地址读取一个字节数据函数

    unsigned char Data;//定义一个缓冲寄存器。


    IIC_start();//产生起始信号

    IIC_write_byte(Daddr);//写入设备地址(写)

    IIC_Tack();//等待设备的应答

    IIC_write_byte(Waddr);//写入要操作的单元地址。

    IIC_Tack();//等待设备的应答。

    

    IIC_start();//产生起始信号

    IIC_write_byte(Daddr+1);//写入设备地址(读)。

    IIC_Tack();//等待设备的应答。 

    Data=IIC_read_byte();//写入数据。

    IIC_stop();//产生停止符号。

    //-------------------返回读取的数据--------------------

    return Data;//返回读取的一个字节数据。

}

推荐阅读

史海拾趣

芯海科技(CHIPSEA)公司的发展小趣事

芯海科技自2003年成立以来,便专注于高精度ADC(模数转换器)芯片的研发。在成立初期,公司面临国际巨头的激烈竞争,但凭借对技术的执着追求,成功打破了国内市场的垄断。公司推出的高精度ADC芯片在电能计量领域得到了广泛应用,为工业领域提供了稳定、可靠的解决方案。这一阶段的成功为芯海科技在电子行业奠定了坚实的基础。

Excel-Display Corporation公司的发展小趣事

EDC一直将产品质量视为企业的生命线。为了确保产品质量,公司建立了严格的质量管理体系,从原材料采购到生产过程中的每一个环节都进行严格的质量控制。

此外,EDC还注重售后服务,为客户提供全方位的技术支持和解决方案。这些举措让EDC赢得了客户的信赖和好评,也为公司赢得了更多的市场份额。

Gruner AG公司的发展小趣事
在电源转换电路中,光耦合器可以实现初级侧和次级侧之间的电气隔离,保护电路免受高压或电压尖峰的影响。
Control Sciences Inc公司的发展小趣事

随着技术的不断进步,Control Sciences Inc开始寻求更广阔的市场空间。公司积极参与国内外各大电子展会,展示其先进的产品和技术。同时,公司还加大了市场推广力度,与多个知名企业建立了战略合作关系。通过这些努力,Control Sciences Inc的产品逐渐走进了更多的企业和家庭,其品牌影响力也日益增强。

Forge Europa Ltd公司的发展小趣事

随着技术实力的不断增强,Forge Europa Ltd公司开始将目光投向国际市场。公司积极参与国际展会,与全球客户建立联系,并通过优化供应链管理,确保产品能够迅速响应国际市场需求。在欧洲市场,Forge Europa凭借其高品质的产品和专业的服务,迅速赢得了众多知名客户的青睐。同时,公司还不断拓展北美、亚洲等新兴市场,逐步建立起覆盖全球的销售网络。

Baumer Electric Ag公司的发展小趣事

1962年,赫尔穆特•维茨(Helmut Vietze)加入Baumer Electric Ag,成为一名模具制造工。他凭借出色的个人能力和工作表现,很快在公司中脱颖而出。1964年,公司创始人Herbert Baumer去世后,Helmut Vietze接管了管理层,并带领公司走向新的发展阶段。他的领导为公司注入了新的活力,推动了Baumer在技术和市场上的双重突破。

问答坊 | AI 解惑

150M的虚拟示波器 DSO-2150 USB

DSO-2150 USB 流线型设计,体积小巧, USB2.0接口,免电源,与台式示波器类似界面,易于上手. 更适合于笔记本电脑,生产线维修调整,便于出差使用。 小的尺寸(mm):190(L)x100(W)x35(H) ,便于携带. .高刷新率, 高采样率,150MS/s实时采样. 软 ...…

查看全部问答>

PIC单片机教程 西安电子科技大学

PIC单片机教程      西安电子科技大学 网上找的觉得不错,传上来,让大家一起分享!…

查看全部问答>

大家帮帮忙 程序查错

在keil编译 错误一大堆烦死了,大家帮帮忙看下 哪出问题了 先谢谢了 #include sbit p3_0=P3^0; sbit p0_0=P0^0; sbit p0_1=P0^1; void delay(unsigned int k); int cheak(unsigned char *jj); void scankey(); int n=0; main() {   ...…

查看全部问答>

wince 日文EUC编码

wince帮助中好像只有日文JIS编码没有日文EUC编码。wince日文系统怎样支持日文EUC编码啊?…

查看全部问答>

内核保护以及数字签名

在WINCE 6.0下,内核下的EXE以及DLL都能正常运行,外部数字签名过的EXE以及DLL也可以在这个内核下运行。任何无数字签名的EXE以及DLL则不能运行。不知该如何做? 我在平台定制时,已经将sysgen_certmod设为1。重新build and sysgen。 …

查看全部问答>

request_region()到底如何使用?

谁能举个例子, 比如,我想使用arm芯片的I/O口C,也就是GPGC,用它的若干个口吧,比如8~11 该如何调用这个函数呢?期待答案,谢谢 …

查看全部问答>

51中,cpu根据啥来决定何种寻址方式的?可以举个例子嘛?

51中,cpu根据啥来决定何种寻址方式的?可以举个例子嘛?…

查看全部问答>

msp430f413编译出错

Error[Pe020]: identifier "BCSCTL1" is undefined 头文件:#include<msp430x41x.h> 请帮忙分析下,应该是头文件里没BCSCTL1的定义。如果如此,又应该包含哪个头文件呢。…

查看全部问答>

SPS-2000焊锡搅拌机 (MALCOM)

 SPS-2000焊锡搅拌机(MALCOM)特长:无铅焊锡搅拌时温度等的关系是重要的因素MALCOM <SPS-2000>设定了温度管理、实现搅拌自动停止机能,无论是刚从冰箱拿出的锡膏,工作人员只需按一下按钮就可以搅拌出最佳的状态的锡膏机器。公转约 ...…

查看全部问答>

一个逻辑工程师的成长之路-逻辑工程师水平的V模型

理论篇讲述了一个逻辑工程师是如何发展的,并且给出了各个阶段的特征,但是,仍然没给出清晰的量化,本章,尝试对这个问题给出一个解决方案。逻辑工程师应该掌握的各种能力大概设置了5种能力,每种能力在不同的阶段有不同的要求。其中,设计完成能 ...…

查看全部问答>