• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            極品垃圾

            初學VC ,就是把每天所看到的整理到博客,慢慢消化這些內容。見證我的學習之路吧。很多都是轉載。

            公告

            初學VC ,就是把每天所看到的整理到博客,慢慢消化這些內容。見證我的學習之路吧。很多都是轉載。
            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            統計

            • 隨筆 - 0
            • 文章 - 61
            • 評論 - 1
            • 引用 - 0

            常用鏈接

            留言簿(2)

            隨筆分類

            文章分類(55)

            文章檔案(61)

            搜索

            •  

            最新評論

            STC系列單片機內部AD的應用
            STC89LE52AD54AD、58AD、516AD這幾款89系列的STC單片機內部自帶有88位的AD轉換器,分布在P1口的8位上,當時鐘在40MHz以下時,每17個機器周期可完成一次AD轉換。

                     AD相關的幾個寄存器如表1所示。

            1 STC89系列單片機AD相關寄存器

            名稱

            地址

            功能描述

            D7

            D6

            D5

            D4

            D3

            D2

            D1

            D0

            復位值

            P1_ADC_EN

            97H

            允許P1.X成為AD

            AD_P17

            AD_P16

            AD_P15

            AD_P14

            AD_P13

            AD_P12

            AD_P11

            AD_P10

            0000 0000

            ADC_CONTR

            C5H

            AD轉換控制寄存器

            --

            --

            --

            ADC_FLAG

            ADC_START

            CHS2

            CHS1

            CHS0

            xxx0 0000

            ADC_DATA

            C6H

            AD轉換結果寄存器

            --

            --

            --

            --

            --

            --

            --

            --

            0000 0000

                     P1_ADC_ENP1.X口的AD使能寄存器。

                               相應位設置為“1”時,對應的P1. X口作為AD轉換使用,內部上拉電阻自動斷開。

                     ADC_CONTRAD 轉換控制寄存器。

                               ADC_STARTAD轉換啟動控制位,設置為“1”時,AD開始轉換。

                              ADC_FLAGAD轉換結束標志位,當AD轉換完成后,ADC_FLAG=1

                               CHS2、CHS1CHS0:為模擬輸入通道選擇,如表2所示。

            2  STC89系列單片機AD模擬通道選擇設置

            CHS2

            CHS1

            CHS0

            模擬輸入通道選擇

            0

            0

            0

            選擇P1.0作為AD輸入來用

            0

            0

            1

            選擇P1.1作為AD輸入來用

            0

            1

            0

            選擇P1.2作為AD輸入來用

            0

            1

            1

            選擇P1.3作為AD輸入來用

            1

            0

            0

            選擇P1.4作為AD輸入來用

            1

            0

            1

            選擇P1.5作為AD輸入來用

            1

            1

            0

            選擇P1.6作為AD輸入來用

            1

            1

            1

            選擇P1.7作為AD輸入來用

                ADC_DATAAD 轉換結果寄存器。模擬/數字轉換結果計算公式如下:

            結果=256×Vin / Vcc

                     Vin為模擬輸入通道輸入電壓,Vcc為單片機實際工作電壓,用單片機工作電壓作為模擬參考電壓。

                     下面一個例程演示STC89LE516AD/X2系列單片機的A/D轉換功能。 時鐘11.0592MHz, 轉換結果以16進制形式輸出到串行口,可以用串行口調試程序觀察輸出結果。(本代碼摘自宏晶科技芯片手冊,經作者調試可正常運行)。

                     新建文件part3.4.5.c,程序代碼如下:

                              #include <reg52.H>

            #include <intrins.H>

            // 定義與 ADC 有關的特殊功能寄存器

            sfr P1_ADC_EN = 0x97; //A/D轉換功能允許寄存器

            sfr ADC_CONTR = 0xC5; //A/D轉換控制寄存器

            sfr ADC_DATA = 0xC6;  //A/D轉換結果寄存器

            typedef unsigned char INT8U;

            typedef unsigned int INT16U;

            void delay(INT8U delay_time) // 延時函數

            {

                     INT8U n;

                     INT16U m;

                     for (n=0;n<delay_time;n++)

                              {

                                        for(m=0;m<10000;m++);

                              }

            }

            void initiate_RS232(void)  //串口初始化

            {

                     ES = 0;        // 禁止串口中斷

                     SCON = 0x50;   // 0101,0000 8 位數據位, 無奇偶校驗

                     T2CON = 0x34;  // 0011,0100, T2 作為波特率發生器

                     RCAP2H = 0xFF; // 時鐘11.0592MHz, 9600 波特率

                     RCAP2L = 0xDB;

                     ES = 1;        // 允許串口中斷

            }

            void Send_Byte(INT8U one_byte) // 發送一個字節

            {

                     TI = 0;        // 清零串口發送中斷標志

                     SBUF = one_byte;

                     while (TI == 0);

                     TI = 0;        // 清零串口發送中斷標志

            }

            INT8U get_AD_result(INT8U channel)

            {

                     INT8U AD_finished = 0; // 存儲 A/D 轉換標志

                     ADC_DATA = 0;

                     ADC_CONTR = channel; // 選擇 A/D 當前通道

                     delay(1);                      //使輸入電壓達到穩定

                     ADC_CONTR |= 0x08; //0000,1000 ADC_START = 1, 啟動A/D 轉換

                     AD_finished = 0;

                     while ( AD_finished == 0 ) // 等待A/D 轉換結束

                     {

                              AD_finished = (ADC_CONTR & 0x10); //0001,0000, ADC_FLAG ==1測試A/D                  換結束否

                     }

                     ADC_CONTR &= 0xF7; //1111,0111 ADC_START = 0, 關閉A/D 轉換,

                     return (ADC_DATA); // 返回 A/D 轉換結果

            }

            void main()

            {

                     initiate_RS232();

                     P1 = P1 | 0x63; // 0110,0011,要設置為 A/D 轉換的P1.x ,先設為高

                     P1_ADC_EN = 0x63; //0110,0011, P1 P1.0,P1.1,P1.5,P1.6 設置為 A/D 轉換輸入腳

                     // 斷開P1.0,P1.1,P1.5,P1.6 內部上拉電阻

                     while(1)

                     {

                              Send_Byte(get_AD_result(0)); //P1.0 A/D 當前通道, 測量并發送結果

                              delay(0x200);

                              Send_Byte(get_AD_result(1)); //P1.1 A/D 當前通道, 測量并發送結果

                              delay(0x200);

                              Send_Byte(get_AD_result(5)); //P1.5 A/D 當前通道, 測量并發送結果

                              delay(0x200);

                              Send_Byte(get_AD_result(6)); //P1.6 A/D 當前通道, 測量并發送結果

                              delay(0x200);

                              Send_Byte(0); // 連續發送 4 00H, 便于觀察輸出顯示

                              Send_Byte(0);

                              Send_Byte(0);

                              Send_Byte(0);

                              delay(0x200); // 延時

                              delay(0x200);

                              delay(0x200);

                              delay(0x200);

                              delay(0x200);

                              delay(0x200);

                     }

            }

                知識點:typedef#define的區別

                          typedef:類型定義,其功能是用戶為已有數據類型取“別名。

                          如:typedef  int  INT; 意思是將int重新定義為INT,以后使用INT a;就相當于int       a;

                   typedef定義數組、指針、結構等類型將帶來很大的方便,不僅使程序書寫簡單,而且使意義更為明確,因而增強了可讀性。例如:typedef int a[10];表示a是整型數組類型,數組長度為10,然后就可用a定義變量,如:a s1,s2;完全等效于:int s1[10],s2[10];

            define:宏定義。

                   如:#define PI 3.14 意思是以后程序中出現PI的地方將用3.14代替,這個替換是在編譯預處理階段完成的,注意#define最后沒有分號,否則編譯時將分號一同帶入PI中。

            posted on 2009-08-13 21:07 極品垃圾 閱讀(4683) 評論(0)  編輯 收藏 引用 所屬分類: 單片機

            性欧美大战久久久久久久久| 99国产欧美久久久精品蜜芽 | 精品久久人人做人人爽综合 | 99久久国产综合精品麻豆| 久久久久久久女国产乱让韩| 久久亚洲av无码精品浪潮| 色综合久久中文色婷婷| 国产精品久久久久久福利69堂| 久久综合狠狠综合久久| 奇米综合四色77777久久| 国产精品久久久久jk制服| 久久青青草原国产精品免费 | 国产精品女同久久久久电影院| 久久综合亚洲欧美成人| 久久99毛片免费观看不卡| 久久国产免费观看精品| 国产精品午夜久久| 色妞色综合久久夜夜| 精品一二三区久久aaa片| 粉嫩小泬无遮挡久久久久久| 久久99精品国产麻豆宅宅| 久久久艹| 2021少妇久久久久久久久久| 国产精品内射久久久久欢欢| 国産精品久久久久久久| 国产精品一区二区久久精品涩爱| 色婷婷综合久久久中文字幕| 国产99久久精品一区二区| 久久99精品久久久久久噜噜 | 国产成人精品三上悠亚久久| 久久久精品2019免费观看| 777久久精品一区二区三区无码| 久久久久久国产精品美女| 一本一本久久a久久综合精品蜜桃| 国产麻豆精品久久一二三| 思思久久99热免费精品6| 99精品久久精品| 性色欲网站人妻丰满中文久久不卡| 亚洲欧美日韩精品久久| 国产成人精品综合久久久久| 久久久久久国产精品美女|