新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STC89C52單片機(jī)AD測(cè)試實(shí)驗(yàn)

        STC89C52單片機(jī)AD測(cè)試實(shí)驗(yàn)

        作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò) 收藏
        ///////////////////////////////////////////////////////////////////////////

        實(shí)現(xiàn)功能: 調(diào)節(jié)實(shí)驗(yàn)板上的標(biāo)號(hào)為AD0的電位器改變電壓,通過(guò)PCF8591的采集,把
        數(shù)據(jù)傳輸給單片機(jī),單片機(jī)通過(guò)處理把采集到的電壓值,顯示在數(shù)碼管
        上,注意所采用的通道為第0通道,也就是說(shuō)調(diào)節(jié)的是AD0電位器
        實(shí)驗(yàn)板型號(hào):BS-XYD-C52
        實(shí)驗(yàn)名稱:AD測(cè)試實(shí)驗(yàn)
        編寫人:謝應(yīng)東
        編寫日期: 2012-4-30
        ///////////////////////////////////////////////////////////////////////////
        #include //包含52單片機(jī)頭文件
        #include//包含標(biāo)準(zhǔn)輸入輸出文件

        本文引用地址:http://www.104case.com/article/201611/319237.htm

        #define uchar unsigned char//宏定義這個(gè)誰(shuí)都知道的
        #define uint unsigned int

        uchar code table[]={
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共陰數(shù)碼管1至F數(shù)字編碼

        sbit duan=P2^6; //573鎖存器段鎖存端
        sbit wei=P2^7; //位鎖存端

        sbit sda=P2^0; //定義模擬IIC總線的數(shù)據(jù)線
        sbit scl=P2^1; //定義模擬IIC總線的時(shí)鐘線

        float val;
        ///////////////////////////////////////////////////////////////////////////
        函數(shù)名稱:毫秒延時(shí)函數(shù)
        函數(shù)功能:實(shí)現(xiàn)毫秒級(jí)的延時(shí)
        參數(shù)介紹:Delay_MS: 定義需要延時(shí)的毫秒的數(shù)值
        iNumber: 記錄Delay_MS的數(shù)值,以for語(yǔ)句實(shí)現(xiàn)所要求的延時(shí)
        iValue: 要延時(shí)毫秒所要進(jìn)行的循環(huán)數(shù)值,本數(shù)值為實(shí)際測(cè)得
        返回值: 無(wú)
        注意事項(xiàng):本實(shí)驗(yàn)是在所用晶振為12M的前提下實(shí)現(xiàn)的毫秒延時(shí),本函數(shù)是通過(guò)循環(huán)的形
        式完成,所以如果改變了晶振的頻率,請(qǐng)做相應(yīng)的改變
        ///////////////////////////////////////////////////////////////////////////
        void DelayMs(uint Delay_MS)
        {
        uint iNumber,iValue;
        for(iNumber=0;iNumber{
        iValue=107;
        while(iValue--);
        }
        }
        ///////////////////////////////////////////////////////////////////////////
        函數(shù)名稱:DelayUs
        函數(shù)功能:延時(shí)幾個(gè)微秒(us),用來(lái)IIC總線延時(shí)
        參數(shù)介紹:無(wú)
        返回值: 無(wú)
        注意事項(xiàng):無(wú)
        ///////////////////////////////////////////////////////////////////////////
        void DelayUs()
        {;;}
        ///////////////////////////////////////////////////////////////////////////
        函數(shù)名稱:Display_V
        函數(shù)功能:把通過(guò)PCF8591采集到的數(shù)據(jù),在單片機(jī)處理完之后,顯示在數(shù)碼管上
        參數(shù)介紹:cBai:要顯示在第一個(gè)數(shù)碼管上的數(shù)字
        cShi:要顯示在第二個(gè)數(shù)碼管上的數(shù)字
        cGe:要顯示在第三個(gè)數(shù)碼管上的數(shù)字
        返回值: 無(wú)
        注意事項(xiàng):注意實(shí)驗(yàn)板上所要用到底的數(shù)碼管為共陰極的數(shù)碼管
        ///////////////////////////////////////////////////////////////////////////
        void Display_V(uchar cBai,uchar cShi,uchar cGe)
        {
        duan=1; //打開數(shù)碼管的段選
        P0=table[cBai]|0x80;//送入相應(yīng)的段選0x80是為了點(diǎn)亮數(shù)碼管小數(shù)點(diǎn)(dp端)
        duan=0;//關(guān)閉數(shù)碼管的段選
        P0=0xff;
        wei=1;//打開數(shù)碼管的位選
        P0=0xfe; //給要點(diǎn)亮數(shù)碼管的公共極低電平
        wei=0;//關(guān)閉數(shù)碼管的位選
        DelayMs(5);//穩(wěn)定時(shí)序

        duan=1;//打開數(shù)碼管的段選
        P0=table[cShi];//送入相應(yīng)的段選
        duan=0;//關(guān)閉數(shù)碼管的段選
        P0=0xff;
        wei=1; //打開數(shù)碼管的位選
        P0=0xfd; //給要點(diǎn)亮數(shù)碼管的公共極低電平
        wei=0; //打開數(shù)碼管的位選
        DelayMs(5); //穩(wěn)定時(shí)序

        duan=1; //打開數(shù)碼管的段選
        P0=table[cGe]; //送入相應(yīng)的段選
        duan=0; //關(guān)閉數(shù)碼管的段選
        P0=0xff;
        wei=1; //打開數(shù)碼管的位選
        P0=0xfb; //給要點(diǎn)亮數(shù)碼管的公共極低電平
        wei=0; //打開數(shù)碼管的位選
        DelayMs(5); //穩(wěn)定時(shí)序
        }
        ///////////////////////////////////////////////////////////////////////////
        函數(shù)名稱:Init_IIC
        函數(shù)功能:完成對(duì)IIC總線數(shù)據(jù)線時(shí)鐘線初始化
        參數(shù)介紹:無(wú)
        返回值: 無(wú)
        注意事項(xiàng):無(wú)
        ///////////////////////////////////////////////////////////////////////////
        void Init_IIC()
        {
        sda=1;
        scl=1;
        }
        ///////////////////////////////////////////////////////////////////////////
        函數(shù)名稱:Start_IIC
        函數(shù)功能:IIC總線的開始條件
        參數(shù)介紹:無(wú)
        返回值: 無(wú)
        注意事項(xiàng):具體請(qǐng)參考相關(guān)的文檔
        ///////////////////////////////////////////////////////////////////////////
        void Start_IIC()//開始條件
        {
        sda=1;
        DelayUs();
        scl=1;
        DelayUs();
        sda=0;
        }
        ///////////////////////////////////////////////////////////////////////////
        函數(shù)名稱:Stop_IIC
        函數(shù)功能:IIC總線的終止條件
        參數(shù)介紹:無(wú)
        返回值: 無(wú)
        注意事項(xiàng):具體請(qǐng)參考相關(guān)的文檔
        ///////////////////////////////////////////////////////////////////////////
        void Stop_IIC()
        {
        sda=0;
        DelayUs();
        scl=1;
        DelayUs();
        sda=1;
        DelayUs();
        }
        ///////////////////////////////////////////////////////////////////////////
        函數(shù)名稱:Response_IIC
        函數(shù)功能:IIC總線的應(yīng)答條件
        參數(shù)介紹:cNumber: 定義一個(gè)延時(shí)的變量
        返回值: 無(wú)
        注意事項(xiàng):具體請(qǐng)參考相關(guān)的文檔
        ///////////////////////////////////////////////////////////////////////////
        void Response_IIC()//
        {
        uchar cNumber=0;
        scl=1;
        DelayUs();
        while((sda==1)&&(cNumber<255))
        cNumber++; //加一個(gè)等待時(shí)間防止程序一直處在檢測(cè)狀態(tài)
        scl=0;//這個(gè)是應(yīng)答和非應(yīng)答綜合的應(yīng)答條件
        DelayUs();
        }
        ///////////////////////////////////////////////////////////////////////////
        函數(shù)名稱:Write_byte
        函數(shù)功能:通過(guò)IIC總線向PCF8591寫入一個(gè)字節(jié)
        參數(shù)介紹:cData:要寫入的字節(jié)的值
        cNumber: 定義for語(yǔ)句中用到的變量,因?yàn)镮IC總線是一位一位寫入的,所
        以需要循環(huán)8次
        cTempValue: 臨時(shí)的一個(gè)變量
        返回值: 無(wú)
        注意事項(xiàng):具體請(qǐng)參考相關(guān)IIC文檔
        ///////////////////////////////////////////////////////////////////////////
        void Write_byte(uchar cData)
        {
        uchar cNumber,cTempValue;
        cTempValue=cData;
        for(cNumber=0;cNumber<8;cNumber++) //循環(huán)8次,完成一個(gè)字節(jié)的寫入
        {
        cTempValue=cTempValue<<1; //CY=cTempValue^7;
        scl=0;
        DelayUs();
        sda=CY; //CY 進(jìn)位標(biāo)志位
        DelayUs();
        scl=1;
        DelayUs();
        }
        scl=0;
        DelayUs();
        sda=1;
        DelayUs();
        }
        ///////////////////////////////////////////////////////////////////////////
        函數(shù)名稱:Read_byte
        函數(shù)功能:通過(guò)IIC總線,從器件里讀取一個(gè)字節(jié),因?yàn)楸仨毷且晃灰晃蛔x,所以需要
        循環(huán)8次
        參數(shù)介紹:cNumber:for句用到的循環(huán)變量
        返回值: cValue:返回讀取到的字節(jié)
        注意事項(xiàng):請(qǐng)參考相應(yīng)的文檔
        ///////////////////////////////////////////////////////////////////////////
        uchar Read_byte()
        {
        uchar cNumber=0,cValue=0;
        scl=0;
        DelayUs();
        sda=1;
        DelayUs();
        for(cNumber=0;cNumber<8;cNumber++) //完成對(duì)一個(gè)字節(jié)的讀取
        {
        scl=1;
        DelayUs();
        cValue=(cValue<<1)|sda; //通過(guò)循環(huán)得到一個(gè)字節(jié)
        scl=0;
        DelayUs();
        }
        return cValue; //返回讀取到的字節(jié)
        }
        ///////////////////////////////////////////////////////////////////////////
        函數(shù)名稱:Read_channel
        函數(shù)功能:選取PCF8591的AD輸入通道,然后再讀出采集到數(shù)值,即電壓值
        參數(shù)介紹:無(wú)
        返回值: cValue:返回采集到的數(shù)據(jù)
        注意事項(xiàng):無(wú)
        ///////////////////////////////////////////////////////////////////////////
        uchar Read_channel(uchar cChannel)//PCF通道選擇函數(shù)
        {
        uchar cValue; //從這個(gè)通道讀出數(shù)據(jù)是大多數(shù)學(xué)習(xí)者
        Start_IIC(); //比較模糊的地方
        Write_byte(0x90); //這個(gè)時(shí)序請(qǐng)按照AT24C02的任意讀時(shí)序圖進(jìn)行操作
        Response_IIC();
        Write_byte(0x40|cChannel);
        Response_IIC();
        Start_IIC();
        Write_byte(0x91); //給IIC器件寫入相應(yīng)的命令
        Response_IIC();
        cValue=Read_byte(); //讀取采集到的數(shù)據(jù)
        Stop_IIC();

        return cValue; //返回采集到的數(shù)據(jù)
        }
        ///////////////////////////////////////////////////////////////////////////
        函數(shù)名稱:main
        函數(shù)功能:完成對(duì)采集到的電壓值的處理,然后顯示到前三個(gè)數(shù)碼管上
        參數(shù)介紹:cBai:因?yàn)榘褦?shù)分離,才能顯示到數(shù)碼管上,作為分離后顯示在第一個(gè)數(shù)
        碼管上的數(shù)
        cShi:顯示在第二個(gè)數(shù)碼管上的數(shù)
        cGe:顯示在第三個(gè)數(shù)碼管上的數(shù)
        iTempValue:臨時(shí)變量,賦予從PCF8591通道0讀出來(lái)的數(shù)值
        返回值: 無(wú)
        注意事項(xiàng):無(wú)
        ///////////////////////////////////////////////////////////////////////////
        void main()
        {
        uchar cBai,cShi,cGe;
        int iTempValue;
        Init_IIC();//IIC總線初始化
        while(1) //大循環(huán)是用來(lái)不停地掃描PCF8591的數(shù)據(jù)變換
        {
        iTempValue=Read_channel(0);//從PCF8591通道0讀出來(lái)的數(shù)值
        val=(float)iTempValue/51; //要把num強(qiáng)制轉(zhuǎn)換為float型進(jìn)行計(jì)算
        cBai=iTempValue/51;//下面這三個(gè)分離是把從通道讀取到的數(shù)值轉(zhuǎn)換為電壓
        cShi=iTempValueQ*10/51; //想一下5V為255那么1v是不是代表51
        cGe=iTempValueQ*10Q*10/51;//1.8v是不是數(shù)值92
        Display_V(cBai,cShi,cGe);//把電壓值顯示到數(shù)碼管上
        }
        }



        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 井冈山市| 鸡东县| 鄄城县| 蒙城县| 兴安县| 苍南县| 白城市| 若羌县| 封丘县| 罗甸县| 葵青区| 凉山| 阿拉尔市| 荆门市| 正安县| 新郑市| 泌阳县| 托克托县| 左权县| 兰坪| 龙陵县| 福建省| 富裕县| 柞水县| 沙洋县| 吉木乃县| 桂平市| 奈曼旗| 凌云县| 金山区| 喜德县| 天津市| 禄丰县| 阿拉善右旗| 定襄县| 玉环县| 当雄县| 独山县| 丽江市| 柳江县| 云梦县|