中级会员
- 积分
- 440
- 威望
- 282
- 贡献
- 152
- 兑换币
- 0
- 注册时间
- 2010-1-16
- 在线时间
- 3 小时
|
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit scl=P2^1; //24c16 SCL
- sbit sda=P2^0; //24c16 SDA
- void x24c16_init() //24c16初始化子程序
- {
- scl=1;
- sda=1;
- }
- void start() //启动I2C总线
- {
- sda=1;
- scl=1;
- sda=0;
- scl=0;
- }
- void stop() //停止I2C总线
- {
- sda=0;
- scl=1;
- sda=1;
- scl=0;
- }
- void writex(uchar j) //写一个字节
- {
- uchar i,temp;
- temp=j;
- for (i=0;i<8;i++)
- {
- scl=0;
- sda=j&0x80;
- scl=1;
- j<<=1;
- }
- scl=0;
- }
- uchar readx() //读一个字节
- {
- uchar i,x=0;
- scl=0;
- sda=1; //释放sda总线
- for (i=0;i<8;i++)
- {
- scl=1;
- x=x<<1;
- if (sda==1) x=x|0x01;
- //while(1)
- scl=0;
- }
- return(x);
- }
- bit Check_ACK(void) //发送完一个字节后,检验设备的应答信号
- {
- sda=1;
- scl=1;
- if(sda==1){scl=0; return(1);}
- else {scl=0; return 0;}
- }
- void MasterAck() //主机发送应答信号
- {
- sda=1;
- scl=0;
- sda=0;
- scl=1;
- scl=0;
- sda=1;//ACK发送完毕,释放总线
- }
- void x24c16_write(uchar add,uchar x) //写单个字节
- {
- do{
- start();//重起IIC
- writex(0xa0);//先器件寻址并设置为写,写入要读的内部地址
- }while(Check_ACK());//检查应答 =1,表示无确认,再次发送
- writex(add);//2408内部地址
- Check_ACK();
- writex(x);//向寻到的内部地址写数据
- Check_ACK();
- stop();//停止IIC
- }
- uchar x24c16_read(uchar add) //读单个字节
- {
- uchar i;
- do{
- start();//重起IIC
- writex(0xa0);//先器件寻址并设置为写,写入要读的内部地址
- }while(Check_ACK());//检查应答 =1,表示无确认,再次发送
- writex(add);//设置内部地址
- Check_ACK();//检查应答
- do{
- start();//重起总线
- writex(0xa1);//器件寻址并设置为读
- }while(Check_ACK());//检查应答
- i=readx();//读数据
- Check_ACK();
- stop();//停止IIC
- return(i);
- }
- void x24c16_Nread(uchar add,uint n,uchar *buff) //读多个字节
- {
- uchar m;
- do{
- start();//重起IIC
- writex(0xa0);//先器件寻址并设置为写,写入要读的内部地址
- }while(Check_ACK());//检查应答 =1,表示无确认,再次发送
- writex(add);//设置内部地址
- Check_ACK();//检查应答
- do{
- start();//重起总线
- writex(0xa1);//器件寻址并设置为读
- }while(Check_ACK());//检查应答
- for(m=0;m<n;m++)
- {
- buff[m]=readx();//读数据
- if(m!=n-1) MasterAck();//主机发送应答
- }
- stop();//停止IIC
- }
- void x24c16_Nwrite(uchar add,uint n,uchar *buff)//写多个字节
- {
- uint i;
- do{
- start();//重起IIC
- writex(0xa0);//先器件寻址并设置为写,写入要读的内部地址
- }while(Check_ACK());//检查应答 =1,表示无确认,再次发送
- writex(add);//2408内部地址
- Check_ACK();
- for(i=0;i<n;i++)
- {
- writex(buff[i]);//向寻到的内部地址写数据
- Check_ACK();
- }
- stop();//停止IIC
- }
- ////////////////////////////////////////////////////
- void delay (uchar t)
- {
- uchar m;
- for(;t>0;t--)
- for(m=255;m>0;m--)
- ;
- }
- void main ()
- {
- uchar n;
- uchar shuju_in;
- // uchar shuju_out;
- uchar addr=0x00;
- uchar shu[]={1,2,4,8,16,32,64,128};
- uchar a[8];
- shuju_in=0x00;
- if((P3&0x04)==0)
- {
- while(1)
- {
- x24c16_Nread(addr,8,a);
- for(n=0;n<=7;n++)
- {
- P0=a[n];
- delay(255);
- delay(255);
- delay(255);
- delay(255);
- }
- }
- }
- else
- {
- while(1)
- {
- x24c16_Nwrite(addr,8,shu);
- P0=0xfe;
- delay(255);
- delay(255);
- delay(255);
- delay(255);
- }
- }
- }
- /*while(1) //单字节读写
- {
- x24c16_write(addr,shuju_in);
- ;;;
- shuju_out=x24c16_read(addr);
- P1=shuju_out;
- delay(255);
- shuju_in++;
- }*/
- /*while(1) //N字节读写
- {
- x24c16_Nwrite(addr,8,shu);
- ;;;
- x24c16_Nread(addr,8,a);
- for(n=0;n<=7;n++)
- {
- P0=a[n];
- delay(255);
- delay(255);
- }
- }*/
复制代码 有用eeprom的吗?我用51单片机的直接修改一下咋都不行。请高手指点指点。以上是我的51单片机程序。 |
|