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

📄 max1169.c

📁 基于I2C总线的AD转换器MAX1169驱动程序!单片机为AT89C51
💻 C
字号:
/*------------------------------------------------------------------------------------------
[文件名] I2C.c
[版本] 1.1b
[修改自]I2C通用驱动AD7416实例程序,原作者鞠春阳
[最后修改时间] 2006年01月07日(调试完成)
[资料] 请到www.mcuzb.com下载
===========================================================================================*/
#include "reg51.h"
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char

uchar SystemError;
sbit SCL= P1^0; //定义串行时钟线所在口 使用时根据自己的需要来定义
sbit SDA= P1^1; //定义串行数据线所在口 使用时根据自己的需要来定义

SomeNOP(void)
{  //uchar ij=255;
  //   while(ij--){
_nop_();_nop_();_nop_();_nop_();}
//} 
/*--------------------------------------------------------------------------------
调用方式:void I2CStart(void) 2005/12/10
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStart(void)
{
//EA=0;
SDA=1; //SomeNOP();//SCL保持高,SDA从高到低一次跳变,I2C通信开始
SCL=1; SomeNOP();
SDA=0; SomeNOP(); 
SCL=0; SomeNOP();
}
/*--------------------------------------------------------------------------------
调用方式:void I2CStop(void) 2005/12/10
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStop(void)
{
//SCL=0; 
SDA=0; //SomeNOP(); //SCL保持高,SDA从低到高一次跳变,I2C通信停止
SCL=1; SomeNOP(); 
SDA=1; SomeNOP();
SCL=0; SomeNOP();
//EA=1;
}

/*--------------------------------------------------------------------------------
调用方式:I2CAck(void) 2005/12/10
函数说明:私有函数,I2C专用,等待从器件接收方的应答
ACK BY 
---------------------------------------------------------------------------------*/
WaitAck(void)
{
unsigned char errtime=255;//因故障接收方无ACK(ACK对应SDA=0),超时值为255。

SDA=1;
//SDA=0;
SCL=1;
SystemError=0x10; 
while(SDA)
  { errtime--;
    if(!errtime)
     { I2CStop();
       SystemError=0x11; //出错后给全局变量赋值
       return;
      }
  };
SCL=0;
_nop_();
}


/*--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2005/12/10
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
---------------------------------------------------------------------------------*/
void SendAck(void)
{
SDA=0; SomeNOP(); //数据线保持低,时钟线发生一次从高低的跳变 发送一个应答信号
SCL=1; SomeNOP();
SCL=0;
}

/*--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2005/12/10
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
--------------------------------------------------------------------------------*/
void SendNotAck(void)
{
SDA=1; SomeNOP(); //数据线保持高,时钟线发生一次从高低的跳变 没有应答
SCL=1; SomeNOP();
SCL=0;
}

/*--------------------------------------------------------------------------------
调用方式:void I2CSend(uchar ch) 2005/12/10
函数说明:私有函数,I2C专用                               
---------------------------------------------------------------------------------*/
void I2CSendByte(uchar ch)  //write device
{
unsigned char i=8;

while (i--)
{
SCL=0;_nop_();
SDA=(bit)(ch&0x80); ch<<=1; SomeNOP(); //SCK下降沿发送数据
SCL=1; SomeNOP();
}
SCL=0;

}
/*--------------------------------------------------------------------------------
调用方式:uchar I2CReceive(void) 2005/12/10
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
uchar I2CReceiveByte(void)    //read  device
{
unsigned char i=8,datatmp=0;
SDA=1;           //释放总线
while(i--)
{
  datatmp<<=1;
  SCL=0;SomeNOP();
  SCL=1;SomeNOP(); //SCL做一次从低到高的跳变 可以接收数据
  datatmp|=SDA;
  };
SCL=0;
return datatmp;
}

/*--------------------------------------------------------------------------------
调用方式:uint ADC(void) 2005/12/10
函数说明:用于max1169AD转换测试(转换前是否一定要进行“HS MODE”设置?N,上电即默认为FS)
---------------------------------------------------------------------------------*/
uint ADC(uchar addr)
{       
	uint  adc_data;
    uchar nt1;

	I2CStart();
    nt1=(addr<<1)|0x61;
	I2CSendByte(nt1);      //写入器件地址,并设置器件为R模式
	WaitAck();                         //写入地址后,器件向主机发送ACK。
	
//	SCL=0;                           //用延时的方式等待SCK变高(转换时SCK被max1169置低)
//	SomeNOP();
//	while(!SCL); //由于转换过程很短,转换过程中SCL保持低,转换结束后slave释放对SCL控制权,但SCL仍然为0
	
	adc_data=I2CReceiveByte();        //read d15~d8
	SendAck();
	adc_data<<=8;
	adc_data=adc_data|I2CReceiveByte();  //read d7~d0
	SendNotAck();
	I2CStop();
	
	return(adc_data);
}


void delay(uchar x)
       {    uchar j;
	      for(j=0;j<x;j++)
	         _nop_();
	     }

main()
{ 


    uint  ch_adc[10];

	//ch1_adc=ADC(0x6);    //测试max1169(地址为6)的转换
    uchar  n;


     while(1)
	 {
      _nop_();
      for(n=0;n<10;n++)
       { 
	     ch_adc[n]=ADC(0x6);
		 delay(80);
         };        //测试max1169(地址为6)的转换
      };

/*	uint ch1_adc,ch2_adc;

	ch1_adc=ADC(0x6);    //测试max1169(地址为6)的转换
    
	while(1)
    {
	
	ch1_adc=ADC(0x6);    //测试max1169(地址为6)的转换
      };
*/

//ch2_adc=ADC(0x7);      //测试max1169(地址为7)的转换
/*	while(1);
*/
}

⌨️ 快捷键说明

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