导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→24C01-16程序,能读写:24C01、24C02、24C

* 70012: C51编程:请问谁有24c04的程序.p2.1(sDA)P2.0(SCL).用P1口来显示出来.???请大侠帮忙:_))

   mdizi 
mdizi发表的帖子 

 24C01-16程序,能读写:24C01、24C02、24C04、24C08、24C16[原创]
/**************************************************
    伟维电子单片机工作室
  
    Copyright 2009 mdizi McuStudi    
   All rights Reserved
作者:周洵名  QQ:491069539  13528913615


本程序在以下型号的单片机学习板上调试完成:
 
型号:TL-SST89E、TL-AT89S51、TL-SST89H、TL-SST89A、TL-STC89C、TL-Min51

AT89S52 晶振频率为11.0592MHz   指令周期:1.0852us

功能说明:24C01-16程序,能读写:24C01、24C02、24C04、24C08、24C16
读出的数据 送 P1 口显示
;***************************************************************/
#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint  unsigned int
 
sbit sda=P3^7;//;模拟I2C 数据传送位
sbit scl=P3^6;//;模拟I2C 时钟控制状态标志

void  delay1(uint z)//延时为 1ms

 uchar x,x1;
 for(;z>  0;z--)
 {
   for(x=0;x  <114;x++)
   {
    for(x1=0;x1  <1;x1++);
   }
 }

void delay()//5us延时
{
 _nop_();
 _nop_();
 _nop_();
}

void star()//开始
{
 sda=1;
    delay();//5us延时
 scl=1;
    delay();//5us延时
 sda=0;
 delay();//5us延时
 
}

void stop()//停止
{
 sda=0;
 delay();//5us延时
 scl=1;
 delay();//5us延时
 sda=1;
 delay();//5us延时
 
}

void ack()//应答
{ uchar z=0;
 while((sda==1)&&(z  <50))z++;//条件判断, sda=1,则没有应答。如果没有应答则延时:z  <50,z++;后返回
    scl=0;
 delay();//5us延时
}

///写一个数据函数
//器件写地址 slave_write_address
//字节地址 byte_address
//待写入数据 data_data
void write(uchar slave_write_address,uchar byte_address,uchar data_data)//写一个数据
{
 uchar temp,temp1,i,ii;

 star();//开始

 for(ii=0;ii  <3;ii++)//根据 24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,数据
 { 
  if(ii==0)
  {
   temp=slave_write_address;//送 器件写地址
   temp1=slave_write_address;
  }
  else if(ii==1)
  {
   temp=byte_address;//送 字节地址
   temp1=byte_address;
  }
  else if(ii==2)
  {
   temp=data_data;//送 数据
   temp1=data_data;
  }


           for(i=0;i  <8;i++)
   {
    scl=0;
    delay();//5us延时
    temp=temp1;
    temp=temp&0x80;// 相 与 后,把不相关的位清零

    if(temp==0x80)//根据前面 相 与 后,判断 temp是否等于0x80,是则该位为 1
   
     sda=1;    
    else
     sda=0;
    
     delay();//5us延时
     scl=1;
     delay();//5us延时
     scl=0;
     delay();//5us延时
     temp1=temp1  <  <1;//向左移出1位
   
   }
   sda=1;
   delay();//5us延时
   scl=1;
   delay();//5us延时
   ack();
 }
 stop();//停止
}

///读一个数据函数
//器件写地址 slave_write_address
//器件读地址 slave_read_address
//字节地址 byte_address
//读出的数据 data_data

read(uchar slave_write_address,uchar byte_address,uchar slave_read_address)//读一个数据
{
  uchar temp,temp1,i,ii,x,data_data;

 star();//开始

 for(ii=0;ii  <3;ii++)//根据 24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,器件读地址
 { 
  if(ii==0)
  {
   temp=slave_write_address;//送 器件写地址
   temp1=slave_write_address;
  }
  else if(ii==1)
  {
   temp=byte_address;//送 字节地址
   temp1=byte_address;
  }
  else if(ii==2)
  {   
   star();//开始

   temp=slave_read_address;//送 器件读地址
   temp1=slave_read_address;
  }

           for(i=0;i  <8;i++)//开始读数据
   {
    scl=0;
    delay();//5us延时
    temp=temp1;
    temp=temp&0x80;// 相 与 后,把不相关的位清零

    if(temp==0x80)//根据前面 相 与 后,判断 temp是否等于0x80,是则该位为 1
   
     sda=1;    
    else
     sda=0;
    
     delay();//5us延时
     scl=1;
     delay();//5us延时
     scl=0;
     delay();//5us延时
     temp1=temp1  <  <1;//向左移出1位
   }
   sda=1;
   delay();//5us延时
   scl=1;
   delay();//5us延时
   ack();//应答
 }

 for(x=0;x  <8;x++)
 {
  data_data=data_data  <  <1;//向左移入1位

  sda=1;
  delay();//5us延时
  scl=0;
  delay();//5us延时
  scl=1;
  delay();//5us延时

  if(sda==1)//判断 数据线是否是高电平
  data_data|=0x01;//把读到的数据 或 0X01 
  //else  
     //data_data|=0x00;
 }
    ack();//应答
 stop();//停止
 return data_data;//返回读到的数据

}

void main()

 write(0xa0,0xff,0x66);//向器件写一个数据:(0xa0 是器件写地址;0xff 是字节地址;0x66 是待写入的数据)

 delay1(5);//写与读的时间间隔应大于5ms,取决于器件 24C02的响应速度

//向器件读一个数据
//把读出的数据送 P1口显示
 P1=read(0xa0,0xff,0xa1);//向器件读一个数据:(0xa0 是器件写地址;0xff 是字节地址;0xa1 是器件读地址)

 while(1);//跳转,相当于汇编指令 JUMP $
}

//0x66==亮 灭 灭 亮 亮 灭 灭 亮



发表时间:2009年5月24日9:07:13

  
回复该帖

本主题共有 2 帖,分页:>>>>>该主题的所有内容[2]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:欢迎加入我们的技术交流群(侯工单片机工作室)嵌入式及单片机项目开发,单片机培训,ARM技术培训,QQ
[下一篇帖子]:优龙FS2410开发板转让 便宜卖优龙FS2410开发板转让 便宜卖