久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3658|回復: 2
打印 上一主題 下一主題
收起左側

I2C協議器件地址碼查詢 附源程序與Proteus仿真

[復制鏈接]
跳轉到指定樓層
樓主
還在為找不到I2C設備的地址而煩惱??

別慌,我帶著代碼走來了

按下按鍵,開始從0x01開始測試器件地址,一直到0xff結束。

查詢到正確地址后,蜂鳴器叫2聲,串口打印地址碼,不再繼續查詢。

地址碼輸出至P1,在沒有顯示屏和不方便使用串口監視的情況下可通過LED狀態讀出地址。

初始版本沒有增加地址碼驗證(驗證的話就是用這個地址去讀寫數據顯示出來就行)

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include<intrins.h>  
  2. #include<uart.h>  
  3. #include<stdio.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int //函數聲明
  6.         
  7. #define yh 0x80    //第1行+3位數顯示
  8. #define er 0x80+0x40

  9. #define Address_Test count  //定義器件在 IIC 總線中的地址
  10. #define Read_Address count+1
  11. unsigned char TAB[16] ={'0', '1', '2', '3', '4', '5', '6', '7','8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

  12. uint open,count,num,disp;
  13. uchar key,flag,temp;

  14. sbit  RS=P3^5;
  15. sbit  RW=P3^6;
  16. sbit  E=P3^4;

  17. sbit k2=P3^2;        //檢測地址

  18. sbit SCL=P2^6;    //時鐘
  19. sbit SDA=P2^7;          //數據

  20. sbit beep=P2^3;    //蜂鳴提示



  21. void write_1602com(uchar com)//****液晶寫入指令函數****
  22. {
  23.         RS=0;//數據/指令選擇置為指令
  24.         RW=0;
  25.         P0=com;//送入數據
  26.         delayms(1);
  27.         E=1;//拉高使能端,為制造有效的下降沿做準備
  28.         delayms(1);
  29.         E=0;//en由高變低,產生下降沿,液晶執行命令
  30. }

  31. void write_1602dat(uchar dat)//***液晶寫入數據函數****
  32. {
  33.         RS=1;//數據/指令選擇置為數據
  34.         RW=0;
  35.         P0=dat;//送入數據
  36.         delayms(1);
  37.         E=1; //en置高電平,為制造下降沿做準備
  38.         delayms(1);
  39.         E=0; //en由高變低,產生下降沿,液晶執行命令
  40. }


  41. void lcd_init()//***液晶初始化函數****
  42. {
  43.         write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據
  44.         write_1602com(0x0c);//開顯示不顯示光標
  45.         write_1602com(0x06);//整屏不移動,光標自動右移
  46.         write_1602com(0x01);//清顯示
  47. }



  48. void dsplay()
  49. {
  50.            if(disp==0)
  51.                         {        
  52.                                  uint a,b;   //地址數據緩存
  53.                                 
  54.                                 a = (Address_Test%256)/16; //           十位
  55.                                 b = (Address_Test%256)%16; //           個位
  56.         
  57.                                 if(open==1&&flag==1)        
  58.       {        
  59.         SendString("ID:0x");              //打印地址碼
  60.                     SendASC(TAB[a]);
  61.               delayms(5);
  62.                     SendASC(TAB[b]);
  63.                     SendString("\r\n");        
  64.                                 
  65.                     P1=((a*16)+b);    //無顯示器則用LED表示出地址碼

  66.                     open=0;flag=2;
  67.       }
  68.                         
  69.                                 write_1602com(yh);//指定第一行顯示
  70.                                 write_1602dat('I');
  71.                                 write_1602dat('D');
  72.                                 write_1602dat(':');
  73.                                 write_1602dat('0');
  74.                                 write_1602dat('x');
  75.                                 write_1602dat(TAB[a]);   
  76.                                 write_1602dat(TAB[b]);

  77.                               
  78.                                 
  79.                         }                        
  80. }        



  81. void Start()  //開始總線
  82. {
  83.    SDA=1;
  84.    delay();
  85.    SCL=1;
  86.    delay();
  87.    SDA=0;
  88.    delay();
  89.    SCL=0;
  90.    delay();
  91. }


  92. void Stop()  //結束總線
  93. {
  94.    SCL=0;
  95.    delay();
  96.    SDA=0;
  97.    delay();
  98.    SCL=1;
  99.    delay();
  100.    SDA=1;
  101.    delay();
  102. }


  103. bit TestAck()  //測試 ACK
  104. {
  105.            
  106.     bit ErrorBit;
  107.     SDA=1;
  108.     delay();
  109.     SCL=1;
  110.     delay();
  111.     ErrorBit=SDA;
  112.     if(ErrorBit==0){open=1;flag=1;}                        //ErrorBit=0;時代表應答成功
  113.     delay();
  114.     SCL=0;
  115.     delay();
  116.     return(ErrorBit);   
  117. }

  118. void Write8Bit(unsigned char input)//寫入 8 個 bit 到 24c02  
  119. {
  120.   unsigned char temp;
  121.    for(temp=8;temp!=0;temp--)  
  122.    {
  123.      SDA=(bit)(input&0x80);
  124.      delay();
  125.      SCL=1;
  126.      delay();
  127.      SCL=0;
  128.      delay();
  129.      input=input<<1;
  130.    }
  131. }


  132. void About()    //查詢  
  133. {
  134.      Start();
  135.      Write8Bit(Address_Test);
  136.      TestAck();
  137.            delayms(5);
  138.            Stop();
  139.            delayms(20);
  140.         
  141. }
  142. void keyscan()
  143. {   
  144.                    if(k2==0)
  145.                         {
  146.                           delayms(10);
  147.                           if(!k2)
  148.                           {
  149.                             delayms(10);
  150.                             while(!k2);
  151.                                         key+=1;
  152.                                         if(key>2)
  153.                                         {
  154.                                           key=1;
  155.                                         }
  156.                                         switch(key)
  157.                {
  158.                  case 1:open=2;//關閉光標     
  159.                                           break;
  160.                        case 2:open=1;num=0;count=0;disp=0;
  161.                                                 lcd_init();delayms(500);open=2;  //再次按下測試
  162.                                           break;
  163.                            }
  164.                          }
  165.                    }
  166. }                        

  167.         
  168. void main()
  169. {                                 
  170.           lcd_init();
  171.     Uart_init();
  172.         
  173.     while(1)
  174.    {
  175.           keyscan();
  176.     dsplay();
  177.           if(flag==2){beep=0; delayms(1500);beep=1;delayms(500);beep=0; delayms(1500);beep=1;flag=0;}
  178.                
  179.                
  180.    }        
  181. }


  182. void Timer0_isr(void) interrupt 1
  183. {
  184.   
  185.          TH0=(65536-50000)/256;                  //重新賦值 2ms  62500
  186.          TL0=(65536-50000)%256;
  187.         
  188.           if(open==2)
  189.           {
  190.              num++;
  191.                  if(num==3)
  192.                  {
  193.                     num=0;
  194.                     count++;
  195.                           About();
  196.                          if(count>255) count=255;        
  197.                   }
  198.                   
  199.           }

  200.    }

  201.          
  202.         //  通訊中斷接收程序   中斷函數無返回值
  203.   void uart_rx(void)  interrupt 4   
  204. {
  205.         unsigned char dat;
  206.     if(RI)                         //是否接收中斷
  207.     {
  208.      RI=0;
  209.            dat = SBUF;
  210.           }

  211. }

  212.          
復制代碼


所有資料51hei提供下載:
I2C地址查詢.zip (94.15 KB, 下載次數: 28)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:293363 發表于 2020-9-14 19:49 | 只看該作者
我的帖子沉了嗎
回復

使用道具 舉報

板凳
ID:78901 發表于 2020-9-14 23:38 | 只看該作者
不錯,驗證一下
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲成人网在线观看 | 一级黄色日本片 | 日韩精品在线观看视频 | 91精品国产色综合久久 | 欧美另类视频 | 国产成人精品一区二区三区网站观看 | 久精品久久 | 久久久久久免费免费 | 欧美 日韩 中文 | 国产一区二区三区四区五区加勒比 | 一区二区三区四区在线免费观看 | 亚洲精品久久久久久首妖 | 成人在线视频网址 | 99热99| 午夜三级在线观看 | 91精品久久久久久久久久入口 | 中文字幕一区二区三区乱码在线 | 日韩精品一区在线观看 | 欧美久久久电影 | av片网站| av影音在线 | 精品一区二区久久 | 亚洲视频中文字幕 | 国产精品视频一二三区 | 亚洲国产精品久久久久秋霞不卡 | 亚洲a视频 | 国产午夜在线 | 欧美精品网站 | 成人精品久久 | 免费高潮视频95在线观看网站 | 日韩美女一区二区三区在线观看 | 91精品久久久久久久久久入口 | 成人亚洲精品 | 亚洲精品九九 | 国产精品日产欧美久久久久 | 午夜精品一区二区三区在线视频 | 成人毛片视频免费 | 成人黄色网址大全 | 国产高清精品一区 | 久草.com | 二区在线视频 |