日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]   在之前我講過I2C協(xié)議,也給出了簡單例子,這次利用I2C協(xié)議,我們可以做一個小實驗,讓單片機記錄單片機開機次數(shù),也就是機器使用次數(shù)?! ?/ 內(nèi)容:每次開機都將次數(shù)加1 并存儲到EEPROM。這樣就能

 

  在之前我講過I2C協(xié)議,也給出了簡單例子,這次利用I2C協(xié)議,我們可以做一個小實驗,讓單片機記錄單片機開機次數(shù),也就是機器使用次數(shù)。

  // 內(nèi)容:每次開機都將次數(shù)加1 并存儲到EEPROM。這樣就能直觀的看到機器的使用 //

  // 次數(shù)用P1口LED做為顯示,次數(shù)大于256是將溢出,按復(fù)位模擬開機 //

  // 或者直接通過開關(guān)開機 //

 

  #include //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義

  #include //包含NOP空指令函數(shù)_nop_();

  #define AddWr 0xae //寫數(shù)據(jù)地址,需要參考24c02芯片文檔

  #define AddRd 0xaf //讀數(shù)據(jù)地址

  sbit Sda=P1^2; //定義總線連接端口

  sbit Scl=P1^1;

  sbit WP=P1^0; //寫保護,這里不使用

  /*------------------------------------------------

  延時程序

  ------------------------------------------------*/

  void mDelay(unsigned char j)

  {

  unsigned int i;

  for(;j>0;j--)

  {

  for(i=0;i<125;i++)

  {;}

  }

  }

  /*------------------------------------------------

  啟動IIC總線

  ------------------------------------------------*/

  void Start(void)

  {

  Sda=1;

  _nop_();_nop_();

  Scl=1;

  _nop_();_nop_();_nop_();_nop_();_nop_();

  Sda=0;

  _nop_();_nop_();_nop_();_nop_();_nop_();

  Scl=0;

  }

  /*------------------------------------------------

  停止IIC總線

  ------------------------------------------------*/

  void Stop(void)

  {

  Sda=0;

  _nop_();

  Scl=1;

  _nop_();_nop_();_nop_();_nop_();_nop_();

  Sda=1;

  _nop_();_nop_();_nop_();_nop_();_nop_();

  Scl=0;

  }

  /*------------------------------------------------

  應(yīng)答IIC總線

  ------------------------------------------------*/

  void Ack(void)

  {

  Sda=0;

  _nop_();_nop_();_nop_();

  Scl=1;

  _nop_();_nop_();_nop_();_nop_();_nop_();

  Scl=0;

  _nop_();_nop_();

  }

  /*------------------------------------------------

  非應(yīng)答IIC總線

  ------------------------------------------------*/

  void NoAck(void)

  {

  Sda=1;

  _nop_();_nop_();_nop_();

  Scl=1;

  _nop_();_nop_();_nop_();_nop_();_nop_();

  Scl=0;

  _nop_();_nop_();

  }

  /*------------------------------------------------

  發(fā)送一個字節(jié)

  ------------------------------------------------*/

  void Send(unsigned char Data)

  {

  unsigned char BitCounter=8;

  unsigned char temp;

  do

  {

  temp=Data;

  Scl=0;

  _nop_();_nop_();_nop_();_nop_();_nop_();

  if((temp&0x80)==0x80)

  Sda=1;

  else

  Sda=0;

  Scl=1;

  temp=Data<<1;

  Data=temp;

  BitCounter--;

  }

  while(BitCounter);

  Scl=0;

  }

  /*------------------------------------------------

  讀入一個字節(jié)并返回

  ------------------------------------------------*/

  unsigned char Read(void)

  {

  unsigned char temp=0;

  unsigned char temp1=0;

  unsigned char BitCounter=8;

  Sda=1;

  do

  {

  Scl=0;

  _nop_();_nop_();_nop_();_nop_();_nop_();

  Scl=1;

  _nop_();_nop_();_nop_();_nop_();_nop_();

  if(Sda)

  temp=temp|0x01;

  else

  temp=temp&0xfe;

  if(BitCounter-1)

  {

  temp1=temp<<1;

  temp=temp1;

  }

  BitCounter--;

  }

  while(BitCounter);

  return(temp);

  }

  /*------------------------------------------------

  寫入數(shù)據(jù)

  ------------------------------------------------*/

  void WrToROM(unsigned char Data[],unsigned char Address,unsigned char Num)

  {

  unsigned char i;

  unsigned char *PData;

  PData=Data;

  for(i=0;i

  {

  Start();

  Send(AddWr); //寫入芯片地址

  Ack();

  Send(Address+i);//寫入存儲地址

  Ack();

  Send(*(PData+i));//寫數(shù)據(jù)

  Ack();

  Stop();

  mDelay(20);

  }

  }

  /*------------------------------------------------

  讀出數(shù)據(jù)

  ------------------------------------------------*/

  void RdFromROM(unsigned char Data[],unsigned char Address,unsigned char Num)

  {

  unsigned char i;

  unsigned char *PData;

  PData=Data;

  for(i=0;i

  {

  Start(); //寫入芯片地址

  Send(AddWr);

  Ack();

  Send(Address+i);//寫入存儲地址

  Ack();

  Start();

  Send(AddRd); //讀入地址

  Ack();

  *(PData+i)=Read();//讀數(shù)據(jù)

  Scl=0;

  NoAck();

  Stop();

  }

  }

  //以上程序是EEPROM24C02程序部分,IIC協(xié)議Scl=0;

  /*------------------------------------------------

  主程序

 

------------------------------------------------*/

//下載程序后,記錄下LED2~LED9的狀態(tài),然后按下復(fù)位鍵(相當于開機),觀察LED2~LED9的狀態(tài)改變

void main()

 

{

unsigned char Number[1];

unsigned char i;

WP=0;//寫保護關(guān)掉

RdFromROM(Number,0,1);//調(diào)用存儲數(shù)據(jù) 從地址0開始寫一個數(shù)據(jù)

Number[0]++;

WrToROM(Number,0,1);//寫入24c02

P1 = ~ Number[0];//在P1口上顯示 反向顯示 LED亮代表1

while(1)

{

}

}

//用戶可以自己把程序移植到數(shù)碼管顯示或者液晶顯示 ,可以直觀的看到數(shù)字 ,也可以定義int類型 用于計數(shù)萬次以上

 

 

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉