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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3820|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

I2C的程序不能實現(xiàn)???

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:59217 發(fā)表于 2014-2-22 21:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
哪位大神知道為什么嗎?我的程序在理論沒錯誤啊!怎么實現(xiàn)不了它的功能???

# include <reg52.h>
# include "intrins.h"
//# include "I2C_driver.h"

#define  AT24C02 0xa0  //AT24C02 地址

sbit    LS138A=P2^2;          //譯碼器端
sbit    LS138B=P2^3;
sbit    LS138C=P2^4;

sbit    K1 = P1^0;         //保存
sbit    K2 = P1^1;         //讀取
sbit    K3 = P1^2;         //+數(shù)據(jù)
sbit    K4 = P1^3;   //-數(shù)據(jù)

unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};

unsigned char Count1;
unsigned long D[17], LedOut[4];
unsigned int idata USEC;

typedef unsigned int uint;
typedef unsigned char uchar;

sbit SCL = P2^1;
sbit SDA = P2^0;

bit ack;         //應(yīng)答;1發(fā)送正常

/*                    4us延時                   */
void delay()
{
        _nop_();        _nop_();
        _nop_();           _nop_();
        _nop_();    _nop_();
}

  /*               I2C啟動信號                   */
void I2C_Start()
{
        SDA = 1;
        _nop_();
        SCL = 1;          //在SCL高電平的期間,SDA高到低
        delay();
        _nop_();
        SDA = 0;
        delay();
        SCL=0;       /*鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) */
    _nop_();
    _nop_();
}

  /*               I2C終止信號                   */
void I2C_Stop()
{
        SDA = 0;
        _nop_();
        SCL = 1;          //在SCL高電平的期間,SDA高到低
        delay();
        SDA = 1;
        delay();
        SCL = 0;
        _nop_();
}

/*          i2C   應(yīng)答函數(shù)                    */
void I2C_ack(bit a)
{
        if(a == 0) SDA = 0;
        else SDA = 1;
        delay();       
        SCL = 1;
        delay();
        SCL = 0;            /*清時鐘線,鉗住I2C總線以便繼續(xù)接收*/
        _nop_();
}


/*               I2C寫一字節(jié)數(shù)據(jù)                  */
void I2C_writebyte(uchar datum)
{
         uchar i;
         for(i=0; i<8; i++)
         {
                if(i<<datum&0x80)  SDA = 1;
                else SDA = 0;
                _nop_();
                SCL = 1;           /*置時鐘線為高,通知被控器開始接收數(shù)據(jù)位*/
                delay();
                SCL = 0;
         }                                                 //一幀的數(shù)據(jù)傳輸完畢,開始應(yīng)答
        SDA = 1;                                     /*8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位*/
        delay();
        SCL = 1;
        delay();
        if(SDA ==1)        ack = 0;          //fei應(yīng)答
        else ack = 1;
        SCL = 0;
        delay();
}

/*               I2C讀一字節(jié)數(shù)據(jù)                  */
uchar I2C_readbyte()
{
         uchar datum, i;
         datum = 0;
         SDA = 1;                                            /*置數(shù)據(jù)線為輸入方式*/
         for(i=0; i<8; i++)
         {
                 SCL = 0;                               /*置時鐘線為低,準(zhǔn)備接收數(shù)據(jù)位*/
                delay();
                SCL = 1;                                                        /*置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效*/
                delay();
                datum <<= 1;
                if(SDA == 1)  
                        datum |= 0x01;
                _nop_();
                _nop_();       
         }                                                                  
        SCL = 0;
        delay();

        return datum;
}


/*    I2C寫入多個字節(jié)的數(shù)據(jù)    */
bit I2Cwritenbyte(uchar SLA, uchar SUBA, uchar *datum, uchar n)
{
        uchar i;
        I2C_Start();
        I2C_writebyte(SLA);
        if(ack == 0)   return 0;

        I2C_writebyte(SUBA);
        if(ack == 0)   return 0;

        for(i=0; i<n; i++)
        {
                I2C_writebyte(*datum);
                if(ack == 0)   return 0;         //程序員自己設(shè)定是否繼續(xù)
                datum++;       
        }
        I2C_Stop();

        return 1;
}

/*    I2C讀入多個字節(jié)的數(shù)據(jù)    */
bit I2Creadnbyte(uchar SLA, uchar SUBA, uchar *datum, uchar n)
{
        uchar i;

        I2C_Start();
        I2C_writebyte(SLA);                            /*發(fā)送器件地址*/
        if(ack == 0)   return 0;

        I2C_writebyte(SUBA);                   /*發(fā)送器件子地址*/
        if(ack == 0)   return 0;

        I2C_Start();                                          /*重新啟動總線*/
        I2C_writebyte(SLA+1);           //發(fā)送器件寫地址
        if(ack == 0)   return 0;

        for(i=0; i<n-1; i++)
        {
                *datum = I2C_readbyte();
                I2C_ack(0);
                datum++;       
        }
        *datum = I2C_readbyte();
        I2C_ack(1);                   /*發(fā)送非應(yīng)位*/
    I2C_Stop();                   /*結(jié)束總線*/

    return(1);
}

void system_init()
{
        TMOD|= 0x11;
    TH1 = 0xfe; //11.0592
        TL1 = 0x33;
        TR1  = 1;
    IE =0x8A;

}

void Delay(unsigned int i)
{
    char j;
    for(i; i > 0; i--)
        for(j = 200; j > 0; j--);
}

void display(uchar count)
{
        uchar LedNumVal,i;
         /********以下將2402中保存的數(shù)據(jù)送到LED數(shù)碼管顯示*************/
      LedNumVal=count;
          LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
      LedOut[1]=Disp_Tab[LedNumVal%1000/100];
      LedOut[2]=Disp_Tab[LedNumVal%100/10]|0x80;
      LedOut[3]=Disp_Tab[LedNumVal%10];
                 
          for(i=0; i<4; i++)
          {               
               
            P0 =  LedOut[i];
                  
                switch(i)                                          
         {            
                        case 0:LS138A=0; LS138B=0; LS138C=0; break;         
            case 1:LS138A=1; LS138B=0; LS138C=0; break;                    
            case 2:LS138A=0; LS138B=1; LS138C=0; break;
            case 3:LS138A=1; LS138B=1; LS138C=0; break;
                        case 4:LS138A=0; LS138B=0; LS138C=1; break;
         }                 
                Delay(100);
          }
}
void main()
{
        unsigned char i;
        unsigned char pDat[8];

   system_init();

   while(1)
   {
                 //========================IIC 讀取
        if(K2 == 0)           //第二個按鈕讀取數(shù)據(jù)
        {
           I2Creadnbyte(AT24C02, 0 , &pDat[0], 8);
          for (i=0; i<4; i++)         
          {
                D[14+i]=pDat[i*2+0]+pDat[i*2+1]*0x100;
                Count1 = D[14];
           }             
         }

           //========================IIC 保存
           if(K1 == 0)    //第一個按鈕保存數(shù)據(jù)
           {
              D[14]= Count1;
                 for (i=0; i<4; i++)
             {
                   pDat[i*2+0]=D[14+i];                  //D[14]是長字節(jié)的無符號型的數(shù)據(jù)
                   pDat[i*2+1]=D[14+i]>>8;           //pDat[]是8位的數(shù)據(jù),所以要進行轉(zhuǎn)換防止數(shù)據(jù)丟失
                 }
             I2Cwritenbyte(AT24C02, 0 , &pDat[0], 8);  
                  D[14] = 0;
       }   
           display(Count1);
   }
}

void T1zd(void) interrupt 3   //3 為定時器1的中斷號  1 定時器0的中斷號 0 外部中斷1 2 外部中斷2  4 串口中斷
{
         TH1 = 0xfe; //12M       
         TL1 = 0x33;

   if(USEC++==200)
   {        USEC=0;
         
    if (!K3) Count1++;     //改變數(shù)據(jù)
    if (!K4&Count1!=0) Count1--;
    }  
}

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

使用道具 舉報

沙發(fā)
ID:64910 發(fā)表于 2014-8-10 09:07 | 只看該作者
沒看懂
回復(fù)

使用道具 舉報

板凳
ID:65341 發(fā)表于 2014-9-18 11:20 | 只看該作者
額  地址你搞錯了  寫是0xa0,讀是0xa1。  R/W位有區(qū)別的親~~~~~~
回復(fù)

使用道具 舉報

地板
ID:65341 發(fā)表于 2014-9-18 11:41 | 只看該作者
對于I2C的EEPROM器件,D7-D4是1010  后面D3-D1是地址    最后一位是R/W
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品久久久久久一区二区 | 精品不卡 | 在线播放中文字幕 | www.欧美.com| 日韩毛片中文字幕 | 久久久久久久久久性 | 成人超碰 | 欧美成人一区二区三区片免费 | 毛片区| 国产精品一区二区在线 | 999精品视频 | 激情 婷婷 | 免费观看av| 三级特黄特色视频 | 天堂视频中文在线 | 国产精品视频网站 | 亚洲视频一区在线观看 | 欧美一区二区三区久久精品 | 在线免费国产视频 | 99tv成人影院 | 伊久在线| 黄a免费网络 | 日韩一级| 毛色毛片免费看 | 国产精品国产三级国产aⅴ原创 | 伊人伊人网 | h视频免费在线观看 | 免费看色 | 北条麻妃99精品青青久久主播 | 亚洲一区二区三区在线视频 | 成人免费观看男女羞羞视频 | 瑞克和莫蒂第五季在线观看 | 午夜色婷婷 | 一级a性色生活片久久毛片波多野 | 欧美1区2区 | 国产精品国产精品国产专区不卡 | 色欧美综合 | 久久亚洲免费 | 亚洲人在线播放 | 九色av| 国产成人精品一区二区三区 |