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

AT24C02开机记忆

作者:佚名   来源:本站原创   点击数:  更新时间:2011年08月06日   【字体:
//************************************
   /*
     程序功能:记忆开机的次数,并显示在数码管上
   */
//************************************

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code num[]={0x80,0xed,0x42,0x48,0x2c,0x18,0x10,0xcc,0x00,0x08};
//****管脚定义****
sbit scl=P0^3;//艾方西的数据线
sbit sda=P0^4;//艾方西的时钟线

sbit rck=P2^0;
sbit sck=P2^1;
sbit  si=P2^2; //数码管的串行数据输入端

sbit key1=P1^0;
//====函数的声明=====
void delayus();//微秒级延时函数
void delayms();//毫秒级延时函数
void start();//起始函数
void stop();//终止函数
void ack();//应答函数
void noack();//非应答函数
void write_byte(uchar date);//写字节函数
uchar read_byte();//读字节函数
void xie(uchar add,uchar date);//写操作函数
uchar du(uchar add);//读操作函数
void write_595(uchar date);//数码管
void smg_595(uint j,uint i);
//************************************  
void delayus()
 {
   ; ; ;
 }
/*void delayms(uint time)
 {
    uint i,j;
    for(i=time;i>0;i--)
     for(j=110;j>0;j--);
 } */
void start()
 {
   sda=1;
   delayus();
   scl=1;//时钟线在高电平期间,数据线由高到底的跳变表示起始
   delayus();
   sda=0;
   delayus();
 }
void stop()
 {
   sda=0;
   delayus();
   scl=1; //时钟线在高电平期间,数据线由底到高的跳变表示终止
   delayus();
   sda=1;
   delayus();
 }
void ack()
 {
   uint i=0;
   scl=1;
   if((sda==1)&(i<250))i++;
   scl=0;
   delayus();
 }
void noack()
 {
    sda=1;
    delayus();
    scl=0;
    delayus();
    scl=1;
    delayus();
    scl=0;
 }
void write_byte(uchar date)
 {
   uint i;
   scl=0;
   for(i=0;i<8;i++)
     {
        if(date&0x80)
      {
           sda=1;
      }
         else
      {
           sda=0;
      }
        scl=1;
        date=date<<1;
        delayus();
        scl=0;
        sda=1;
        delayus();
     }
    sda=1;
    delayus();
 }
uchar read_byte()
 {
   uint i;
   uchar date=0x00;
   sda=1;
   delayus();
   scl=0;
   delayus();
   for(i=0;i<8;i++)
    { 
      scl=1;
      delayus();
      date=date<<1;
      if(sda)
        {
          date++;
     }
       
       scl=0;
       delayus();
    }
    
    return date;
 }
void xie(uchar add,uchar date)
 {
   start();
   write_byte(0xa0);
   ack();
   write_byte(add);
   ack();
   write_byte(date);
   ack();
   stop();
 }
uchar du(uchar add)
 {
   uchar k;
   start();
   write_byte(0xa0);
   ack();
   write_byte(add);
   ack();

   start();
   write_byte(0xa1);
   ack();
   k=read_byte();
   noack();
   stop();
   return k;
 }
void chushihua()
 {
   sda=1;
   scl=1;
 }
void main()
 {
   uchar k=0;
   k=du(7);
   k=k%10;
   smg_595(k,k);
   k++;
   xie(7,k);
   while(1);
 }
void smg_595(uint j,uint i)
 {
      write_595(num[i]);
      write_595(num[j]);
      rck=0;  
      rck=1;
 }
void write_595(uchar date)
 {
   uint i;
   for(i=0;i<8;i++)
    {
       date>>=1;
       sck=0;
       si=CY;
       sck=1;
    }
 }



关闭窗口

相关文章