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

📄 i2c-max518.c

📁 这是我从朋友那搞到的pic学习资料
💻 C
字号:
/* ****************************************************************
** 功能描述: 单片机通过I2C控制MAX518输出DA
*************************************************************** */
#include	"pic18.h"				/* PIC18系列的头文件 */
unsigned	int	DA_Delay_count=0;	/* 间隔一定时间发送DA(I2C) ,不使DA过于频繁 */
unsigned	int	DA_data=0;	   		/* DA输出数据(数字量,0XFF对应5V)*/

/* ****************************************************************
** 函 数 名: initial()
** 功能描述: 系统初始化子程序,放在程序首部
*************************************************************** */
void	initial()
{
	INTCON=0x00;			/* bit7-bit0:关总中断 */
	ADCON1=0X07;			/* 设置数字输入输出口 */
	PIE1=0;					/* PIE1 的中断不使能 */			
	PIE2=0;					/* PIE2 的中断不使能 */	
	PIE3=0;					/* PIE3 的中断不使能 */	
}

/* 	**************************************************************
**	函 数 名: I2C_Initial()
**	功    能:i2c初始化子程序,I2C用于向MAX518输出DA 
****************************************************************** */ 
void   I2C_Initial()                    
{
	SSPCON1=0X08;		//允许串行口工作,I2C主控工作方式
	TRISC=TRISC|0X08;
	TRISC=TRISC|0X10;   //定义SCL,SDA
	SSPADD=7;			//定义波特率,用4MHz时,时钟=4M/(4×(7+1))=0.125M
	SSPSTAT=0X80;		//I2C模式下,关闭标准速度方式(100K和1MK)的回转率控制
	SSPCON2=0;			//初始化SSPCON2(该寄存器仅用于I2c方式)
	TRISA=TRISA&0xef;	//74HC165移位信号为输出,即不使用74HC165
	RA4=0;				//74HC165移位信号为输出0,即不使用74HC165
	SSPEN=1;	    	//使能串行口(SSP模块)
}

/* 	**************************************************************
**	函 数 名: Wait_Ack()
**	功    能:主机等待从动芯片(MAX518)i2c应答子程序 
****************************************************************** */ 
void  Wait_Ack() 
{   
	do
	{
		;
	}while(BF==1);				// 等待应答信号
	SSPIF=0;					// 清标志
}

/* 	**************************************************************
**	函 数 名: I2C_OUT()
**	功    能:主机向从动芯片(MAX518)输出DA数据
**  参    数:DA_Out_data:DA转换数据,address:DA输出通道0或1(518只有2个通道)
****************************************************************** */ 
void  I2C_OUT(char DA_Out_data,char address)
{ 
	unsigned	char	i=0;

	I2C_Initial();				//I2C DA输出初始化
  	SEN=1;						//启动I2C
	for(i=1;i<18;i++)i=i;		//延时
	do							//启动I2C
	{		
     	RSEN=1;					//重启动I2C
		for(i=0;i<28;i++)i=i;	//延时
		if(SSPIF==1)break;		//启动成功,继续执行I2C发送数据程序
		else	return;			//启动不成功,本次退出执行I2C程序,防止程序死机	 
	}while(SSPIF==0);
	SSPIF=0;					//清标志
    SSPBUF=0x58;                //向DA芯片MAX518写地址0X58
    Wait_Ack();					//等待应答	
   	SSPBUF=address;             //向MAX518写通道命令字节DA0通道或DA1通道
  	Wait_Ack();					//等待应答	
   	SSPBUF=DA_Out_data;         //向DA芯片MAX518写DA转换的输出数据
	Wait_Ack();					//等待应答
	PEN=1;						//停止I2C
    Wait_Ack();					//等待应答
}

main()					
{
	initial();					/* 系统初始化子程序 */
	I2C_Initial();				/* i2c初始化子程序 */
	while(1)
	{
		if(DA_Delay_count>=0x2f)	// 间隔一定时间启动DA转换,不使DA转换过于频繁
		{
			DA_Delay_count=0;		// DA转换间隔时间延时清0
			DA_data=0x3f;			// D/A0通道转换数据为0X3F(1.25V)
			I2C_OUT(DA_data,0);		// D/A0通道发DA转换数据
			DA_data=0xbf;			// D/A1通道转换数据为0XBF(3.75V)
			I2C_OUT(DA_data,1);		// D/A1通道发DA转换数据
		}
		else	DA_Delay_count++;	// 不到DA转换间隔时间,继续延时
	}
}

⌨️ 快捷键说明

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