导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→C51编程:I2C问题[zhkeming]

 *第7605篇: C51编程:I2C问题

  
楼 主:zhkeming 2003年1月12日17:36
 C51编程:I2C问题
我是一个单片机爱好者,现在编制单片机C语言模拟I2C碰到一个问题,
在两次写一个数据字节,需要很长的延时才正确,是否能提供全套的子程序,
我用的是AT89C2051,11M晶振,PCF8583,AT24LC256,AD7416.
VOID ACK(VOID)
VOID WAIT(VOID)
VOID NOTACK(VOID)
VOID START(VOID)
VOID STOP(VOID)
VOID SENDBYTE(UNSIGNED CHAR XBYTE)
UNSIGNED CHAR INTPUTBYTE(VOID)
VOID WRITEBYTE(UNSIGNED CHAR COUNT,UNDIGNED INT ADDR,UNSIGNED CHAR DATA_BYTE)
UNSIGNED CHAR READBYTE(UNSIGNED CHAR COUNT,UNDIGNED INT ADDR)
VOID WRITEWORD(UNSIGNED CHAR COUNT,UNDIGNED INT ADDR,UNSIGNED INT DATA_WORD)
UNSIGNED INT READWORD(UNSIGNED CHAR COUNT,UNDIGNED INT ADDR)
等等..
在     WRITEWORD(COUNT,ADDR,DATA_WORD)
       .....     
       WRITEWORD(COUNT,ADDR,DATA_WORD)
之间  需要大约200毫秒的延时才能正常写,请问何故?
  
2楼:a12345678 2003年1月12日21:28
 C51编程:I2C问题
莱鸟一个!!......
  
3楼:dirty 2003年1月18日22:38
 你不是菜鸟
你不是菜鸟,你告诉人家不好吗。
我从INTEL公司站点下载了一个很不错的文档, 文档的名字是《How to Implement I2C 
Serial Communication Using Intel MCS-51 Microcontrollers》是dpf文件只可惜我忘了它
的FTP网站地址,请自己找一找。 
  
4楼:tm1300 2003年1月20日10:57
 呵呵
人家是爱好者,并没有说自己是…:)
  
5楼:tm1300 2003年1月20日10:45
 是的
其实单片机对外的读写操作,一般I2C总线都要有激发,响应,退出的过程;不同的外围器
件对I2C总线的占用时间是有所不同的。可以参考器件的时序图。
  
6楼:@123 2003年1月30日11:48
 是ee的烧入时间
是ee的烧入时间,没办法的.
  
7楼:Kuang-chingTsui 2003年2月12日11:55
 给你一个
#define uchar unsigned char
#define uint unsigned int
#include <reg51.h>
sbit scl=P0^0;  //24c02 SCL
sbit sda=P0^1;  //24c02 SDA
sbit DOG=P0^7;  //狗
uchar x24c02_read(uchar address);  //从24c02的地址address中读取一个字节数据
void x24c02_write(uchar address,uchar info);  //向24c02的address地址中写入一字节
数据info
void x24c02_init();   //24c02初始化子程序
void delay1(uchar x);
void flash();
void x24c01_init();
void start();
void stop();
void writex(uchar j);
uchar readx();
void clock();
void delay1(uchar x)
{
   uint i;
   for(i=0;i<x;i++);
   DOG=~DOG;
}
void flash()
{
   uchar u;
   DOG=~DOG;
}
void x24c02_init()
{
   scl=1; flash(); sda=1; flash();
}
void start()
{
   sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();
}
void stop()
{
   sda=0; flash(); scl=1; flash(); sda=1; flash();
}
void writex(uchar j)
{
   uchar i,temp;
   temp=j;
   for (i=0;i<8;i++){
      temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; flash();
   }
   scl=0; flash(); sda=1; flash();
}
uchar readx()
{
   uchar i,j,k=0;
   scl=0; flash(); sda=1;
   for (i=0;i<8;i++){
      flash(); scl=1; flash();
      if (sda==1) j=1;
      else j=0;
      k=(k<<1)|j; scl=0;
   }
   flash(); return(k);
}
void clock()
{
   uchar i=0;
   scl=1; flash();
   while ((sda==1)&&(i<255))i++;
   scl=0; flash();
}
uchar x24c02_read(uchar address)
{
   uchar i;
   start(); writex(0xa0);
   clock(); writex(address);
   clock(); start();
   writex(0xa1); clock();
   i=readx(); stop();
   delay1(10);
   return(i);
}
void x24c02_write(uchar address,uchar info)
{
   EA=0;
   start(); writex(0xa0);
   clock(); writex(address);
   clock(); writex(info);
   clock(); stop();
   EA=1;
   delay1(50);
}

>>>>>>对该主题发表你的看法

本主题贴数7,分页: [第1页]


[上一篇主题]:硬件:请问有什么EEPORM可以替换27c128吗?

[下一篇主题]:日本富士通,有其他单片机手册就很