您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > pcf8591作为数字电压表
//8位AD模块pcf8591作为数字电压表,且在数码管显示#includereg52.h#includeintrins.hsbitscl=P3^7;//pcf8591的SCL引脚sbitsda=P3^6;//pcf8591的SDA引脚unsignedcharcodeledmap[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阴极编码unsignedcharadc,ledbuf[6];voiddelay(unsignedintz){unsignedchari;//显示用的延时程序while(--z)for(i=110;i0;i++);}voiddisp(){unsignedcharpos,j;pos=0x08;//电压在数码管上的显示程序for(j=0;j6;j++){P1=0x00;P0=ledbuf[j];P1=pos;delay(1);pos++;}P1=0x00;}voiddelayus(void){;;}//i2c总线用到的延时程序4.7usvoidiniti2c(void){sda=1;delayus();//I2C初始化scl=1;delayus();}voidi2cstart(void){sda=1;delayus();//i2c起始信号scl=1;delayus();sda=0;delayus();}voidack(){unsignedchari;scl=1;i=0;//i2c的应答信号delayus();while((sda==1)&&(i255))i++;scl=0;delayus();}voidi2cstop(void){sda=0;delayus();scl=1;//i2c的停止信号delayus();sda=1;delayus();}voidi2csend(unsignedcharbyte){unsignedcharmask,i;mask=byte;for(i=0;i8;i++)//I2C写子程序{mask=mask1;scl=0;delayus();sda=CY;delayus();scl=1;delayus();}scl=0;//写完要把SCL=0,delayus();sda=1;//写完要把SDA等于yidelayus();}unsignedchari2cread(void){unsignedcharbyte,i;scl=0;delayus();sda=1;delayus();for(i=0;i8;i++){//读一个字节scl=1;delayus();//从最高位读起byte=1;byte|=sda;scl=0;delayus();}returnbyte;}unsignedcharread_adc(){unsignedchardatabyte;i2cstart();i2csend(0x90);//器件写地址为0x90ack();i2csend(0x40);//通道0ad转换ack();i2cstart();i2csend(0x91);//器件读地址0x91ack();databyte=i2cread();//读AD转换结果i2cstop();returndatabyte;}voidmain(){unsignedintad;initi2c();while(1){adc=read_adc();//读AD结果ad=adc*2;//由于是八位,且乘以2表示512数字表示5V电压,相当于1V用数字100表示ledbuf[0]=ledmap[ad%10];//因此可以认为小数后面第二位是AD的个位数ledbuf[1]=ledmap[ad/10%10];//小数点后面的第一位是adc的十位ledbuf[2]=ledmap[ad/100]&0x7f;//个位为adc的百位ledbuf[3]=0xff;ledbuf[4]=0xff;ledbuf[5]=0xff;disp();//在数码管上显示}}
本文标题:pcf8591作为数字电压表
链接地址:https://www.777doc.com/doc-1439481 .html