<object id="k0taz"><form id="k0taz"></form></object>
<pre id="k0taz"></pre>
      1. <table id="k0taz"></table>
        <bdo id="k0taz"><center id="k0taz"></center></bdo>
        <table id="k0taz"><option id="k0taz"></option></table><track id="k0taz"><ruby id="k0taz"></ruby></track>
        專注電子技術學習與研究
        當前位置:單片機教程網 >> 常用芯片 >> 瀏覽文章

        PCF8591調試日志

        作者:佚名   來源:本站原創   點擊數:  更新時間:2014年04月27日   【字體:

            了解一款芯片應該從它的datasheet開始,因為網上的中文資料也比較多,所以也就沒有看原版的英文資料,雖然知道這不是個好習慣,但確實能省些時間(好吧,其實我真的只是懶而已)。

         
            
         
         
            
            PCF8591是具有I2C總線借口的8位AD/DA轉換芯片,內部為單一電源供電(25~6V),典型值為5V,CMOS工藝。PCF8591有4路AD輸入,屬逐次比較型,內含采樣保持電路;1路8位DA輸出,內含DAC數據寄存器。AD/DA轉換的最大速率約為11KHz。
         
            PCF8591內部可編程控制字有兩個,一個是地址選擇字,另一個為轉換控制字。Philips規定AD器件高四位地址為1001,低三位地址為引腳地址A0,A1,A2,由硬件電路決定。因此,I2C系統中最多可以掛載8個有總線接口的AD器件。地址的最后一位為方向位R/W,MCU向AD器件進行讀操作時為1,進行寫操作時為0?偩操作時,由器件地址、引腳地址和方向位組成的從地址為主控制器發送的第一字節。
            PCF8591的轉換控制字存放在控制寄存器中,用于實現期間的各種功能?偩操作時為主控制器發送的第二字節。






         
         
            以下為具體代碼及注釋:

        #include
         
        #define uchar unsigned char
        #define uint unsigned int
        #define PCF8591 0x90
         
        sbit SCL=P2^0;
        sbit SDA=P2^1;
        sbit dula=P3^6;
         
        uchar code table1[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
        uchar code table2[10]={0xc0,0xcf,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
         
        void delay();
        void delay_ms(uchar x);
        void init_i2c();
        void start_i2c();
        void stop_i2c();
        void response_i2c();
        void write_byte(uchar dat);
        void write_add(uchar address,uchar dat);
        uchar read_byte();
        uchar read_add(uchar control);
        void display(uchar n);
         
        void main()
        {
        uchar num;
        init_i2c();
        while(1)
        {
        num=read_add(0x41);
        display(num);
        }
        }
         
        void delay()
        {;;}
         
        void delay_ms(uchar x)
        {
        uchar i,j;
        for(i=x;i>0;i--)
        for(j=125;j>0;j--);
        }
         
        void init_i2c()
        {
        SCL=1;
        delay();
        SDA=1;
        delay();
        }
         
        void start_i2c()
        {
        SDA=1;
        delay();
        SCL=1;
        delay();
        SDA=0;
        delay();
        }
         
        void stop_i2c()
        {
        SDA=0;
        delay();
        SCL=1;
        delay();
        SDA=1;
        delay();
        }
         
        void response_i2c()
        {
        uchar i;
        SCL=1;
        delay();
        while((SDA==1)&&(i<255))
        i++;
        SCL=0;
        delay();
        }
         
        void write_byte(uchar dat)
        {
        uchar temp,i;
        temp=dat;
        for(i=0;i<8;i++)
        {
        temp<<=1;
        SCL=0;
        delay();
        SDA=CY;
        delay();
        SCL=1;
        delay();
        }
        SCL=0;
        delay();
        SDA=1;
        delay();
        }
         
        void write_add(uchar address,uchar dat)
        {
        start_i2c();
        write_byte(PCF8591);
        response_i2c();
        write_byte(address);
        response_i2c();
        write_byte(dat);
        response_i2c();
        stop_i2c();
        }
         
        uchar read_byte()
        {
        uchar i,k;
        SCL=0;
        delay();
        SDA=1;
        delay();
        for(i=0;i<8;i++)
        {
        SCL=1;
        delay();
        k=(k<<=1)|SDA;
        SCL=0;
        delay();
        }
        return k;
        }
         
        uchar read_add(uchar control)
        {
        uchar dat;
        start_i2c();
        write_byte(PCF8591);
        response_i2c();
        write_byte(control);
        response_i2c();
        start_i2c();
        write_byte(PCF8591+1);
        response_i2c();
        dat=read_byte();
        stop_i2c();
        return dat;
        }
         
         
        void display(uchar n)
        {
        uchar bai,shi,ge;
        bai=n/100;
        shi=(n/10);
        ge=n;
        dula=0;
        P2=table1[7];
        dula=1;
        dula=0;
        P0=table2[bai];
        dula=1;
        dula=0;
        delay_ms(5);
         
        dula=0;
        P2=table1[6];
        dula=1;
        dula=0;
        P0=table2[shi];
        dula=1;
        dula=0;
        delay_ms(5);
         
        dula=0;
        P2=table1[5];
        dula=1;
        dula=0;
        P0=table2[ge];
        dula=1;
        dula=0;
        delay_ms(5);
        }
         
            通過PCF8591的調試,不光掌握了一種AD/DA芯片,更是學習了I2C這種用途極廣的通訊方式,活到老學到老。
        關閉窗口

        相關文章

        欧美国产伦久久久久_亚洲爽爽一区二区三区_一色屋精品视频在线观看免费_久久伊人成色777综合网
        <object id="k0taz"><form id="k0taz"></form></object>
        <pre id="k0taz"></pre>
          1. <table id="k0taz"></table>
            <bdo id="k0taz"><center id="k0taz"></center></bdo>
            <table id="k0taz"><option id="k0taz"></option></table><track id="k0taz"><ruby id="k0taz"></ruby></track>