找回密碼
         注冊會員
        搜索附件  

        PCF8591.rar

         

        波形發生器,可顯示正弦,三角,鋸齒,帶仿真:
        /*-----------------------------------------------
        ------------------------------------------------*/
        #include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
        #include <intrins.h> //包含NOP空指令函數_nop_();

        #define AddWr 0x90 //寫數據地址
        #define AddRd 0x91 //讀數據地址


        sbit Sda=P1^2; //定義總線連接端口
        sbit Scl=P1^1;

        bit ADFlag; //定義AD采樣標志位
        unsigned char code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段數共陰碼管段碼表
        data unsigned char Display[8];//定義臨時存放數碼管數值
        /*------------------------------------------------
        延時程序
        ------------------------------------------------*/
        void mDelay(unsigned char j)
        {
        unsigned int i;
        for(;j>0;j--)
        {
        for(i=0;i<125;i++)
        {;}
        }
        }
        /*------------------------------------------------
        初始化定時器1
        ------------------------------------------------*/
        void Init_Timer1(void)
        {
        TMOD |= 0x10;
        TH1=0xff; /* Init value */
        TL1=0x00;
        //PT1=1; /* 優先級 */
        EA=1; /* interupt enable */
        ET1=1; /* enable timer1 interrupt */
        TR1=1;
        }
        /*------------------------------------------------
        啟動IIC總線
        ------------------------------------------------*/
        void Start(void)
        {
        Sda=1;
        _nop_();
        Scl=1;
        _nop_();
        Sda=0;
        _nop_();
        Scl=0;
        }


        /*------------------------------------------------
        停止IIC總線
        ------------------------------------------------*/
        void Stop(void)
        {
        Sda=0;
        _nop_();
        Scl=1;
        _nop_();
        Sda=1;
        _nop_();
        Scl=0;
        }


        /*------------------------------------------------
        應答IIC總線
        ------------------------------------------------*/
        void Ack(void)
        {
        Sda=0;
        _nop_();
        Scl=1;
        _nop_();
        Scl=0;
        _nop_();
        }


        /*------------------------------------------------
        非應答IIC總線
        ------------------------------------------------*/
        void NoAck(void)
        {
        Sda=1;
        _nop_();
        Scl=1;
        _nop_();
        Scl=0;
        _nop_();
        }


        /*------------------------------------------------
        發送一個字節
        ------------------------------------------------*/
        void Send(unsigned char Data)//將數據送入
        {
        unsigned char BitCounter=8;
        unsigned char temp;

        do
        {
        temp=Data;
        Scl=0;
        _nop_();
        if((temp&0x80)==0x80)//判斷最高位是否為1,如果是sda為1,否則為0
        Sda=1;//數據線將數據讀入
        else
        Sda=0;

        Scl=1;
        temp=Data<<1;//左移
        Data=temp;
        BitCounter--;
        }
        while(BitCounter);
        Scl=0;
        }


        /*------------------------------------------------
        讀入一個字節并返回
        ------------------------------------------------*/
        unsigned char Read(void)//ad轉換,讀出轉換值
        {
        unsigned char temp=0;
        unsigned char temp1=0;
        unsigned char BitCounter=8;

        Sda=1;
        do
        {
        Scl=0;
        _nop_();
        Scl=1;
        _nop_();
        if(Sda)
        temp=temp|0x01;//最后一位置一
        else
        temp=temp&0xfe;//最后一位置零

        if(BitCounter-1)
        {
        temp1=temp<<1;//temp左移一位
        temp=temp1;//將數據保存到temp讀出
        }
        BitCounter--;
        }
        while(BitCounter);
        return(temp);
        }

        /*------------------------------------------------
        寫入DA數模轉換值
        ------------------------------------------------*/
        void DAC(unsigned char Data)
        {
        Start();
        Send(AddWr); //寫入芯片地址
        Ack();
        Send(0x40); //寫入控制位,使能DAC輸出
        Ack();
        Send(Data); //寫數據
        Ack();
        Stop();

        }

        /*------------------------------------------------
        讀取AD模數轉換的值,有返回值
        ------------------------------------------------*/
        unsigned char ReadADC(unsigned char Chl)
        {
        unsigned char Data;
        Start(); //寫入芯片地址
        Send(AddWr);
        Ack();
        Send(0x40|Chl);//寫入選擇的通道,本程序只用單端輸入,差分部分需要自行添加
        //Chl的值分別為0、1、2、3,分別代表1-4通道
        Ack();
        Start();
        Send(AddRd); //讀入地址
        Ack();
        Data=Read(); //讀數據
        Scl=0;
        NoAck();
        Stop();
        return Data; //返回值
        }

        /*------------------------------------------------
        主程序
        ------------------------------------------------*/
        void main()
        {
        unsigned char num; //DA數模輸出變量
        unsigned char ADtemp; //定義中間變量
        Init_Timer1();

        while(1)
        {
        DAC(num); //DA輸出,可以用LED模擬電壓變化
        num++; //累加,到256后溢出變為0,往復循環。顯示在LED上亮度逐漸變化
        mDelay(20); //延時用于清晰看出變化
        if(ADFlag) //定時采集輸入模擬量
        {
        ADFlag=0;

        ADtemp=ReadADC(0);
        Display[0]=Datatab[(ReadADC(0))/50]|0x80;//處理0通道電壓顯示
        Display[1]=Datatab[((ReadADC(0))%50)/10];

        ADtemp=ReadADC(1);
        Display[2]=Datatab[((ReadADC(1))/50)]|0x80;//處理1通道電壓顯示 此通道暫時屏蔽,可以自行添加
        Display[3]=Datatab[((ReadADC(1))%50)/10];

        ADtemp=ReadADC(2);
        Display[4]=Datatab[((ReadADC(2))/50)]|0x80;//處理1通道電壓顯示 此通道暫時屏蔽,可以自行添加
        Display[5]=Datatab[((ReadADC(2))%50)/10];

        ADtemp=ReadADC(3);
        Display[6]=Datatab[((ReadADC(3))/50)]|0x80;//處理1通道電壓顯示 此通道暫時屏蔽,可以自行添加
        Display[7]=Datatab[((ReadADC(3))%50)/10];


        }
        }
        }

        /*------------------------------------------------
        定時器中斷程序
        ------------------------------------------------*/
        void Timer1_isr(void) interrupt 3 using 1//定時器1執行數碼管動態掃描
        {

        static unsigned int count,j;
        TH1=0xfb; //重新賦值
        TL1=0x00;
        j++;
        if(j==300)
        {j=0;ADFlag=1;} //定時置位AD采樣標志位

        P0=Display[count];//用于動態掃描數碼管
        P2=count;
        count++;
        if(count==8) //表示掃描8個數碼管
        count=0;


        }

        QQ|手機版|MCU資訊論壇 ( 京ICP備18035221號-2 )|網站地圖

        GMT+8, 2025-5-4 18:42 , Processed in 0.038963 second(s), 8 queries , Redis On.

        Powered by Discuz! X3.5

        © 2001-2025 Discuz! Team.

        返回頂部
        久久99国产精品二区不卡| 国产精品嫩草影院久久| 亚洲精品人成无码中文毛片| www国产精品| 亚洲∧v久久久无码精品| 亚洲精品国产日韩无码AV永久免费网| 亚洲国产精品成人AV无码久久综合影院| 福利体验试看120秒| 毛片a精品**国产| 国产精品综合久成人| 国产精品免费精品自在线观看| 日韩精品无码久久久久久| 国产一区亚州一区欧州一区| 在线观看亚洲专区| 亚洲欧洲自拍拍偷精品 美利坚| 精品无码久久久久久久久久| 国产精品亚洲美女久久久| 阳茎进去女人阳道视频特黄 | 蜜臀久久99精品久久久久久| 亚洲爆乳精品无码一区二区三区| 五级黄无遮挡免费看| 亚洲欧美日韩久久精品| 久久香蕉国产线看观看精品yw | 国产精品内射视频免费| 大狠狠大臿蕉香蕉大视频| 日本人精品video黑人| 国产精品一区二区不卡| 欧美日韩国产精品自在自线| 国产麻豆精品久久一二三| 国产午夜精品一区二区三区漫画| 中国精品videossex中国高清| 青青草精品视频| 国产成人精品高清不卡在线| 91精品国产综合久久四虎久久无码一级| 久久国产精品免费| 国产精品对白交换视频| 久久国产成人精品麻豆| 夜夜高潮夜夜爽国产伦精品| 91精品啪在线观看国产| 亚洲国产精品嫩草影院久久| 国产2021精品视频免费播放|