?? max1169.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 + -