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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

I2C通信ID自動查找,讀寫器制作 附單片機程序+仿真電路圖

[復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 ksljxxq 于 2020-2-24 14:13 編輯

    I2C通信ID自動查找,在維修時碰到I2C通信要找ID地址也很麻煩,我們常用的比如24Cxx系列,顯示屏通信,一般都是信號SDA與SCL,本主板用的主控芯片是stc15f2k60s2,編碼開關,1602顯示屏,二個按鈕,編碼開關按鈕是移動光標,見下圖24C測試ID 0XA0,TW8816測試ID 0X8A讀寫都正常,在i2c壓縮包是程序和仿真

制作出來的實物圖如下:


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


單片機源程序如下:
  1. #include<reg51.h>      
  2. #include<intrins.h>  
  3. #define uchar unsigned char
  4. #define uint unsigned int //函數聲明
  5. #define yh 0x80    //第1行+3位數顯示
  6. uint yi,ra,si,ra1,si1;
  7. void Init_Timer0(void);
  8. sbit  rs=P1^0;
  9. sbit  rw=P1^1;
  10. sbit  en=P1^2;

  11. sbit k3=P3^4;          //光標  
  12. sbit k1=P3^2;        //讀開關
  13. sbit k2=P3^3;        //檢測地址
  14. sbit CodingsWitch_B=P3^5; //A腳定義(即1腳) 這兩腳必須接10K上拉電阻
  15. sbit CodingsWitch_A=P3^6; //B腳定義(即3腳?

  16. sbit SCL=P2^7;    //24c02  6
  17. sbit SDA=P2^6;          //       5
  18. void delay()
  19. {;;}
  20. void delay1(uint z)//延時為 1ms
  21. {
  22.   uchar x,x1;
  23.   for(;z>0;z--)
  24.   {
  25.    for(x=0;x<114;x++)
  26.     {
  27.     for(x1=0;x1<1;x1++);
  28.     }
  29.    }
  30. }

  31. write_1602com(uchar com)//****液晶寫入指令函數****
  32. {
  33.         rs=0;//數據/指令選擇置為指令
  34.         rw=0;
  35.         P0=com;//送入數據
  36.         delay1(1);
  37.         en=1;//拉高使能端,為制造有效的下降沿做準備
  38.         delay1(1);
  39.         en=0;//en由高變低,產生下降沿,液晶執行命令
  40. }

  41. write_1602dat(uchar dat)//***液晶寫入數據函數****
  42. {
  43.         rs=1;//數據/指令選擇置為數據
  44.         rw=0;
  45.         P0=dat;//送入數據
  46.         delay1(1);
  47.         en=1; //en置高電平,為制造下降沿做準備
  48.         delay1(1);
  49.         en=0; //en由高變低,產生下降沿,液晶執行命令
  50. }


  51. lcd_init()//***液晶初始化函數****
  52. {
  53.         write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據
  54.         write_1602com(0x0c);//開顯示不顯示光標
  55.         write_1602com(0x06);//整屏不移動,光標自動右移
  56.         write_1602com(0x01);//清顯示
  57. }


  58. void dsplay()
  59. {
  60.            if(xianshi==0)
  61.                         {               
  62.                                 unsigned int c, d;
  63.         //          a = (WriteDeviceAddress/256)/16; //    16進制千位
  64.         //    b = (WriteDeviceAddress/256)%16; //          百位
  65.                                 c = (WriteDeviceAddress%256)/16; //           十位
  66.                                 d = (WriteDeviceAddress%256)%16; //           個位
  67.                
  68.                                 write_1602com(yh);//指定顯示
  69.                                 write_1602dat('I'); //
  70.                                 write_1602dat('D'); //
  71.                                 write_1602dat(':'); //
  72.                                 write_1602dat('0'); //
  73.                                 write_1602dat('x'); //
  74.                                 write_1602dat(hex_table[c]);    //
  75.                                 write_1602dat(hex_table[d]);    //
  76.                         }
  77.                         if(xianshi==1)
  78.                         {
  79.                           uchar a,b,c,d,e,f,g,h,a1,b1,c1,d1,e1,f1,g1,h1;
  80.                                 a = (yi%256)/16; //           十位
  81.                                 b = (yi%256)%16; //           個位
  82.                                 c = (ra%256)/16; //           十位
  83.                                 d = (ra%256)%16; //           個位
  84.                                 e = (yi+1%256)/16; //          十位
  85.                                 f = (yi+1%256)%16; //          個位
  86.                                 g = (si%256)/16; //           十位
  87.                                 h = (si%256)%16; //           個位
  88.                                 a1 = (yi+2%256)/16; //           十位
  89.                                 b1 = (yi+2%256)%16; //           個位
  90.                                 c1 = (ra1%256)/16; //           十位
  91.                                 d1 = (ra1%256)%16; //           個位
  92.                                 e1 = (yi+3%256)/16; //          十位
  93.                                 f1 = (yi+3%256)%16; //          個位
  94.                                 g1 = (si1%256)/16; //           十位
  95.                                 h1 = (si1%256)%16; //           個位
  96.                                 write_1602com(yh);//指定顯示
  97.                                 write_1602dat('0');
  98.                                 write_1602dat('x');
  99.                                 write_1602dat(hex_table[a]);    //
  100.                                 write_1602dat(hex_table[b]);    //
  101.                                 write_1602dat(',');
  102.                                 write_1602dat(hex_table[c]);    //
  103.                                 write_1602dat(hex_table[d]);    //
  104.                                 write_1602dat(' ');
  105.                                 write_1602dat('0');
  106.                                 write_1602dat('x');
  107.                                 write_1602dat(hex_table[e]);    //
  108.                                 write_1602dat(hex_table[f]);    //
  109.                                 write_1602dat(',');
  110.                                 write_1602dat(hex_table[g]);    //
  111.                                 write_1602dat(hex_table[h]);    //
  112.                         
  113.                                 write_1602com(er);//指定顯
  114.         write_1602dat('0');
  115.                                 write_1602dat('x');                                
  116.                                 write_1602dat(hex_table[a1]);    //
  117.                                 write_1602dat(hex_table[b1]);    //
  118.                                 write_1602dat(',');
  119.                                 write_1602dat(hex_table[c1]);    //
  120.                                 write_1602dat(hex_table[d1]);    //
  121.                                 write_1602dat(' ');
  122.                                 write_1602dat('0');
  123.                                 write_1602dat('x');
  124.                                 write_1602dat(hex_table[e1]);    //
  125.                                 write_1602dat(hex_table[f1]);    //
  126.                                 write_1602dat(',');
  127.                                 write_1602dat(hex_table[g1]);    //
  128.                                 write_1602dat(hex_table[h1]);    //
  129.                                        
  130.                         }        
  131.       if(xianshi==2)
  132.                         {
  133.                           uchar a,b,c,d,e,f,g,h,a1,b1,c1,d1,e1,f1,g1,h1;
  134.                                 a = (yi%256)/16; //           十位
  135.                                 b = (yi%256)%16; //           個位
  136.                                 c = (ra%256)/16; //           十位
  137.                                 d = (ra%256)%16; //           個位
  138.                                 e = (yi+1%256)/16; //          十位
  139.                                 f = (yi+1%256)%16; //          個位
  140.                                 g = (si%256)/16; //           十位
  141.                                 h = (si%256)%16; //           個位
  142.                                 a1 = (yi+2%256)/16; //           十位
  143.                                 b1 = (yi+2%256)%16; //           個位
  144.                                 c1 = (ra1%256)/16; //           十位
  145.                                 d1 = (ra1%256)%16; //           個位
  146.                                 e1 = (yi+3%256)/16; //          十位
  147.                                 f1 = (yi+3%256)%16; //          個位
  148.                                 g1 = (si1%256)/16; //           十位
  149.                                 h1 = (si1%256)%16; //           個位
  150.                                 write_1602com(yh);//指定顯示
  151.                                 write_1602dat('0');
  152.                                 write_1602dat('x');
  153.                                 write_1602dat(hex_table[a]);    //
  154.                                 write_1602dat(hex_table[b]);    //
  155.                                 write_1602dat(',');
  156.                                 write_1602dat(hex_table[c]);    //
  157.                                 write_1602dat(hex_table[d]);    //
  158.                                 write_1602dat(' ');
  159.                                 write_1602dat('0');
  160.                                 write_1602dat('x');
  161.                                 write_1602dat(hex_table[e]);    //
  162.                                 write_1602dat(hex_table[f]);    //
  163.                                 write_1602dat(',');
  164.                                 write_1602dat(hex_table[g]);    //
  165.                                 write_1602dat(hex_table[h]);    //
  166.                         
  167.                                 write_1602com(er);//指定顯
  168.         write_1602dat('0');
  169.                                 write_1602dat('x');                                
  170.                                 write_1602dat(hex_table[a1]);    //
  171.                                 write_1602dat(hex_table[b1]);    //
  172.                                 write_1602dat(',');
  173.                                 write_1602dat(hex_table[c1]);    //
  174.                                 write_1602dat(hex_table[d1]);    //
  175.                                 write_1602dat(' ');
  176.                                 write_1602dat('0');
  177.                                 write_1602dat('x');
  178.                                 write_1602dat(hex_table[e1]);    //
  179.                                 write_1602dat(hex_table[f1]);    //
  180.                                 write_1602dat(',');
  181.                                 write_1602dat(hex_table[g1]);    //
  182.                                 write_1602dat(hex_table[h1]);    //
  183.                                 
  184.                                 
  185.                         }        

  186. }

  187. void Start()  //開始總線
  188. {
  189.    SDA=1;
  190.    delay();
  191.    SCL=1;
  192.    delay();
  193.    SDA=0;
  194.    delay();
  195.    SCL=0;
  196.    delay();
  197. }


  198. void Stop()  //結束總線
  199. {
  200.    SCL=0;
  201.    delay();
  202.    SDA=0;
  203.    delay();
  204.    SCL=1;
  205.    delay();
  206.    SDA=1;
  207.    delay();
  208. }

  209. void NoAck()  //發 ACK0
  210. {
  211.     SDA=1;
  212.     delay();
  213.     SCL=1;
  214.     delay();
  215.     SCL=0;
  216.     delay();
  217.             
  218. }

  219. bit TestAck()  //測試 ACK
  220. {
  221.     bit ErrorBit;
  222.     SDA=1;
  223.     delay();
  224.     SCL=1;
  225.     delay();
  226.     ErrorBit=SDA;
  227.    
  228.     delay();
  229.     SCL=0;
  230.     delay();
  231.     return(ErrorBit);           
  232. }

  233. Write8Bit(unsigned char input)//寫入 8 個 bit 到 24c02  
  234. {
  235.   unsigned char temp;
  236.    for(temp=8;temp!=0;temp--)  
  237.    {
  238.      SDA=(bit)(input&0x80);
  239.      delay();
  240.      SCL=1;
  241.      delay();
  242.      SCL=0;
  243.      delay();
  244.      input=input<<1;
  245.    }
  246. }

  247. void Write24c02(uchar ch,uchar address)//寫入一個字節到 24c02 中  
  248. {
  249.     Start();
  250.     Write8Bit(WriteDeviceAddress);
  251.     TestAck();
  252.     Write8Bit(address);
  253.     TestAck();
  254.     Write8Bit(ch);
  255.     TestAck();
  256.     Stop();
  257.     delay1(10);
  258. }

  259. //從 24c02 中讀出 8 個 bit
  260. uchar Read8Bit()  
  261. {
  262.    unsigned char temp,rbyte=0;
  263.     for(temp=8;temp!=0;temp--)  
  264.     {
  265.      SCL=1;
  266.      rbyte=rbyte<<1;
  267.      rbyte=rbyte|((unsigned char)(SDA));
  268.      SCL=0;
  269.     }
  270.     return(rbyte);
  271. }

  272. uchar Read24c02(uchar address) //從 24c02 中讀出 1 個字節
  273. {
  274.      uchar ch;
  275.      Start();
  276.      Write8Bit(WriteDeviceAddress);
  277.      TestAck();
  278.      Write8Bit(address);
  279.      TestAck();
  280.      Start();
  281.      Write8Bit(ReadDviceAddress);
  282.      TestAck();
  283.      ch=Read8Bit();
  284.      NoAck();
  285.      Stop();
  286.      return(ch);
  287. }

  288. void xie()
  289. {
  290.            Write24c02(ra,yi);
  291.        delay1(10);
  292.            Write24c02(si,yi+1);
  293.        delay1(10);
  294.            Write24c02(ra1,yi+2);
  295.        delay1(10);
  296.            Write24c02(si1,yi+3);
  297.        delay1(10);
  298.        Stop();
  299. }
  300. void du()
  301. {
  302.            ra=Read24c02(yi);
  303.            delay1(20);
  304.            si=Read24c02(yi+1);
  305.            delay1(20);
  306.            ra1=Read24c02(yi+2);
  307.            delay1(20);
  308.            si1=Read24c02(yi+3);
  309.            delay1(20);
  310.            Stop();  
  311. }

  312. void set()
  313. {
  314.      Start();
  315.      Write8Bit(WriteDeviceAddress);
  316.      TestAck();
  317.            delay1(5);
  318.            Stop();
  319. }
  320. void keyscan()
  321. {
  322.       
  323.                    if(k2==0)
  324.                         {
  325.                           delay1(10);
  326.                           if(!k2)
  327.                           {
  328.                             delay1(10);
  329.                             while(!k2);
  330.                                         key1n+=1;
  331.                                         if(key1n>2)
  332.                                         {
  333.                                           key1n=1;
  334.                                         }
  335.                                         switch(key1n)
  336.                {
  337.                  case 1:open=1;        key3n=0;dsplaysw=0; write_1602com(0x0c);ra=0;si=0;ra1=0;si1=0;//關閉光標     
  338.                                           break;
  339.                        case 2:open=0;num=0;jishu=0; dsplaysw=0;xianshi=0;lcd_init(); key2n=0; key3n=0;   
  340.                                           break;
  341.                            }
  342.                          }
  343.                    }
  344.                 if(k1==0)
  345.                  {
  346.                         delay1(10);
  347.                         if(!k1)
  348.                         {
  349.                          delay1(10);
  350.                          while(!k1);
  351.                                 key2n+=1;
  352.                                         if(key2n>2)
  353.                                         {
  354.                                           key2n=1;
  355.                                         }
  356.                                         switch(key2n)
  357.                {
  358.                  case 1:        du();xianshi=1;key3n=0; dsplaysw=0; write_1602com(0x0c);//關閉光標     
  359.                                           break;
  360.                        case 2:  dsplaysw=1;xianshi=2; write_1602com(yh+5);write_1602com(0x0f);key3n=1;
  361.                                           break;
  362.                             }
  363.                            }
  364.                     }
  365.                  
  366.                 if(key2n==2)
  367.                 {
  368.      if(k3==0)
  369.                  {
  370.                         delay1(50);
  371.                         if(!k3)
  372.                         {
  373.                          delay1(50);
  374.                          while(!k3);
  375.                                 key3n+=1;
  376.                                         if(key3n>5)
  377.                                         {
  378.                                           key3n=1;
  379.                                         }
  380.                                         switch(key3n)
  381.                {
  382.                  case 1:  write_1602com(yh+5);  //設置按鍵按動一次秒位置顯示光標
  383.                                             write_1602com(0x0f);  //設置光標為閃爍                                          
  384.                                           break;
  385.                        case 2:  write_1602com(yh+13);
  386.                     write_1602com(0x0f);  //設置光標為閃爍                                         
  387.                                           break;
  388.                                          case 3:  write_1602com(er+5);
  389.                     write_1602com(0x0f);  //設置光標為閃爍                                         
  390.                                           break;
  391.                                          case 4:  write_1602com(er+13);
  392.                                                   write_1602com(0x0f);  //設置光標為閃爍
  393.                                           break;
  394.                                          case 5:  write_1602com(0x0c);//關閉光標
  395.                                                   xie();
  396.                                                   xianshi=1;key2n=1;key3n=0; dsplaysw=0;
  397.                                           break;
  398.                             }
  399.                            }
  400.                     }
  401.                    }
  402. }

  403. uint CodingsWitchPolling()  
  404. {
  405.     static uchar Aold,Bold; //兩個變量用來儲存上一次調用時編碼開關兩引腳的電平   
  406.         static uchar st=0;       //用來儲存以前是否出現了兩個引腳都為高電平的狀態
  407.         static uint tmp=0;    // ***這3個均為靜態變量,以便保持上次結果***     
  408.         
  409.         if(CodingsWitch_A&&CodingsWitch_B)     
  410.          st = 1;            
  411.          if(st)                 //如果st為1執行下面的步驟      
  412.          {
  413.           if(CodingsWitch_A==0&&CodingsWitch_B==0) //如果兩引腳都為低執行下面         
  414.           {           
  415.             if(Bold)         //為高說明編碼開關在向加大的方向轉            
  416.                  {               
  417.                   st = 0;               
  418.                    if(yi==9999)yi=9999;
  419.        if(ra>255)ra=0;        
  420.                    if(si>255)si=0;
  421.        if(ra1>255)ra1=0;        
  422.                    if(si1>255)si1=0;                          
  423.                           else
  424.         if(key2n==1){yi+=4;du();}                                       
  425.                           if(key3n==1){ra+=1;write_1602com(0x0c);dsplay();write_1602com(yh+5);write_1602com(0x0f);}
  426.         if(key3n==2){si+=1;write_1602com(0x0c);dsplay();write_1602com(yh+13);write_1602com(0x0f);}
  427.         if(key3n==3){ra1+=1;write_1602com(0x0c);dsplay();write_1602com(er+5);write_1602com(0x0f);}
  428.         if(key3n==4){si1+=1;write_1602com(0x0c);dsplay();write_1602com(er+13);write_1602com(0x0f);}                                
  429.                           }            
  430.                          if(Aold)   //為高說明編碼開關在向減小的方向轉            
  431.                           {               
  432.                            st = 0;                                       
  433.                            if(yi==0)yi=0;
  434.          if(ra<0)ra=0;        
  435.                      if(si<0)si=0;
  436.          if(ra1<0)ra1=0;        
  437.                      if(si1<0)si1=0;                                       
  438.                                 else                 
  439.                                  if(key2n==1){yi-=4;du();}     //設返回值
  440.          if(key3n==1){ra-=1;write_1602com(0x0c);dsplay();write_1602com(yh+5);write_1602com(0x0f);}
  441.          if(key3n==2){si-=1;write_1602com(0x0c);dsplay();write_1602com(yh+13);write_1602com(0x0f);}
  442.          if(key3n==3){ra1-=1;write_1602com(0x0c);dsplay();write_1602com(er+5);write_1602com(0x0f);}
  443.          if(key3n==4){si1-=1;write_1602com(0x0c);dsplay();write_1602com(er+13);write_1602com(0x0f);}                                         
  444.                                 }               
  445.                          }
  446.                   
  447.                  }
  448.                        
  449.             Aold = CodingsWitch_A;  //保持這次檢測的電平,以備下次調用比較用      
  450.            Bold = CodingsWitch_B;      //     
  451.           return tmp;               //返回計數值  
  452.         }

  453.         
  454. void main()
  455. {                                 
  456.           lcd_init();
  457.     Init_Timer0();
  458.   while(1)
  459. {
  460.          keyscan();
  461.    if(dsplaysw==0){dsplay();}         
  462.    }        
  463. }

  464. void Init_Timer0(void)
  465. {
  466.          TMOD=0x01;
  467.          ET0=1;           //定時器中斷打開
  468.          TR0=1;           //定時器開關打開
  469.          ET1=1;           //定時器中斷打開
  470.          TR1=1;           //定時器開關打?
  471.          EA=1;            //總中斷打開
  472. }
  473. void Timer0_isr(void) interrupt 1
  474. {

  475.          TH0=(65536-50000)/256;                  //重新賦值 2ms  62500
  476.          TL0=(65536-50000)%256;
  477.         
  478.           if(open==1)
  479.           {
  480.              num++;
  481.                  if(num==3)
  482.                  {
  483.                     num=0;
  484.                     jishu++;
  485.                           set();
  486.                          if(jishu>255)
  487.                   {
  488.                      jishu=255;        
  489.                     }
  490.                   }
  491.                   
  492.           }
  493.                
  494.         
  495.    }  
  496.          
  497.         void Timer1_isr(void) interrupt 3   
  498.         {
  499.           TH1=0xec;
  500.     TL1=0xec;
  501.     CodingsWitchPolling(); //調用編碼開關函數
  502.                
  503.         }
復制代碼

所有資料51hei提供下載:
i2c測地址.rar (87.22 KB, 下載次數: 36)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:275111 發表于 2020-4-1 10:03 | 只看該作者
好帖子。雖然剛剛開始看還沒懂。正在學習I2C。還請高人多寫。謝謝。
回復

使用道具 舉報

板凳
ID:295423 發表于 2024-2-7 14:24 | 只看該作者
好帖子。雖然剛剛開始看還沒懂。正在學習I2C。還請高人多寫。謝謝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久免费精品 | 中文字幕第一页在线 | 日韩国产一区二区三区 | 欧美亚洲国产一区 | 国产黄色大片网站 | 亚洲精品在线看 | 精品综合在线 | 中文字幕亚洲精品 | 一区二区三区国产精品 | 91在线观看| 国产成人精品一区二区三区网站观看 | 拍拍无遮挡人做人爱视频免费观看 | 99精品在线 | 精品国产乱码久久久久久a丨 | 欧美精品在线免费观看 | 台湾佬成人网 | 成人精品一区二区户外勾搭野战 | 国产精品福利在线 | 爱爱小视频 | 国产日韩久久 | 黄色av网站在线免费观看 | 二区中文字幕 | av天天爽 | 日韩一区二区在线视频 | 日韩网站免费观看 | 午夜在线免费观看 | 天堂av中文在线 | 日韩成人一区二区 | 久久久精品综合 | 毛片网络| 最新黄色在线观看 | 一区二区三区精品在线视频 | 中文字幕一区二区三区在线观看 | 国产女人与拘做受免费视频 | 亚洲日韩中文字幕一区 | 国产精品高潮呻吟久久 | 久久久av | 欧洲一级毛片 | 欧美在线观看一区 | 国产成人精品免高潮在线观看 | 日韩精品av一区二区三区 |