英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

 找回密码
 立即注册
搜索
电子烟方案单片机单片机开发深圳单片机开发
单片机方案国产单片机8位单片机电子烟方案开发
查看: 3368|回复: 1

求教16F88 I2C 通讯做主机的程序

[复制链接]
发表于 2009-3-11 14:46:29 | 显示全部楼层 |阅读模式
请问PIC16F88在进行I2C 通信时,它做主机时它的起始条件和停止条件是怎么产生的?是硬件自动完成还是模拟?
 楼主| 发表于 2009-3-11 14:48:10 | 显示全部楼层
给个例子,参考下,另88不带主控IIC

/* ****************************************************************
** 功能描述: 单片机通过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转换间隔时间,继续延时
}
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|公司首页|Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 ( 粤ICP备09008620号 )

GMT+8, 2024-3-29 21:48 , Processed in 0.067988 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表