专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

IIC记忆单片机开机次数

作者:李俊轩   来源:本站原创   点击数:  更新时间:2013年07月18日   【字体:

   IIC具有记忆功能,其实之前没有体会好为什么会记忆,因为编的程序是让灯闪烁的,所以理解不出它可以所谓记忆的原理,今天通过数码管让其记忆单片机开机次数,终于明天了它的真正原理,其实是单片机控制它的时候,程序不断运行,把程序运行得到的数据不断地写入IIC寄存器中,而寄存器是掉电后不数据不会丢失的,所以当我们把程序关了,也就是掉电了以后数据被保存了下来,下次再开机运行的时候,程序是从头开始的,但是地址是从我们上次我们寄存器储存地址开始的,所以就达到了记忆的功能。这个的应用在数据的存储和保护是很大的,比如交通灯记忆违章车辆,账户储存,数据累积等可以靠它进行储存。

下面是IIC记忆单片机开机次数的效果和程序:

 

程序如下:
//版权所有:单片机网http://www.51hei.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();
 }
}

关闭窗口

相关文章