单片机模拟I2C总线读写EEPROM(24CXX)程序二
电路不变,下面是仿真电路,只不过P2口的数码管由观测程序执行到哪一步改为查看接收缓冲区的数据。
程序如下:
#include
#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。
单片机模拟I2C总线读写EEPRO 相关文章:
- 单片机模拟I2C总线读写EEPROM(24CXX)程序一(11-11)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)