I2C协议的code--51的

//废话不多说,上代码;
//注释的部分出现乱码,请改成ANSI编码

#include<reg51.h>
#include<intrins.h>
#define NOP4() _nop_(),_nop_(),_nop_(),_nop_()
typedef unsigned char u8;
sbit SCL=P1^0;     
sbit SDA=P1^1;

u8 code DATA[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};     //CA段码

void Delay(int x)    //延时
{
	u8 t;
	while(x--)	for(t=120;t>0;t--);
}
void I2cinit()  //I2C的初始化
{
	SDA = 1,NOP4();SCL = 1,NOP4();
}

void Start()    //I2C启动
{
 	SDA=1;SCL=1;NOP4();SDA=0;NOP4();SCL=0;
}

void Stop()    //I2C停止
{
 	SDA=0;SCL=0;NOP4();SCL=1;NOP4();SDA=1;
}

void RACK()      //应答
{
 	SDA=1;NOP4();SCL=1;NOP4();SCL=0;
}

void NO_ACK()    //不应答
{
 	SDA=1;SCL=1;NOP4();SCL=0;SDA=0;
}

void Write_A_Byte(u8 b)     //写一个字节
{
#if  1
	u8 i;
	for(i=0;i<8;i++)
	{
	 	b<<=1;SDA=CY;_nop_();SCL=1;NOP4();SCL=0;
	}
#else	
	//不使用溢出标志位Y的写法

	u8 i;
	for(i=0;i<8;i++,b<<=1)     //从高位开始写
	{
		SDA = b & 0x80 == 0x00 ?0:1;
		//if(b&0x80)   //最高位数据是否位0
		//	SDA=1;
	  	//else
		  //	SDA=0;
	SCL=1;NOP4();SCL=0;
	}
#endif

	RACK();   //Ó¦´ð
}

u8 Receive_A_Byte()     //接收一个字节的数据
{
 	u8 i,d;
	for(i=0;i<8;i++)
	{
	 	SCL=1;d<<=1;d|=SDA;SCL=0;
	}
	return d;
}

void Write_add_dat(u8 add,u8 dat)    //在对应的地址写数据
{
 	Start();
	Write_A_Byte(0xa0);      A0,A1,A2接地,AT24C02芯片地址为1010,送控制字为1010A2A1A0R/~W
	Write_A_Byte(add);       //写地址
	Write_A_Byte(dat);       //写数据
	Stop();
	Delay(10);
}

u8 Read_addr(u8 addr){  //读对应地址的数据
	u8 d;
 	Start();
	Write_A_Byte(0xa0);     //写设备地址 A0,A1,A2接地,AT24C02芯片地址为1010,送控制字为1010A2A1A0R/~W
	Write_A_Byte(addr);     //写对应的内存地址
	Stop();
	//写读指令
	Start();
	Write_A_Byte(0xa1);      //写设备读的命令
	d=Receive_A_Byte();      //接收读的数据
	NO_ACK();     //不应答
	Stop();
	return d;
}
long pow(int a,int b){    //Ö»½ÓÊÕÕýÖµ
	long y=1;
	if(b!=0)	while(b--)	y*=a;
	return y;
}
void dis_8(long x){     //P0ÊǶÎÂë P1ÊÇλÂë
	u8 i,a[8];
	u8 b=0x80;
	for(i=0;i<8;i++)	a[i]=x/pow(10,i)%10;    //¸öλ~¸ßλ
	for(i=0;i<8;i++)	P0=0xff,P2=_cror_(b,i),P0=DATA[a[i]],Delay(1);
}
void main(){
	u8 dat=0;
	I2cinit();    //先把总线拉高,防止后面的不方便使用
	Write_add_dat(0,12);      //在地址0写入12
	Write_add_dat(1,13);			//在地址1写入13
	dat=Read_add(0)+Read_add(1);    //读出这两个数据的值并相加
	Write_add_dat(2,dat+2);   //地址2写上dat+2
	while(1)	dis_8(Random_Read(2));      //数码显示
}

现象:代码和想象的现象一样
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值