- /*******************************************************************
- 起动总线函数
- 函数原型: 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;
- }
|