專注電子技術(shù)學習與研究
當前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

IIC記憶單片機開機次數(shù)

作者:李俊軒   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2013年07月18日   【字體:

   IIC具有記憶功能,其實之前沒有體會好為什么會記憶,因為編的程序是讓燈閃爍的,所以理解不出它可以所謂記憶的原理,今天通過數(shù)碼管讓其記憶單片機開機次數(shù),終于明天了它的真正原理,其實是單片機控制它的時候,程序不斷運行,把程序運行得到的數(shù)據(jù)不斷地寫入IIC寄存器中,而寄存器是掉電后不數(shù)據(jù)不會丟失的,所以當我們把程序關(guān)了,也就是掉電了以后數(shù)據(jù)被保存了下來,下次再開機運行的時候,程序是從頭開始的,但是地址是從我們上次我們寄存器儲存地址開始的,所以就達到了記憶的功能。這個的應(yīng)用在數(shù)據(jù)的存儲和保護是很大的,比如交通燈記憶違章車輛,賬戶儲存,數(shù)據(jù)累積等可以靠它進行儲存。

下面是IIC記憶單片機開機次數(shù)的效果和程序:

 

程序如下:
//版權(quán)所有:單片機網(wǎng)http://www.torrancerestoration.com
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char//宏定義
#define uint unsigned int
sbit scl=P2^0;  //這兩個位定義是控制IIC的引腳      
sbit sda=P2^1;
uchar number[10]={           //數(shù)碼管數(shù)組定義
0x3f,
0x06,
0x5b,
0x4f,
0x66,
0x6d,
0x7d,
0x07,
0x7f,
0x6f
};
void delayt(void)//數(shù)碼管的延時
{
 uint x,y;
 for(x=0;x<5;x++)
 for(y=0;y<120;y++);
}
void delay(void)//IIC的適應(yīng)延時
{
 _nop_();_nop_();_nop_();_nop_();
 _nop_();_nop_();_nop_();_nop_();
}
void start()//開始
{
 sda=1;
 delay();
 scl=1;
 delay();
 sda=0;
 delay(); 
}
void stop()//停止
{
 sda=0;
 delay();
 scl=1;
 delay();
 sda=1;
 delay();
}
void init()//初始化設(shè)置
{
 sda=1;
 scl=1;
}
void answer()//應(yīng)答
{
 uchar i;
 scl=1;
 while((sda==1)&&(i<250))i++;
 scl=0;
 delay();
}
void noanser()//非應(yīng)答
{
 scl=1;
 delay();
 sda=1;
 delay();
 scl=0; 
 delay();
}
void writebyte(uchar dat)//寫字節(jié)
{
 uchar i;
 scl=0;
 delay();
 for(i=0;i<8;i++)
 {
  if(dat&0x80)
  {
  sda=1;
  }
  else
  {
  sda=0;
  }
  dat=dat<<1;
  delay();
  scl=1;
  delay();
  scl=0;
  delay();
 }
 sda=1;
 
}

uchar readbyte()//讀字節(jié)
{
 uchar i,dat;
 scl=0;
 delay();
 sda=1;
 delay();
 for(i=0;i<8;i++)
 {
 scl=1;
 delay();
 dat=dat<<1;
 if(sda)
 {
 dat++;
 }
 scl=0;
 delay();
 }
 return dat;
}


void write_byte(uchar add,uchar dat)//寫字節(jié)的封裝
{
 init();
 start();
 writebyte(0xae);
 answer();
 writebyte(add);
 answer();
 writebyte(dat);
 answer();
 stop();
}
uchar read_byte(uchar add)//讀字節(jié)的封裝
{
 uchar value;
 init();
 start();
 writebyte(0xae);
 answer();
 writebyte(add);
 answer();
 start();
 writebyte(0xaf);
 answer();
 value=readbyte();
 noanser();
 stop();
 return value;
}
void main()
{
 
 
 uchar temp,k,j;

 temp=read_byte(0x10);//數(shù)碼管個位和十們的操作
 k=temp/10;
 j=temp%10;
 temp++;
  write_byte(0x10,temp);
 delay();
 while(1) //數(shù)碼管顯示
 {
 P1=number[k];
 P0=0;
 delayt();
 P1=number[j];
 P0=1;
 delayt();
 }
}

關(guān)閉窗口

相關(guān)文章