历史上的今天
返回首页

历史上的今天

今天是:2024年09月15日(星期日)

2020年09月15日 | I2C协议器件地址码查询

2020-09-15 来源:51hei

还在为找不到I2C设备的地址而烦恼??


别慌,我带着代码走来了


按下按键,开始从0x01开始测试器件地址,一直到0xff结束。


查询到正确地址后,蜂鸣器叫2声,串口打印地址码,不再继续查询。


地址码输出至P1,在没有显示屏和不方便使用串口监视的情况下可通过LED状态读出地址。


初始版本没有增加地址码验证(验证的话就是用这个地址去读写数据显示出来就行)

单片机源程序如下:

#include  

#include  

#include

#define uchar unsigned char

#define uint unsigned int //函数声明

        

#define yh 0x80    //第1行+3位数显示

#define er 0x80+0x40


#define Address_Test count  //定义器件在 IIC 总线中的地址

#define Read_Address count+1

unsigned char TAB[16] ={'0', '1', '2', '3', '4', '5', '6', '7','8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};


uint open,count,num,disp;

uchar key,flag,temp;


sbit  RS=P3^5;

sbit  RW=P3^6;

sbit  E=P3^4;


sbit k2=P3^2;        //检测地址


sbit SCL=P2^6;    //时钟

sbit SDA=P2^7;          //数据


sbit beep=P2^3;    //蜂鸣提示




void write_1602com(uchar com)//****液晶写入指令函数****

{

        RS=0;//数据/指令选择置为指令

        RW=0;

        P0=com;//送入数据

        delayms(1);

        E=1;//拉高使能端,为制造有效的下降沿做准备

        delayms(1);

        E=0;//en由高变低,产生下降沿,液晶执行命令

}


void write_1602dat(uchar dat)//***液晶写入数据函数****

{

        RS=1;//数据/指令选择置为数据

        RW=0;

        P0=dat;//送入数据

        delayms(1);

        E=1; //en置高电平,为制造下降沿做准备

        delayms(1);

        E=0; //en由高变低,产生下降沿,液晶执行命令

}



void lcd_init()//***液晶初始化函数****

{

        write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据

        write_1602com(0x0c);//开显示不显示光标

        write_1602com(0x06);//整屏不移动,光标自动右移

        write_1602com(0x01);//清显示

}




void dsplay()

{

           if(disp==0)

                        {        

                                 uint a,b;   //地址数据缓存

                                

                                a = (Address_Test%256)/16; //           十位

                                b = (Address_Test%256)%16; //           个位

        

                                if(open==1&&flag==1)        

      {        

        SendString("ID:0x");              //打印地址码

                    SendASC(TAB[a]);

              delayms(5);

                    SendASC(TAB[b]);

                    SendString("rn");        

                                

                    P1=((a*16)+b);    //无显示器则用LED表示出地址码


                    open=0;flag=2;

      }

                        

                                write_1602com(yh);//指定第一行显示

                                write_1602dat('I');

                                write_1602dat('D');

                                write_1602dat(':');

                                write_1602dat('0');

                                write_1602dat('x');

                                write_1602dat(TAB[a]);   

                                write_1602dat(TAB[b]);


                              

                                

                        }                        

}        




void Start()  //开始总线

{

   SDA=1;

   delay();

   SCL=1;

   delay();

   SDA=0;

   delay();

   SCL=0;

   delay();

}



void Stop()  //结束总线

{

   SCL=0;

   delay();

   SDA=0;

   delay();

   SCL=1;

   delay();

   SDA=1;

   delay();

}



bit TestAck()  //测试 ACK

{

           

    bit ErrorBit;

    SDA=1;

    delay();

    SCL=1;

    delay();

    ErrorBit=SDA;

    if(ErrorBit==0){open=1;flag=1;}                        //ErrorBit=0;时代表应答成功

    delay();

    SCL=0;

    delay();

    return(ErrorBit);   

}


void Write8Bit(unsigned char input)//写入 8 个 bit 到 24c02  

{

  unsigned char temp;

   for(temp=8;temp!=0;temp--)  

   {

     SDA=(bit)(input&0x80);

     delay();

     SCL=1;

     delay();

     SCL=0;

     delay();

     input=input<<1;

   }

}



void About()    //查询  

{

     Start();

     Write8Bit(Address_Test);

     TestAck();

           delayms(5);

           Stop();

           delayms(20);

        

}

void keyscan()

{   

                   if(k2==0)

                        {

                          delayms(10);

                          if(!k2)

                          {

                            delayms(10);

                            while(!k2);

                                        key+=1;

                                        if(key>2)

                                        {

                                          key=1;

                                        }

                                        switch(key)

               {

                 case 1:open=2;//关闭光标     

                                          break;

                       case 2:open=1;num=0;count=0;disp=0;

                                                lcd_init();delayms(500);open=2;  //再次按下测试

                                          break;

                           }

                         }

                   }

}                        


        

void main()

{                                 

          lcd_init();

推荐阅读

史海拾趣

康奈特(CNNT)公司的发展小趣事

面对数字化浪潮的冲击,康奈特积极响应并开始了数字化转型之路。公司引进了先进的智能制造设备和技术手段,实现了生产线的自动化和智能化升级。同时,公司还建立了数字化管理平台,实现了对生产、销售、库存等各个环节的实时监控和管理。这种数字化转型不仅提高了生产效率和质量稳定性,也为公司未来的发展奠定了坚实的基础。

American Power Design Inc公司的发展小趣事

在电子行业的早期,American Power Design Inc(简称APDI)由一群热衷于电力电子技术的工程师创立。他们研发出了一种高效的电源管理芯片,显著降低了电子设备的能耗和热量产生。这一创新很快吸引了市场的关注,APDI迅速获得了多家大型电子制造商的合作意向。随着技术的不断完善和市场的扩大,APDI逐渐在电源管理领域建立了领导地位。

Dongguan City Niuhang Electronics Co.LTD公司的发展小趣事

Dongguan City Niuhang Electronics Co.LTD成立于2012年,当时的中国电子行业正处于快速发展期。创始人李小芹凭借对半导体技术的深刻理解和市场需求的敏锐洞察,决定专注于二极管、桥式整流器等产品的研发与封装。公司成立初期,面临着资金短缺、技术储备不足等挑战,但李小芹凭借坚定的信念和不懈的努力,带领团队攻克了一个又一个技术难关,逐步在市场上树立了良好的口碑。

Compact公司的发展小趣事

在电子行业的初期,Compact公司凭借其卓越的技术研发团队,成功开发出了一款具有颠覆性的新型半导体芯片。这款芯片不仅性能卓越,而且成本远低于市场上的同类产品。凭借这一技术创新,Compact公司迅速获得了市场份额,并在行业内建立了良好的声誉。随着技术的不断进步,Compact公司不断推出新产品,巩固了其市场地位。

Arcolectric公司的发展小趣事

Arcolectric公司成立于1932年,作为Elektron PLC Group的一个著名品牌,它从一开始就专注于开关、指示灯及保险丝座的生产。在创立初期,Arcolectric就展现出了对技术的深厚积累和独特见解,成功研发出了一系列高质量、高性能的产品,为公司的长远发展奠定了坚实的基础。

Delkin Devices公司的发展小趣事

为了更好地服务全球客户,Delkin Devices积极拓展海外市场。公司在欧洲设立了办事处,以便更直接地接触欧洲市场并了解当地客户需求。此外,Delkin Devices还通过参加国际展会、建立合作伙伴关系等方式,不断拓展其在全球范围内的影响力。通过这些努力,Delkin Devices成功将产品销往全球多个国家和地区,实现了国际化布局和市场拓展。

问答坊 | AI 解惑

更新运动系统的方法

为了在激烈的竞争中取胜,生产商们必须想方设法制造出比上一代产品或市场上的竞争产品速度更快、体积更小、运行更精确、噪音更小、成本更低的机器。同时,随着机器老化、花费增加和技术进步,运动系统的更新换代也成为必需。无论什么原因,技术变革 ...…

查看全部问答>

130万像素CMOS数码相机的设计

本文介绍了一种130万像素CMOS数码相机的设计原理、基本组成及规格特点,并已有具体实践的结果和产品应用。 …

查看全部问答>

200分求解两个嵌入式问题,我块崩溃了

我的开发板是北京一家公司搞的叫YC2440,和S3C2440差不多 我的电脑主板是昂达N61,没有串口和并口。买了一根USB转串口,一根PCI转并口 调式用的是WIGGER接JTAG,AXD,RO和RW配置应该没问题,但是程序一跑就一直RUNNING IMAGE,这是第一个问题,我 ...…

查看全部问答>

wince 6.0 gprs 拨号 AT 高分求教

用单片机做过GSM/GPRS的打电话、发短信、TCP/IP数据发送,习惯了AT指挥串口操作 忽然到了wince了,迷茫了,明明简简单单的操作串口的事,怎么到windows这儿就整出这么多事来,什么cellcore、什么tapi、什么RIL、什么拨号 牢骚发完,言归正传。首 ...…

查看全部问答>

请问VxWorks下网络上传的文件和直接拷贝的文件有什么不同吗?

我需要在目标机上放置大量的.DAT数据文件以供程序读取运行,将目标机硬盘接到主机上直接将这些文件拷贝到目标机硬盘上,然后恢复目标机即可正常运行,但是将这些文件直接通过网络ftp上传到目标机硬盘上后,却没能正常的读取这些文件。请问这可能是 ...…

查看全部问答>

悄悄地问一个关于GPIO的问题。

如下 代码:            // *** set GPB6 Key lock ****************         sCPUIOP->GPBCON &= ~(3…

查看全部问答>

我面试通知说,会问些VLSI工艺原理,这个科目会包含哪些内容?

我面试通知说,会问些VLSI工艺原理,这个科目会包含哪些内容?…

查看全部问答>

BKP寄存器改不了?

指令:  *(vu16 *) (BKP_BASE + 1) = 0x5a5b;…

查看全部问答>

MSP430的稳定性

         我在学校的项目和课程中接触过freescale的s12x单片机、51单片机和MSP430单片机。当初老师对我们说过,MSP430单片机是低功耗便携式设备的不二之选。但MSP430的稳定性不太好,在强磁场或高压复杂环 ...…

查看全部问答>

求个能用的2812开发板空板

最近申请了ti的样片,但是感觉自己做板子不划算,所以来论坛求块dsp2812开发板的空pcb 希望能外扩sram和flash,除了电源和地之外的引脚全部引出,最好是经过验证的,先谢谢了…

查看全部问答>