久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2663|回復: 1
收起左側

ADC-使用外部TL431基準計算外部電壓 單片機程序

[復制鏈接]
ID:516397 發表于 2019-11-6 13:31 | 顯示全部樓層 |閱讀模式
  1. ******************************************/

  2. #define MAIN_Fosc                22118400L        //定義主時鐘

  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        //每次測量連續讀16次ADC 再平均計算. 分辨率0.01V

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

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






  14. /*************        本地常量聲明        **************/
  15. u8 code t_display[]={                                                //標準字庫
  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標志

  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;        //設置為準雙向口
  39.         P1M1 = 0;        P1M0 = 0;        //設置為準雙向口
  40.         P2M1 = 0;        P2M0 = 0;        //設置為準雙向口
  41.         P3M1 = 0;        P3M0 = 0;        //設置為準雙向口
  42.         P4M1 = 0;        P4M0 = 0;        //設置為準雙向口
  43.         P5M1 = 0;        P5M0 = 0;        //設置為準雙向口
  44.         P6M1 = 0;        P6M0 = 0;        //設置為準雙向口
  45.         P7M1 = 0;        P7M0 = 0;        //設置為準雙向口
  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設置成高阻
  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);                                //通道改變, 先讀一次并丟棄結果, 讓內部的采樣電容的電壓等于輸入值.
  73.                                 Bandgap = Get_ADC10bitResult(2);        //讀外部基準TL431對應的ADC
  74.                                 Get_ADC10bitResult(3);                                //通道改變, 先讀一次并丟棄結果, 讓內部的采樣電容的電壓等于輸入值.
  75.                                 j = Get_ADC10bitResult(3);                        //讀外部電壓ADC
  76.                                 j = (u16)((u32)j * 250 / Bandgap);        //計算外部電壓, TL431電壓為2.50V, 測電壓分辨率0.01V
  77.                         #endif
  78.                         //==========================================================================

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

  87.                                 Get_ADC10bitResult(3);                                //通道改變, 先讀一次并丟棄結果, 讓內部的采樣電容的電壓等于輸入值.
  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);        //計算外部電壓, 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. // 函數: u16        Get_ADC10bitResult(u8 channel)
  113. // 描述: 查詢法讀一次ADC結果.
  114. // 參數: channel: 選擇要轉換的ADC.
  115. // 返回: 10位ADC結果.
  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結束標志
  126.         return        (((u16)ADC_RES << 2) | (ADC_RESL & 3));
  127. }


  128. /**************** 向HC595發送一個字節函數 ******************/
  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. }
復制代碼

ADC-使用外部TL431基準計算外部電壓.zip

58.51 KB, 下載次數: 33, 下載積分: 黑幣 -5

回復

使用道具 舉報

ID:98875 發表于 2019-12-5 14:08 | 顯示全部樓層
通道2和通道3的硬件怎么連?能給個參考圖嗎?謝謝!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产91丝袜在线播放 | 国产久 | 狠狠干天天干 | 亚洲精品一区二区在线观看 | www.av在线| 久久这里只有精品首页 | 国产精品免费高清 | 视频羞羞| 毛片免费视频 | 国产粉嫩尤物极品99综合精品 | 伊人精品 | 亚洲成人av在线播放 | 国产午夜精品久久久 | 一区二区三区 在线 | 9久久婷婷国产综合精品性色 | 成人av一区| 91成人精品视频 | 亚洲一区二区三区四区av | 又爽又黄axxx片免费观看 | 亚洲欧美第一视频 | 国产欧美精品一区二区三区 | 日韩欧美一二三区 | 国产成人精品一区二区三区在线 | h视频免费在线观看 | 国产日产精品一区二区三区四区 | 久久久精品一区 | 国产一区二区三区网站 | 国产精品一区在线 | 久久99精品久久久久 | 亚洲人成免费 | 国产视频精品区 | 国产男女视频 | 综合网在线 | 一级毛片免费 | 五月婷婷在线播放 | 91精品国产手机 | 国产精品欧美精品日韩精品 | 日韩欧美中文字幕在线视频 | 91精品国产一区二区三区 | 国产精品69毛片高清亚洲 | 中文字幕亚洲精品 |