/*******************************************************************
起动总线函数
函数原型: void IIcStart();
功能: 启动I2C总线,即发送I2C起始条件.
********************************************************************/
void IIcStart()
{
SCL=1;
SDA=1; /*发送起始条件的数据信号*/
delay5us();
SDA=0; /*发送起始信号*/
delay5us();
}
/*******************************************************************
结束总线函数
函数原型: void IIcStop();
功能: 结束I2C总线,即发送I2C结束条件.
********************************************************************/
void IIcStop()
{
SCL=1 ;
SDA=0; /*发送结束条件的数据信号*/
delay5us();
SDA=1; /*发送I2C总线结束信号*/
delay5us();
}
/********************************************************************
发送应答
函数原型: IIc_ACK(bit a);
功能: 主控器进行应答信号(注意:0表示发送应答,1表示发送非应答)
********************************************************************/
void IIc_Ack(bit ack)
{
SCL=1;
delay5us();
SDA=ack; /*清时钟线,钳住I2C总线以便继续接收*/
delay5us();
SCL=0;
}
/********************************************************************
等待应答
函数原型: IIc_WaitACK(void);
功能: 主控器进行应答信号(0是就帮答)
********************************************************************/
bit IIc_WaitAck(void)
{
SCL=0;
delay5us();
SCL=1;
delay5us();
if(SDA==1)
{
SCL=0;
return 0;
}
else
{
SCL=0;
return 1;
}
}
/*******************************************************************
字节数据发送函数
函数原型: void SendByte(UCHAR c);
功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0)
发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void SendByte(unsigned char date)
{
unsigned char temp,i; //用于探测字节内某一位值的掩码变量
temp=date;
for (i=0; i<8; i++) //从高位到低位依次进行
{
temp=temp<<1;
SCL=0 ;
delay5us();
SDA = CY;
delay5us();
SCL = 1; //拉高SCL
delay5us();
}
SCL = 0;
SDA = 1; //8位数据发送完后,主机释放SDA,以检测从机应答
}
/*******************************************************************
字节数据接收函数
函数原型: UCHAR RcvByte();
功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数应答从机。
********************************************************************/
unsigned char RcvByte(void)
{
unsigned char i,j,k;
SCL=0;
delay5us();
for(i=0;i<8;i++)
{
SCL=1;
delay5us();
j=SDA;
k=(k<<1)|j;
SCL=0;
delay5us();
}
return k;
}
/*******************************************************************
D/A 变换, 转化函数
*******************************************************************/
void DAC(unsigned char dat)
{
IIcStart(); //启动总线
SendByte(0x90); //发送器件地址0x90是写,0x91是读
IIc_WaitAck();
SendByte(0x41); //发送控制字节//允许DA输出
IIc_WaitAck();
SendByte(dat); //发送DAC的数值
IIc_WaitAck();
IIcStop(); //结束总线
}
/*******************************************************************
ADC读字节数据函数
*******************************************************************/
unsigned char ADC(unsigned char addr)
{
unsigned char temp;
IIcStart(); //启动总线
SendByte(0x90); //发送器件地址0x90是写,0x91是读
IIc_WaitAck();
SendByte(addr); //控制字节:选择光敏电阻(0x41)还是滑动变阻器(0x43
IIc_WaitAck();
IIcStart();
SendByte(0x91);
IIc_WaitAck();
temp=RcvByte();
IIc_Ack(1); //0表示发送应答,1表示发送非应答
IIcStop();
return temp;
}
|