找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2689|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

ADC-使用外部TL431基準(zhǔn)計(jì)算外部電壓 單片機(jī)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:516397 發(fā)表于 2019-11-6 13:31 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. ******************************************/

  2. #define MAIN_Fosc                22118400L        //定義主時(shí)鐘

  3. #include        "STC15Fxxxx.H"


  4. /***********************************************************/

  5. #define DIS_DOT                0x20
  6. #define DIS_BLACK        0x10
  7. #define DIS_                0x11

  8. #define P1n_pure_input(bitn)                P1M1 |=  (bitn),        P1M0 &= ~(bitn)

  9. /****************************** 用戶定義宏 ***********************************/

  10.         #define        Cal_MODE         0        //每次測量只讀1次ADC. 分辨率0.01V
  11. //        #define        Cal_MODE         1        //每次測量連續(xù)讀16次ADC 再平均計(jì)算. 分辨率0.01V

  12. #define        Timer0_Reload        (65536UL -(MAIN_Fosc / 1000))                //Timer 0 中斷頻率, 1000次/秒

  13. /*****************************************************************************/






  14. /*************        本地常量聲明        **************/
  15. u8 code t_display[]={                                                //標(biāo)準(zhǔn)字庫
  16. //         0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
  17.         0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
  18. //black         -     H    J         K          L           N        o   P         U     t    G    Q    r   M    y
  19.         0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
  20.         0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};        //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

  21. u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                //位碼


  22. /*************        IO口定義        **************/
  23. sbit        P_HC595_SER   = P4^0;        //pin 14        SER                data input
  24. sbit        P_HC595_RCLK  = P5^4;        //pin 12        RCLk        store (latch) clock
  25. sbit        P_HC595_SRCLK = P4^3;        //pin 11        SRCLK        Shift data clock


  26. /*************        本地變量聲明        **************/

  27. u8         LED8[8];                //顯示緩沖
  28. u8        display_index;        //顯示位索引
  29. bit        B_1ms;                        //1ms標(biāo)志

  30. u16        msecond;

  31. u16        Bandgap;

  32. u16        Get_ADC10bitResult(u8 channel);        //channel = 0~7






  33. /**********************************************/
  34. void main(void)
  35. {
  36.         u8        i;
  37.         u16        j;

  38.         P0M1 = 0;        P0M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  39.         P1M1 = 0;        P1M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  40.         P2M1 = 0;        P2M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  41.         P3M1 = 0;        P3M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  42.         P4M1 = 0;        P4M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  43.         P5M1 = 0;        P5M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  44.         P6M1 = 0;        P6M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  45.         P7M1 = 0;        P7M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  46.         
  47.         display_index = 0;
  48.         P1ASF = (1<<2) + (1<<3);        //P1.2 P1.3做ADC
  49.         P1M1 |= (0xc0);        P1M0 &= ~(0xc0);        //P1.2 P1.3設(shè)置成高阻
  50.         ADC_CONTR = 0xE0;                        //90T, ADC power on
  51.         
  52.         Timer0_1T();
  53.         Timer0_AsTimer();
  54.         Timer0_16bitAutoReload();
  55.         Timer0_Load(Timer0_Reload);
  56.         Timer0_InterruptEnable();
  57.         Timer0_Run();
  58.         EA = 1;                                                //打開總中斷
  59.         
  60.         for(i=0; i<8; i++)        LED8[i] = 0x10;        //上電消隱

  61.         
  62.         while(1)
  63.         {
  64.                 if(B_1ms)        //1ms到
  65.                 {
  66.                         B_1ms = 0;
  67.                         if(++msecond >= 300)        //300ms到
  68.                         {
  69.                                 msecond = 0;

  70.                         #if (Cal_MODE == 0)
  71.                         //=================== 只讀1次ADC, 10bit ADC. 分辨率0.01V ===============================
  72.                                 Get_ADC10bitResult(2);                                //通道改變, 先讀一次并丟棄結(jié)果, 讓內(nèi)部的采樣電容的電壓等于輸入值.
  73.                                 Bandgap = Get_ADC10bitResult(2);        //讀外部基準(zhǔn)TL431對應(yīng)的ADC
  74.                                 Get_ADC10bitResult(3);                                //通道改變, 先讀一次并丟棄結(jié)果, 讓內(nèi)部的采樣電容的電壓等于輸入值.
  75.                                 j = Get_ADC10bitResult(3);                        //讀外部電壓ADC
  76.                                 j = (u16)((u32)j * 250 / Bandgap);        //計(jì)算外部電壓, TL431電壓為2.50V, 測電壓分辨率0.01V
  77.                         #endif
  78.                         //==========================================================================

  79.                         //===== 連續(xù)讀16次ADC 再平均計(jì)算. 分辨率0.01V =========
  80.                         #if (Cal_MODE == 1)
  81.                                 Get_ADC10bitResult(2);                                //通道改變, 先讀一次并丟棄結(jié)果, 讓內(nèi)部的采樣電容的電壓等于輸入值.
  82.                                 for(j=0, i=0; i<16; i++)
  83.                                 {
  84.                                         j += Get_ADC10bitResult(2);                //讀外部基準(zhǔn)TL431對應(yīng)的ADC
  85.                                 }
  86.                                 Bandgap = j >> 4;        //16次平均

  87.                                 Get_ADC10bitResult(3);                                //通道改變, 先讀一次并丟棄結(jié)果, 讓內(nèi)部的采樣電容的電壓等于輸入值.
  88.                                 for(j=0, i=0; i<16; i++)
  89.                                 {
  90.                                         j += Get_ADC10bitResult(3);                //讀外部電壓ADC
  91.                                 }
  92.                                 j = j >> 4;        //16次平均
  93.                                 j = (u16)((u32)j * 250 / Bandgap);        //計(jì)算外部電壓, TL431電壓為2.50V, 測電壓分辨率0.01V
  94.                         #endif
  95.                         //==========================================================================
  96.                
  97.                                 LED8[5] = j / 100 + DIS_DOT;        //顯示外部電壓值
  98.                                 LED8[6] = (j % 100) / 10;
  99.                                 LED8[7] = j % 10;

  100.                         //        j = Bandgap;
  101.                         //        LED8[0] = j / 1000;                //顯示Bandgap ADC值
  102.                         //        LED8[1] = (j % 1000) / 100;
  103.                         //        LED8[2] = (j % 100) / 10;
  104.                         //        LED8[3] = j % 10;
  105.                
  106.                         }
  107.                 }
  108.         }
  109. }
  110. /**********************************************/

  111. //========================================================================
  112. // 函數(shù): u16        Get_ADC10bitResult(u8 channel)
  113. // 描述: 查詢法讀一次ADC結(jié)果.
  114. // 參數(shù): channel: 選擇要轉(zhuǎn)換的ADC.
  115. // 返回: 10位ADC結(jié)果.
  116. // 版本: V1.0, 2012-10-22
  117. //========================================================================
  118. u16        Get_ADC10bitResult(u8 channel)        //channel = 0~7
  119. {
  120.         ADC_RES = 0;
  121.         ADC_RESL = 0;

  122.         ADC_CONTR = (ADC_CONTR & 0xe0) | 0x08 | channel;         //start the ADC
  123.         NOP(4);

  124.         while((ADC_CONTR & 0x10) == 0)        ;        //wait for ADC finish
  125.         ADC_CONTR &= ~0x10;                //清除ADC結(jié)束標(biāo)志
  126.         return        (((u16)ADC_RES << 2) | (ADC_RESL & 3));
  127. }


  128. /**************** 向HC595發(fā)送一個(gè)字節(jié)函數(shù) ******************/
  129. void Send_595(u8 dat)
  130. {               
  131.         u8        i;
  132.         for(i=0; i<8; i++)
  133.         {
  134.                 dat <<= 1;
  135.                 P_HC595_SER   = CY;
  136.                 P_HC595_SRCLK = 1;
  137.                 P_HC595_SRCLK = 0;
  138.         }
  139. }
復(fù)制代碼

ADC-使用外部TL431基準(zhǔn)計(jì)算外部電壓.zip

58.51 KB, 下載次數(shù): 33, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:98875 發(fā)表于 2019-12-5 14:08 | 只看該作者
通道2和通道3的硬件怎么連?能給個(gè)參考圖嗎?謝謝!
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表