- #include<reg52.h>
- #include <intrins.h>
- #define AddWr 0x90
- sbit scl=P2^0;
- sbit sda=P2^1;
- bit ack;
- unsigned char date;
- sbit C1=P2^3;
- sbit C2=P2^4;
- sbit C3=P2^5;
- sbit Dp=P2^2;
- table[10]=
- {0x3f,0x06,0x5B,0x4F,0x66,
- 0x6D,0x7D,0x07,0x7F,0x6F};
- unsigned int data dis[3]={0x00,0x00,0x00};
- unsigned int getData;
- void Start_I2c()
- {
- sda=1;
- _nop_();
- scl=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- sda=0;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- scl=0;
- _nop_();
- _nop_();
- }
- void Stop_I2c()
- {
- sda=0;
- _nop_();
- scl=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- sda=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- void I2C_SendByte(unsigned char c)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- if((c<<i)&0x80)sda=1;
- else sda=0;
- _nop_();
- scl=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- scl=0;
- }
- _nop_();
- _nop_();
- sda=1;
- _nop_();
- _nop_();
- scl=1;
- _nop_();
- _nop_();
- _nop_();
- if(sda==1)ack=0;
- else ack=1;
- scl=0;
- _nop_();
- _nop_();
- }
- unsigned char I2C_RcvByte()
- {
- unsigned char retc=0,i;
- sda=1;
- for(i=0;i<8;i++)
- {
- _nop_();
- scl=0;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- scl=1;
- _nop_();
- _nop_();
- retc=retc<<1;
- if(sda==1)retc=retc+1;
- _nop_();
- _nop_();
- }
- scl=0;
- _nop_();
- _nop_();
- return(retc);
- }
- void Ack_I2c(bit a)
- {
- if(a==0)sda=0;
- else sda=1;
- _nop_();
- _nop_();
- _nop_();
- scl=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- scl=0;
- _nop_();
- _nop_();
- }
- bit Pcf8591_DaConversion(unsigned char addr,unsigned char channel, unsigned char Val)
- {
- Start_I2c();
- I2C_SendByte(addr);
- if(ack==0)return(0);
- I2C_SendByte(0x40|channel);
- if(ack==0)return(0);
- I2C_SendByte(Val);
- if(ack==0)return(0);
- Stop_I2c();
- return(1);
- }
- bit PCF8591_SendByte(unsigned char addr,unsigned char channel)
- {
- Start_I2c();
- I2C_SendByte(addr);
- if(ack==0)return(0);
- I2C_SendByte(0x40|channel);
- if(ack==0)return(0);
- Stop_I2c();
- return(1);
- }
- unsigned char PCF8591_RcvByte(unsigned char addr)
- {
- unsigned char dat;
- Start_I2c();
- I2C_SendByte(addr+1);
- if(ack==0)return(0);
- dat=I2C_RcvByte();
- Ack_I2c(1);
- Stop_I2c();
- return(dat);
- }
- void delay(unsigned char i)
- {
- unsigned char j,k;
- for(j=i;j>0;j--)
- for(k=125;k>0;k--);
- }
- int main()
- {
- while(1)
- {
- PCF8591_SendByte(AddWr,0);
- getData=PCF8591_RcvByte(AddWr);
- dis[1]=getData/51;
- dis[2]=getData%51;
- dis[2]=dis[2]*10;
- dis[0]=dis[2]/51;
- C1=1;
- Dp=0;
- P0=table[dis[0]];
-
- C1=0;
- delay(10);
-
- C2=1;
- Dp=0;
- P0=table[dis[1]];
-
- C2=0;
- delay(10);
-
- C3=1;
- Dp=1;
- P0=table[dis[1]];
- C3=0;
- }
- }
复制代码
|