⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iic_soft.h

📁 这是测量接触电阻的程序
💻 H
字号:
#ifndef  	IIC_SOFT_H
#define		IIC_SOFT_H
#include 	"mdefine.h"
//I2C定义位

sbit SDA=P2^0;            //模拟I2C数据传送位
sbit SCL=P2^1;            //模拟I2C时钟控制位
bit bdata ack;	              //应答标志位
/********************************************
内部函数,I2C开始
********************************************/
void IIC_Delay_10us()
{
		char i=10;
	 	while(i--);
}
void IIC_Start()
{
		EA=0;
		IIC_Delay_10us();
    SDA=1;
    IIC_Delay_10us();
    SCL=1;
    IIC_Delay_10us();
    SDA=0;
    IIC_Delay_10us();
    SCL=0;
    IIC_Delay_10us();
}
/********************************************
内部函数,I2C结束
********************************************/
void IIC_Stop()
{
	  IIC_Delay_10us();
    SDA=0;
    IIC_Delay_10us();
    SCL=0;
    IIC_Delay_10us();
    SCL=1;
    IIC_Delay_10us();
    SDA=1;
    IIC_Delay_10us();
    EA=1;
    IIC_Delay_10us();
}
/********************************************
内部函数,输出ACK ,每个字节传输完成,输出ack=0,结束读书据,ack=1;
********************************************/
void IIC_WriteAck(bit ack)
{
    SDA=ack;
   IIC_Delay_10us();
    SCL=1;
   IIC_Delay_10us();
    SCL=0;
}

/********************************************
内部函数,等待ACK
********************************************/
void IIC_WaitACK()
{
    uchar errtime=200;
    SDA=1;
    IIC_Delay_10us();
    SCL=1;
    IIC_Delay_10us();
    while(SDA)
    {
        errtime--;
       if(!errtime)
       	IIC_Stop();
    }
    SCL=0;
    IIC_Delay_10us();
}
/********************************************
内部函数.输出数据字节
入口:B=数据
********************************************/
void IIC_WriteByte(uchar wdata)
{
    uchar i;
    for(i=0;i<8;i++)
    {
        if((wdata<<i)&0x80) SDA=1;
        else SDA=0;

        SCL=1;
        IIC_Delay_10us();
        SCL=0;
    }
    IIC_Delay_10us();
    SDA=1;               //8位发送完后释放数据线,准备接收应答位
    IIC_Delay_10us();
    SCL=1;
    IIC_Delay_10us();
    if(SDA==1)ack=0;
       else ack=1;        //判断是否接收到应答信号
    SCL=0;
    IIC_Delay_10us();

}
/********************************************
内部函数.输入数据
出口:B
********************************************/
uchar IIC_ReadByte()
{
    uchar i,bytedata;
    SDA=1;
    for(i=0;i<8;i++)
    {
       SCL=1;
       bytedata<<=1;
       bytedata|=SDA;
       SCL=0;
       	IIC_Delay_10us();
    }
    return(bytedata);
}
/********************************************
读取数据<-pcf8574
********************************************/
bit IIC_ReadByte_8574(uchar sla,uchar *c)
{
		IIC_Start();                		//启动总线
   	IIC_WriteByte(sla+1);           //发送器件地址
     if(ack==0)return(0);
   	*c=IIC_ReadByte();               //读取数据
     IIC_WriteAck(1);               //发送非就答位
  	IIC_Stop();                  		//结束总线
  	return(1);
}
/********************************************
输出数据->pcf8563
********************************************/
void IIC_WriteData(uchar com,uchar address,uchar mdata)
{
    IIC_Start();
    IIC_WriteByte(com); /*写命令*/

    IIC_WriteByte(address); /*写地址*/

    IIC_WriteByte(mdata); /*写数据*/

    IIC_Stop();

}
/********************************************
输入数据<-pcf8563
********************************************/
uchar IIC_ReadData(uchar com,uchar address) /*单字节*/
{   uchar rdata;
    IIC_Start();
    IIC_WriteByte(com); 		/*写命令*/
    IIC_WriteByte(address); /*写地址*/
    IIC_Start();
    IIC_WriteByte(com + 1); /*读命令*/
    rdata=IIC_ReadByte();
    IIC_WriteAck(1);
    IIC_Stop();
    return(rdata);
}
//读多字节 内容
void IIC_Read_Muti_Data(uchar com,uchar address,uchar count,uchar * buff) /*多字节*/
{
		uchar i;
    IIC_Start();
    IIC_WriteByte(com); /*写命令*/
    IIC_WriteByte(address); /*写地址*/
    IIC_Start();
    IIC_WriteByte(com + 1); /*读命令*/
    for(i=0;i<count;i++)
    {
         buff[i]=IIC_ReadByte();
         if(i<count-1) IIC_WriteAck(0);
    }
    IIC_WriteAck(1);
    IIC_Stop();
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -