我是靠谱客的博主 单纯小虾米,最近开发中收集的这篇文章主要介绍IIC程序,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

/*=============iic头文件=============*/
#ifndef _IIC_H_
#define _IIC_H_
 
#define ERR 0
#define SUCC 1
 
void iic_start();
void iic_stop();
void iic_send_byte(unsigned char byte);
unsigned char  iic_rev_byte();
void iic_ack();
void iic_noack();
 
#endif


#include "iic.h"
 
sbit SDA = P2^0;
sbit SCL = P2^1;
 
bit ack;
 
/*************************************************
  Function:       iic_rev_byte()
  Description:    读取EEPROM中一个字节
  Calls:          无
  Called By:      main();
  Input:          无
  Output:         无
  Return:         rev_data:读取的数据(一个字节大小)
  Others:         无
*************************************************/
unsigned char iic_rev_byte()
{
    unsigned char i;
    unsigned char rev_data  = 0;
 
    SDA = 1;            //若不初始化为高电平,则无论从器件怎么变化,都不会置为高        
	for(i = 0; i < 8; i++)
	{
	    SCL = 0;        // 上升沿接收数据
		delay_us(1);
		SCL = 1;
		rev_data = (rev_data<<1) | SDA;
		delay_us(1);
	}
    SCL = 0;			//钳住总线
 
    return rev_data;
}
 
/*************************************************
  Function:       iic_send_byte()
  Description:    向EEPROM中写入一个字节的数据
  Calls:          delay_us();
  Called By:      main();
  Input:          无
  Output:         无
  Return:         ask:返回1为有应答,0为无应答
  Others:         无
*************************************************/
void iic_send_byte(unsigned char byte)
{
    unsigned char i;
 
	for(i = 0; i < 8; i++)	 //下降沿发送数据
	{
	    SDA = byte & 0x80;	 //发送数据:从最高位开始发送
		SCL = 1;			 //高电平读取数据
		delay_us(1);
		SCL = 0;			 //低电平时数据可变
		delay_us(1);
		byte = byte << 1;	 //准备发送下一位数据
	}
 
	SCL = 1;
	SDA = 1;				 //拉高SDA等待产生应答
	delay_us(1);
    if(0 == SDA)			 //产生应答
	{
	    ack = 1;
	}
	else					 //未产生应答
	{
	    ack = 0;
	}
	SCL = 0;
 
}
 
/*************************************************
  Function:       iic_start()
  Description:    起始信号
  Calls:          delay_us();
  Called By:      main();
  Input:          无
  Output:         无
  Return:         无
  Others:         无
*************************************************/
void iic_start()
{
    SDA = 1;
	SCL = 1;
	delay_us(1);
	SDA = 0;	   //产生下降沿
	delay_us(1);
	SCL = 0;	   //钳住总线,使iic总线失效
}
 
/*************************************************
  Function:       iic_start()
  Description:    终止信号
  Calls:          delay_us();
  Called By:      main();
  Input:          无
  Output:         无
  Return:         无
  Others:         无
*************************************************/
void iic_stop()
{
    SDA = 0;
	SCL = 1;
	delay_us(1);
	SDA = 1;		//产生上升沿
	delay_us(1);	
	SCL = 0;		//钳住总线
}

————————————————
版权声明:本文为CSDN博主「肖申克de九叔」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_30594349/article/details/52558897

最后

以上就是单纯小虾米为你收集整理的IIC程序的全部内容,希望文章能够帮你解决IIC程序所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部