历史上的今天
今天是: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();
史海拾趣
|
我的开发板是北京一家公司搞的叫YC2440,和S3C2440差不多 我的电脑主板是昂达N61,没有串口和并口。买了一根USB转串口,一根PCI转并口 调式用的是WIGGER接JTAG,AXD,RO和RW配置应该没问题,但是程序一跑就一直RUNNING IMAGE,这是第一个问题,我 ...… 查看全部问答> |
|
用单片机做过GSM/GPRS的打电话、发短信、TCP/IP数据发送,习惯了AT指挥串口操作 忽然到了wince了,迷茫了,明明简简单单的操作串口的事,怎么到windows这儿就整出这么多事来,什么cellcore、什么tapi、什么RIL、什么拨号 牢骚发完,言归正传。首 ...… 查看全部问答> |
|
请问VxWorks下网络上传的文件和直接拷贝的文件有什么不同吗? 我需要在目标机上放置大量的.DAT数据文件以供程序读取运行,将目标机硬盘接到主机上直接将这些文件拷贝到目标机硬盘上,然后恢复目标机即可正常运行,但是将这些文件直接通过网络ftp上传到目标机硬盘上后,却没能正常的读取这些文件。请问这可能是 ...… 查看全部问答> |
|
我在学校的项目和课程中接触过freescale的s12x单片机、51单片机和MSP430单片机。当初老师对我们说过,MSP430单片机是低功耗便携式设备的不二之选。但MSP430的稳定性不太好,在强磁场或高压复杂环 ...… 查看全部问答> |
|
最近申请了ti的样片,但是感觉自己做板子不划算,所以来论坛求块dsp2812开发板的空pcb 希望能外扩sram和flash,除了电源和地之外的引脚全部引出,最好是经过验证的,先谢谢了… 查看全部问答> |




