查看: 1417|回复: 0
打印 上一主题 下一主题

设置产品的使用次数单字节读写

[复制链接]
跳转到指定楼层
沙发
发表于 2015-4-20 16:33:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/********************************************************************
                            汇诚科技
网址:http://www.ourhc.cn
产品有售淘宝店:http://shop36330473.taobao.com   
*********************************************************************/
#include <reg52.H>

/****************************************************************************
                                        24C08 读写驱动程序        开始
*****************************************************************************/
#include<reg52.h>
#include<string.h>
          #include<intrins.h>
      #define DELAY_TIME 60 /*经实验,不要小于50!否则可能造成时序混乱*/
      #define TRUE 1
      #define FALSE 0
      sbit SCL=P3^3;/*串行时钟*/
      sbit SDA=P3^4;/*串行数据*/
          char mybyte;        /*单字节*/
          sbit P2_0=P2^0;/*按键控制数据重载*/
          /********** Function Definition  函数定义 ************/
      void DELAY(unsigned int t) /*延时函数*/
      {
        while(t!=0)
          t--;
      }
      void I2C_Start(void)
      {
        /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
        SDA=1;
        SCL=1;
        DELAY(DELAY_TIME);
        SDA=0;
        DELAY(DELAY_TIME);
        SCL=0;
        DELAY(DELAY_TIME);
      }
     void I2C_Stop(void)
     {
       /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
       SDA=0;
       SCL=1;
       DELAY(DELAY_TIME);
       SDA=1;
       DELAY(DELAY_TIME);
       SCL=0;
       DELAY(DELAY_TIME);
     }
     void SEND_0(void) /* SEND ACK */
     {
       /*发送0,在SCL为高电平时使SDA信号为低*/
       SDA=0;
       SCL=1;
       DELAY(DELAY_TIME);
       SCL=0;
       DELAY(DELAY_TIME);
     }
    void SEND_1(void)
    {
      /*发送1,在SCL为高电平时使SDA信号为高*/
      SDA=1;
      SCL=1;
      DELAY(DELAY_TIME);
      SCL=0;
      DELAY(DELAY_TIME);
    }
    bit Check_AcknowLEDge(void)
    {
      /*发送完一个字节后检验设备的应答信号*/
      SDA=1;
      SCL=1;
      DELAY(DELAY_TIME/2);
      F0=SDA;
      DELAY(DELAY_TIME/2);
      SCL=0;
      DELAY(DELAY_TIME);
      if(F0==1)
        return FALSE;
      return TRUE;
    }
        void WriteI2CByte(char b)reentrant
        {
          /*向I2C总线写一个字节*/
          char i;
          for(i=0;i<8;i++)
            if((b<<i)&0x80)
              SEND_1();
            else
              SEND_0();
        }

        char ReadI2CByte(void)reentrant
        {
          /*从I2C总线读一个字节*/
          char b=0,i;
          for(i=0;i<8;i++)
          {
            SDA=1;  /*释放总线*/
            SCL=1;  /*接受数据*/
            DELAY(10);
            F0=SDA;
            DELAY(10);
            SCL=0;
            if(F0==1)
                       {
              b=b<<1;
              b=b|0x01;
            }
          else
            b=b<<1;
        }
        return b;
      }

    /**********以下为读写24c02的函数**********/
    void Write_One_Byte(char addr,char thedata)
    {
        bit acktemp=1;
        /*write a byte to mem*/
        I2C_Start();
        WriteI2CByte(0xa0);
        acktemp=Check_AcknowLEDge();
        WriteI2CByte(addr);/*address*/
        acktemp=Check_AcknowLEDge();
        WriteI2CByte(thedata);/*thedata*/
        acktemp=Check_AcknowLEDge();
        I2C_Stop();
    }
  void Write_A_Page(char *buffer,char addr)
  {
      bit acktemp=1;
      bit wrtmp;
      int i;
      /*write a page to at24c02*/
      I2C_Start();
      WriteI2CByte(0xa0);
      acktemp=Check_AcknowLEDge();
      WriteI2CByte(addr);/*address*/
      acktemp=Check_AcknowLEDge();
      for(i=0;i<7;i++)
      {
        WriteI2CByte(buffer);
        if(!Check_AcknowLEDge())
          {
            I2C_Stop();
          }
       }

      I2C_Stop();


  }
  char Read_One_Byte(char addr)
  {     bit acktemp=1;
        char mydata;
       /*read a byte from mem*/
        I2C_Start();
        WriteI2CByte(0xa0);
        acktemp=Check_AcknowLEDge();
        WriteI2CByte(addr);/*address*/
        acktemp=Check_AcknowLEDge();
        I2C_Start();
        WriteI2CByte(0xa1);
        acktemp=Check_AcknowLEDge();

        mydata=ReadI2CByte();
        acktemp=Check_AcknowLEDge();
        return mydata;
        I2C_Stop();
  }
  void Read_N_Bytes(char *buffer,char n,char addr)
  {
      bit acktemp=1;
      int i=0;
       /*read 8 bytes from mem*/
      I2C_Start();
      WriteI2CByte(0xa0);
      acktemp=Check_AcknowLEDge();
      WriteI2CByte(addr);/*address*/
      acktemp=Check_AcknowLEDge();
      I2C_Start();
      WriteI2CByte(0xa1);
      acktemp=Check_AcknowLEDge();


      for(i=0;i<n;i++)
      {
          buffer=ReadI2CByte();
          if(i!=n-1)
            SEND_0();  /*发送应答*/
          else
            SEND_1();  /*发送非应答*/
      }
   I2C_Stop();
   }

  void main()
  {
       // int i;

       // char myarray[8];
        //char myarray2[8];
       // char rdarray[16];
      mybyte=Read_One_Byte(0x20); //从地址0x20中读取保存值
          mybyte--;  
          if(P2_0==0)mybyte=10; //如果P2.0口按下,数据自动重载   
       // for(i=0;i<8;i++)
       // {
       //   myarray=i;
       //   myarray2=i+0x08;   
      //  }
        Write_One_Byte(0x20,mybyte);//将mybyte对应值写入地址0x20中
       // Write_A_Page(myarray,0x10);
      //  Write_A_Page(myarray2,0x18);

       // Read_N_Bytes(rdarray,16,0x10);
        while(1)
{
if(mybyte>=1)P2=0XAA;         //显示结果
}

  }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入中科因仑

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表