#includereg52.h//包含52单片机头文件#defineucharunsignedchar//宏定义这个谁都知道的uchart0=0;num=0;//这个是全局变量ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴数码管1至F数字编码sbitdula=P2^6;//573锁存器段锁存端sbitwela=P2^7;//位锁存端sbitsda=P2^0;//PCF8591串行数据线sbitscl=P2^1;//PCF8591串行时钟线sbitRST=P2^5;//这个其实是自己的开发板的缺陷//你的可能不需要这个voiddelayms(ucharz)//这个延时是用来间隔数码管{//如果不加这个延时数码管显示速度过快uchari,j;for(i=z;i0;i--)for(j=100;j0;j--);}voiddelay()//延时几个微秒(us),用来IIC总线延时{;;}voiddisplayv(ucharbai,ucharshi,ucharge){dula=1;//这个函数是显示转换过后的电压值P0=table[bai]|0x80;//或上0x80是为了点亮数码管小数点(dp端)dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delayms(5);dula=1;P0=table[shi];dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delayms(5);dula=1;P0=table[ge];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delayms(5);}voiddisplayn(ucharbai,ucharshi,ucharge){dula=1;P0=table[bai];//这个函数显示单片机读取PCF8591转换的数字值dula=0;//因为是8位所以数据为(0——255)P0=0xff;wela=1;P0=0xf7;wela=0;delayms(5);dula=1;P0=table[shi];dula=0;P0=0xff;wela=1;P0=0xef;wela=0;delayms(5);dula=1;P0=table[ge];dula=0;P0=0xff;wela=1;P0=0xdf;wela=0;delayms(5);}voidinit()//IIC总线数据线时钟线初始化{sda=1;scl=1;RST=0;}voidstart()//开始条件{sda=1;delay();scl=1;delay();sda=0;}voidstop()//终止条件{sda=0;delay();scl=1;delay();sda=1;delay();}voidresponse()//应答条件{uchari=0;scl=1;delay();while((sda==1)&&(i255))i++;scl=0;delay();}voidwrite_byte(uchardate)//向PCF8591写一个字节{uchari,temp;temp=date;for(i=0;i8;i++){temp=temp1;scl=0;delay();sda=CY;delay();scl=1;delay();}scl=0;delay();sda=1;delay();}ucharread_byte()//从IIC设备读出一个字节{uchari=0,k=0;scl=0;delay();sda=1;delay();for(i=0;i8;i++){scl=1;delay();k=(k1)|sda;scl=0;delay();}returnk;}ucharread_channel(ucharchannel)//PCF通道选择函数{ucharnum;start();write_byte(0x90);response();write_byte(0x40|channel);response();start();write_byte(0x91);response();num=read_byte();stop();returnnum;}voidwrite_date(uchardate)//DA转换向PCF8591写数据{start();write_byte(0x90);response();write_byte(0x40);response();write_byte(date);response();stop();}voidmain(){ucharnum,bai,shi,ge;init();while(1)//大循环是用来不停地扫描PCF8591的数据变换{num=read_channel(2);bai=num/51;//下面这三个分离是把从通道读取到的数值转换为电压shi=num%51*10/51;//想一下5V为255那么1v是不是代表51ge=num%51*10%51*10/51;//1.8v是不是数值92displayv(bai,shi,ge);//显示电压displayn(num/100,num%100/10,num%10);//显示数值write_date(num);}}