欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

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

IIC記憶單片機開機次數

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

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

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

 

程序如下:
//版權所有:單片機網http://www.raoushi.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]={           //數碼管數組定義
0x3f,
0x06,
0x5b,
0x4f,
0x66,
0x6d,
0x7d,
0x07,
0x7f,
0x6f
};
void delayt(void)//數碼管的延時
{
 uint x,y;
 for(x=0;x<5;x++)
 for(y=0;y<120;y++);
}
void delay(void)//IIC的適應延時
{
 _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()//初始化設置
{
 sda=1;
 scl=1;
}
void answer()//應答
{
 uchar i;
 scl=1;
 while((sda==1)&&(i<250))i++;
 scl=0;
 delay();
}
void noanser()//非應答
{
 scl=1;
 delay();
 sda=1;
 delay();
 scl=0; 
 delay();
}
void writebyte(uchar dat)//寫字節
{
 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()//讀字節
{
 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)//寫字節的封裝
{
 init();
 start();
 writebyte(0xae);
 answer();
 writebyte(add);
 answer();
 writebyte(dat);
 answer();
 stop();
}
uchar read_byte(uchar add)//讀字節的封裝
{
 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);//數碼管個位和十們的操作
 k=temp/10;
 j=temp%10;
 temp++;
  write_byte(0x10,temp);
 delay();
 while(1) //數碼管顯示
 {
 P1=number[k];
 P0=0;
 delayt();
 P1=number[j];
 P0=1;
 delayt();
 }
}

關閉窗口

相關文章