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

📄 i2cphysi.c

📁 ucos ii 下的一个注释较好的51系列C语言的I2C软件仿真程序
💻 C
字号:
//----------------------------------------------------------------
//  
// 文件名称: i2cphysi.c
// 文件标识:
// 摘    要: I2C总线驱动
//
//----------------------------------------------------------------

#include "hi51.h"
#include <stdio.h>
#include "i2cphysi.h"
#include "includes.h"
//----------------------------------------------------------------
#define IO_TYPE 1
//----------------------------------------------------------------
sbit P36 = P3^6;
sbit P37 = P3^7;
//sbit P44 = P4^4;
//sbit P45 = P4^5;
//----------------------------------------------------------------
#if	IO_TYPE == 1
	#define getsda P36
	#define setsda P36 = 1
	#define clrsda P36 = 0
	#define getscl P37
	#define setscl P37 = 1
	#define clrscl P37 = 0
#endif
/*
#if	IO_TYPE == 2
	#define getsda P44
	#define setsda P44 = 1
	#define clrsda P44 = 0
	#define getscl P45
	#define setscl P45 = 1
	#define clrscl P45 = 0
#endif
*/
//----------------------------------------------------------------
// 控制延时的变量
UC8 gvTimeDly = 20;
//----------------------------------------------------------------
// 描述:设置延时变量
// 输入:time  延时长度
// 输出:无
void twbSetDelay(UC8 time)
{
    gvTimeDly = time;
 //   gvTimeDly = 10;
}
//----------------------------------------------------------------
// 描述:取得延时变量
// 输入:无
// 输出:延时长度
UC8 twbGetDelay(void)
{
    return gvTimeDly;
}
//----------------------------------------------------------------
// 描述:延时
// 输入:无
// 输出:无
void Delay_Time(void)
{
    UC8 i;
    for(i=0;i<gvTimeDly;i++)
        ;
}
//----------------------------------------------------------------
// 描述:延时
// 输入:无
// 输出:无
void hr_delaytime_135(void)
{
    UC8 i;
    for(i=0;i<4;i++)
        ;
}
//----------------------------------------------------------------
// 描述:延时
// 输入:无
// 输出:无
void HR_DelayTime(void)
{
	hr_delaytime_135();
}
//----------------------------------------------------------------
// 描述:延时
// 输入:无
// 输出:无
void HR_Sleep(unsigned int m)
{
    unsigned int  i;	  
    for(i=0;i<m*31;i++)
        ;
}
//----------------------------------------------------------------
// 描述:发送总线起始标识
// 输入:无
// 输出:无
void HR_Start(void)
{	   
	clrscl;
	Delay_Time();
	setsda;
	Delay_Time();
	setscl;
	Delay_Time();
	setscl;
	Delay_Time();
	clrsda;
	Delay_Time();
}
//----------------------------------------------------------------
// 描述:发送总线结束标识
// 输入:无
// 输出:无
void HR_Stop(void)
{	  
	clrscl;
	Delay_Time();
	clrsda;
	Delay_Time();
	setscl;
	Delay_Time();
	setsda;
	Delay_Time();
}
//----------------------------------------------------------------
// 描述:发送8个比特数据
// 输入:c   发送的字节(8比特)
// 输出:无
void HR_DataS(UC8 c)
{
	UC8 i;	 
	for(i=0;i<8;i++)
	{
		clrscl;
		Delay_Time();
		if(c&0x80)
			setsda;
		else
			clrsda;
        Delay_Time();
		c<<=1;
		setscl;
		Delay_Time();
	}
	clrscl; 
	Delay_Time();
	setsda;
	Delay_Time();
}
//----------------------------------------------------------------
// 描述:收取8个比特数据
// 输入:无
// 输出:收到的字节(8比特)
UC8 HR_DataG(void)
{
	UC8 c,i;
			  
	c = 0;
	for(i=0;i<8;i++)
	{
		setsda;	 		
		Delay_Time();
		setscl;
		Delay_Time();
		c<<=1;
		if(getsda&0x01)
            c |= 0x01;
		else
			c &= 0xfe;
		clrscl;
		Delay_Time();
	}
	return c;
}
//----------------------------------------------------------------
// 描述:发送一个"非应答"
// 输入:无
// 输出:无
void HR_NoAs(void)
{			  
	clrscl;      
	Delay_Time();
	setsda;       
	Delay_Time();
	setscl;		      
	Delay_Time();
	Delay_Time();
	Delay_Time();
	clrscl;       
	Delay_Time();
	clrsda;
	Delay_Time();
}
//----------------------------------------------------------------
// 描述:发送一个"应答"
// 输入:无
// 输出:无
void HR_SetAS(void)
{			  
	clrscl;
	Delay_Time();
	clrsda;
	Delay_Time();
	setscl;
	Delay_Time();
	Delay_Time();
	Delay_Time();
	clrscl; 
	Delay_Time();
	setsda;
	Delay_Time();
}
//----------------------------------------------------------------
// 描述:等待接收"应答"
// 输入:无
// 输出:无
UC8 HR_AS(void)
{
	UC8 sda,scl,ack;	  				 

	clrscl;
	Delay_Time();
	setscl;
	Delay_Time();
	sda = getsda;
	Delay_Time();
	scl = getscl;
	Delay_Time();
	clrscl;
	Delay_Time();

    if (sda==0)
        ack = 0;
    else
        ack = 1;
    return(ack);
}
//----------------------------------------------------------------
// 描述:通过总线设置一个寄存器参数
// 输入:twbID -- 器件的I2C标识
//       addr  -- 寄存器地址
//       value -- 参数值
// 输出:无
void twbSetData(UC8 twbID, UC8 addr, UC8 value)
{
   OSSchedLock();
	HR_Start();
	HR_DataS(twbID);
    HR_AS();
	HR_DataS(addr);
    HR_AS();
	HR_DataS(value);
    HR_AS();
	HR_Stop();
	OSSchedUnlock();
}
//----------------------------------------------------------------
// 描述:通过总线读取一个寄存器参数
// 输入:twbID -- 器件的I2C标识
//       addr  -- 寄存器地址
// 输出:寄存器值
UC8 twbGetData(UC8 twbID, UC8 addr)
{
	UC8  gdata;

    OSSchedLock();
	HR_Start();
	HR_DataS(twbID);
    HR_AS();
	HR_DataS(addr);
    HR_AS();

	HR_Start();
	HR_DataS(twbID|0X01);
	HR_AS();
	gdata = HR_DataG();
	HR_NoAs();
	HR_Stop();
	OSSchedUnlock();

	return(gdata);
}
//----------------------------------------------------------------
// 描述:通过总线获取一组寄存器参数
// 输入:twbID -- 器件的I2C标识
//       addr  -- 起始寄存器地址
//       mem   -- 指向参数数组的指针
//       count -- 寄存器的个数
// 输出:无
void twbGetDatas(UC8 twbID, UC8 addr, UC8 *mem, UC8 count)
{
    UC8 i;

   OSSchedLock();

	HR_Start();
	HR_DataS(twbID);
    HR_AS();
	HR_DataS(addr);
    HR_AS();
//	HR_Stop();

	HR_Start();
	HR_DataS(twbID|0X01);
    HR_AS();
	for(i=0;i<count-1;i++)
	{
		mem[i] = HR_DataG();
		HR_SetAS();
	}
	mem[i] = HR_DataG();
	HR_NoAs();
	HR_Stop();
	OSSchedUnlock();
}
//-----------------------------------------------------------------
// 描述:通过总线设置一组寄存器参数
// 输入:twbID -- 器件的I2C标识
//       addr  -- 起始寄存器地址
//       mem   -- 指向参数数组的指针
//       count -- 寄存器的个数
// 输出:无
void twbSetDatas(UC8 twbID, UC8 addr, UC8 *mem, UC8 count)
{
    UC8 i;

    OSSchedLock();
	HR_Start();
	HR_DataS(twbID);
    HR_AS();
	HR_DataS(addr);
    HR_AS();
	for(i=0;i<count;i++)
    {
		HR_DataS(mem[i]);
        HR_AS();
    }
	HR_Stop();
	OSSchedUnlock();
}
//-----------------------------------------------------------------

⌨️ 快捷键说明

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