您的位置 首页 基础

有用的单片机模仿I2C总线操控EEPROM读写程序

之前写的EEPROM程序虽然能够软仿成功,但烧到单片机里的时候却不能用,无疑是时序的问题,今天修正了时序,总算硬仿成功了。对照上次的程序…

之前写的EEPROM程序尽管能够软仿成功,但烧到单片机里的时分却不能用,无疑是时序的问题,今日批改了时序,总算硬仿成功了。对照前次的程序能够发现便是添加了头函数:,这样就能够经过“_nop_()”指令较为精确的操控时序。

前次那个问题仍然没有解决:便是接纳缓冲区的数据是从readbuf[6]开端的,以这个程序为例:

readbuf[6]中寄存0x96

readbuf[7]中寄存0x84

readbuf[8]中寄存0xd5

readbuf[9]中寄存0x63

readbuf[10]中寄存0x7c

readbuf[11]中寄存0x8c

其实我是想把收到的数据寄存在readbuf[0]~[5]中的,我也不知道为什么成果会这样,有知道的费事指教下。

不多说了,上程序:

#include
#include
#define unit unsigned int
#define uchar unsigned char

uchar num=6;
uchar idata sendbuf[6]={0x96,0x84,0xd5,0x63,0x7c,0x8c};
uchar idata readbuf[6];

sbit scl=P2^0;
sbit sda=P2^1;

start(void) //start
{
sda=1;
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
sda=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
}

stop(void) //stop
{
sda=0;
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
sda=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
}

answer(void) //answer
{
sda=0;
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
}

noanswer(void)//no answer
{
sda=1;
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
}

checkanswer(void) //check answer
{
F0=0;
sda=1;
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
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;
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
temp=temp<<1;
}
checkanswer();
if(F0==1) return;
}

sendnbyte(uchar n) //send n byte
{
uchar idata *ps;
ps=&sendbuf[0];

while(n–)
{
sendabyte(ps);
ps++;
}
stop();
}

readabyte(uchar idata *raddress) //read a byte
{
uchar n=8,temp=0;
while(n–)
{
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
temp=temp<<1;
if(sda==1)
temp=temp|0x01;
else
temp=temp&0xfe;
_nop_();
_nop_();
_nop_();
scl=0;
_nop_();
_nop_();
_nop_();
}
*raddress=temp;
}

readnbyte(uchar n) //read n byte
{
uchar idata *pr;
pr=&readbuf[0];
while(n–)
{
readabyte(pr);
answer();
pr++;
}
noanswer();
stop();
}

main(void) //MAIN
{
start();

sendabyte(0xa0);

sendabyte(0x00);

sendnbyte(num);

/*———————–*/
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();

start();

sendabyte(0xa0);

sendabyte(0x00);

sendabyte(0xa1);

readnbyte(num);

P1=readbuf[11];

while(1);
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/jichu/266654.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部