|
/* ****************************************************************
** 功能描述: 单片机通过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_dataA转换数据,addressA输出通道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转换间隔时间,继续延时
}
}
|
|