模拟IIC通信(没有用应答)

#include<reg52.h>
#include <INTRINS.H>
typedef unsigned char uint8;
typedef unsigned int  uint16;
sbit SCL = P3^7;
sbit SDA = P3^6;


void delay()
{
	_nop_();
	_nop_();
	_nop_();
	_nop_();//用_nop_()需要用INTRINS.H
}
void IIC_init()
{
  SDA=1;
  SCL=1;
}

void IIC_start()
{
  SCL=0;
  delay();
  SDA=1;
  delay();
  SCL=1;
  delay();
  SDA=0;
  delay();
  SCL=0;
  delay();
}

void IIC_stop()
{
  SCL=0;
  delay();
  SDA=0;
  delay();
  SCL=1;
  delay();
  SDA=1;
  delay();
}

void IIC_send(uint8 byte)
{
  uint8 mask,i,j;
  mask=0x80;
  for(i=0;i<8;i++)
  {
    SCL=0;
	delay();
	if((mask&&byte)==0)
    	 SDA=0;
	 else 
	     SDA=1;
	delay();
	mask>>=1;
	SCL=1;
	delay();
  }
  SCL=0;
  delay();
  SDA=1;
  delay();
  SCL=1;
  delay();
  j=SDA;
  SCL=0;
  delay();
}

uint8 IIC_read()
{
  uint8 byte,i;
  byte=0;
  for(i=0;i<8;i++)
  {
     SCL=0;
     delay();
	 SDA=1;
	 delay();
	 SCL=1;
	 delay();
	 if(SDA==1)
	 {
	   byte|=0x01;
	 }
	 byte<<=1;
  }
  SCL=0;
  delay();
  SDA=1;
  delay();
  SCL=1;
  delay();;
  SCL=0;
  delay();
  return byte;
}

void write(uint8 addr,uint8 datebyte)
{  
  IIC_start();
  IIC_send(0xa0);
  IIC_send(addr);
  IIC_send(datebyte);
  IIC_stop();
}

uint8 read(uint8 addr)
{  
  uint8 datebyte;
  IIC_start();
  IIC_send(0xa0);
  IIC_send(addr);
  IIC_start();
  IIC_send(0xa1);
  datebyte=IIC_read();
  IIC_stop();
  return datebyte;
}
void UART_init(void)
{
	SCON = 0x50;
	TMOD = 0x20;
	TH1  = 0xFD;
	TL1  = 0xFD;
	TR1  = 1;
//	ES   = 1;
//	EA   = 1;
}
void UART_send_byte(uint8 dat)
{
	SBUF = dat;
	while(!TI);
	TI = 0;
}
main()
{
	uint8 addr = 0x00, databyte = 0x11;
	uint8 c = 0;
	uint16 i;
	
	UART_init();
	IIC_init();
	while(1)
	{
		write(addr, databyte);
		for(i = 0; i < 1000; i++)
		{
			delay();
		}
		c = read(addr);
		UART_send_byte(c);
		addr++;   //地址往下加
		databyte++;
		if(addr == 0xff) {addr = 0;}
		if(databyte == 0xff) {databyte = 0;}
		for(i = 0; i < 1000; i++)
		{
			delay();
		}
	 }

		
}


代码不理解的欢迎留言

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值