找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3753|回复: 0
打印 上一主题 下一主题
收起左侧

单片机模拟I2C总线读写EEPROM(24CXX)程序-页写和连续读的操作

[复制链接]
跳转到指定楼层
楼主
ID:104835 发表于 2016-2-2 03:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
昨天实现了字节的读写操作(前一篇程序一:http://www.51hei.com/bbs/dpj-43298-1.html),今天实现了页写和连续读的操作。
电路不变,下面是仿真电路,只不过P2口的数码管由观测程序执行到哪一步改为查看接收缓冲区的数据。
程序如下:
#include <reg51.h>
#define unit unsigned int
#define uchar unsigned char
uchar num=4;
uchar idata sendbuf[4]={0x96,0x84,0xd5,0x63};
uchar idata recivebuf[4];
sbit scl=P0^0;         
sbit sda=P0^1;
sbit led0=P2^0;
sbit led1=P2^1;
sbit led2=P2^2;
sbit led3=P2^3;
sbit led4=P2^4;
sbit led5=P2^5;
sbit led6=P2^6;
sbit led7=P2^7;

delay(void)               //delay
{
  int i;
  for(i=0;i<1;i++);
}
start(void)            //start
{
  sda=1;
  scl=1;
  delay();
  sda=0;
  delay();
  scl=0;
}
stop(void)         //stop
{
  sda=0;
  scl=1;
  delay();
  sda=1;
  delay();
  scl=0;
}
answer(void)        //answer
{
  sda=1;
  scl=1;
  delay();
  sda=0;
  scl=0;
}
noanswer(void)     //no answer
{
  sda=1;
  scl=1;
  delay();
  sda=1;
  scl=0;
}
checkanswer(void)       //check answer
{
  sda=1;
  scl=1;
  F0=0;
  if(sda==1) F0=1;
  scl=0;
}
sendabyte(uchar idata *saddress)        //send a byte
{
  uchar n=8,temp=*saddress;
  while(n--)
  {
    if((temp&0x80)==0x80) sda=1;
else sda=0;
   delay();
   scl=1;
   delay();
   scl=0;
temp=temp<<1;
  }
  checkanswer();
  if(F0==1) return;
}
reciveabyte(uchar idata *raddress)         //recive a byte
{
  uchar n=8,temp;
  while(n--)
  {        
   scl=1;
temp=temp<<1;
if(sda==1)
   temp=temp|0x01;
else
   temp=temp&0xfe;
scl=0;
  }
  *raddress=temp;
}
sendnbyte(uchar n)                     //send n byte
{
  uchar idata *ps;
  ps=&sendbuf[0];
  while(n--)
  {
   sendabyte(ps);
ps++;
  }
  stop();
}
recivenbyte(uchar n)                 //recive n byte
{
  uchar idata *pr;
  pr=&recivebuf[0];
  while(n--)
  {
    reciveabyte(pr);
answer();
pr++;
  }
  noanswer();
  stop();
}
main(void)                       //MAIN
{
start();
sendabyte(0xa0);
sendabyte(0x00);
sendnbyte(num);
/*-----------------------*/
start();
sendabyte(0xa1);
recivenbyte(num);
P2=recivebuf[7];
}
程序说明:
程序开始的num定义了传送数据的个数,以及发送缓冲区和接收缓冲区。
主函数的操作一目了然,不多介绍。
存在的问题:这段程序中我定义了接收缓冲区的数据是4个,也的确接收到了4个数据。但接收到的数据确是从recivebuf[4]开始的,像本例中,recivebuf[4]中存放0X96,recivebuf[5]中存放0X84,recivebuf[6]中存放0XD5,recivebuf[7]中存放0X63。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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