<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        基于IIC總線的AD轉換模塊PCF8591

        作者:我行天下   來源:本站原創   點擊數:  更新時間:2014年03月30日   【字體:


        /*本程序使用普中開發板調試*/

        #include<reg52.h>
        #include<intrins.h>
        #define uint unsigned int
        #define uchar unsigned char

        #define addw 0x90
        #define addr 0x91

        sbit scl=P2^0;
        sbit sda=P2^1;

        sbit rs=P2^6;
        sbit rw=P2^5;
        sbit en=P2^7;

        uchar  Ch0value,Ch1value;

        void delayms(int i) 
        { int x,y;
        for (x=i;x>0;x--)
         for(y=110;y>0;y--); 
        }

        void usdelay()
        {
        _nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_(); 
        }


        void start() //開始信號
        {//時鐘線在高電平時,數據線由高變低即為開始信號 由高變低即為開始信號
        sda=1;
        usdelay();
        scl=1;
        usdelay();
        sda=0;//數據線由高變低即為開始信號
        usdelay();
        scl=0;
        }

        void stop() //結束信號
        {//時鐘線在高電平時,數據線由低變高即為結束信號
        sda=0;
        usdelay();
        scl=1;
        usdelay();
        sda=1;
        usdelay();
        sda=0; //這句可有可無
        scl=0; //這句可有可無
        }

        void ack()//應答信號 
        { uchar i;
        scl=1;
        usdelay(); 
            while((sda==1)&&(i<200))i++;
        scl=0;
            usdelay();
        }

        void Noack()  //不應答
        {
        sda=1; //時鐘線高電平時,數據線高,即為不應答
        usdelay();
            scl=1;
        usdelay();
        scl=0;
            usdelay();
        }


        void send_byte(uchar dat)
        {
        uchar i;
        for(i=0;i<8;i++)
          {  
           scl=0;
           usdelay();
           sda=(bit)(dat&0x80); //數據傳送是由高到低
           //(bit)為強制轉換命令,把數據變為非0即1的一位數據庫
           usdelay();
           scl=1;
           usdelay();
           dat<<=1;
           }
          scl=0;
          usdelay();
          sda=1;//釋放總線
          usdelay();
        }

        uchar read_byte()
        {

        uchar i,k;
        scl=0;
        usdelay();
        sda=1; //釋放總線
        usdelay();
        for(i=0;i<8;i++)
          {
           scl=1;
           usdelay();
           k=(k<<1)|sda;//判斷8次,移位7次
           scl=0;
           usdelay();  
          }
        return k;
        }
         

        uchar read_adc(uchar channel)
        {
          uchar temp;
          start();
          send_byte(addw);
          ack();
          send_byte(0x40|channel);
          ack();
          start();
          send_byte(addr);
          ack();
          temp=read_byte();
          Noack();
          stop();
          return temp;

        }

        void init()
        {
          scl=1;
          sda=1;
        }
         

        /*********1602程序********************/

          void write_com(uchar com)
         {
          rs=0;
          rw=0;
          en=0;
          P0=com;
          delayms(2);
          en=1;
          delayms(2);
          en=0;
          }


        void write_dat(uchar dat)
         {
          rs=1;
          rw=0;
          en=0;
          P0=dat;
          delayms(2);
          en=1;
          delayms(2);
          en=0;
          }

        void zfc(uchar *p)
        {
         while(*p!=0)
         write_dat(*p++);
        }

        void init_1602()
        {
        write_com(0x38);
          delayms(2);
        write_com(0x0c);
         delayms(2);
        write_com(0x06);
         delayms(2);
        write_com(0x01);
        write_com(0x80);
        zfc("Channel 0 :");
        write_com(0x80+0x40);
        zfc("Channel 1 :");
        }

        void display()
        {
        uchar a0,a1,a2, b0,b1,b2;
        a0=Ch0value*196/10000;
        a1=Ch0value*196%10000/1000;
        a2=Ch0value*196%1000/100;

        b0=Ch1value*196/10000;
        b1=Ch1value*196%10000/1000;
        b2=Ch1value*196%1000/100;
        write_com(0x80+11);
        write_dat(0x30+a0);
        write_dat('.');
        write_dat(0x30+a1);
        write_dat(0x30+a2);
        write_dat('V');

        write_com(0x80+0x40+11);
        write_dat(0x30+b0);
        write_dat('.');
        write_dat(0x30+b1);
        write_dat(0x30+b2);
        write_dat('V');

        }
        void main()

           init_1602();
           init();
            while(1)
        {
         Ch0value=read_adc(0);
        delayms(50);
        Ch1value=read_adc(1);
        delayms(50);
         display();
        }
        }
         

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮