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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4515|回復: 3
打印 上一主題 下一主題
收起左側

利用新增的ADC第九通道測量內部固定的測試內部BandGap參考電壓來計算工作電壓

[復制鏈接]
跳轉到指定樓層
樓主
ID:444712 發表于 2018-12-19 14:43 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式


   本示例在Keil開發環境下請選擇Intel的8058芯片型號進行編譯,若無特別說明,工作頻率一般為11.0592MHz


      ADC的第9通道是用來測試內部BandGap參考電壓的,由于內部BandGap參考電壓很穩定,不會隨芯片的工作電壓的改變而變化,所以可以通過測量內部BandGap參考電壓,然后通過ADC的值便可反推出VCC的電壓,從而用戶可以實現自己的低壓檢測功能.  
      ADC的第9通道的測量方法:首先將P1ASF初始化為0,即關閉所有P1口的模擬功能然后通過正常的ADC轉換的方法讀取第0通道的值,即可通過ADC的第9通道讀取當前內部BandGap參考電壓值.
     用戶實現自己的低壓檢測功能的實現方法:首先用戶需要在VCC很精準的情況下(比如5.0V),測量出內部BandGap參考電壓的ADC轉換值(比如為BGV5),并這個值保存到EEPROM中,然后在低壓檢測的代碼中,在實際VCC變化后,所測量出的內部BandGap參考電壓的ADC轉換值(比如為BGVx),通過計算公式: 實際VCC = 5.0V * BGV5 / BGVx,即可計算出實際的VCC電壓值,需要注意的是,第一步的BGV5的基準測量一定要精確.

實現的源程序如下:

#include "reg51.h"
#include "intrins.h"

#define FOSC    11059200L
#define BAUD    115200

typedef unsigned char BYTE;
typedef unsigned int WORD;

#define     URMD    0               //0:使用定時器2作為波特率發生器
                                    //1:使用定時器1的模式0(16位自動重載模式)作為波特率發生器
                                    //2:使用定時器1的模式2(8位自動重載模式)作為波特率發生器

sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;

sfr T2H   = 0xd6;                   //定時器2高8位
sfr T2L   = 0xd7;                   //定時器2低8位

sfr  AUXR       =   0x8e;           //輔助寄存器

sfr ADC_CONTR   =   0xBC;           //ADC控制寄存器
sfr ADC_RES     =   0xBD;           //ADC高8位結果
sfr ADC_LOW2    =   0xBE;           //ADC低2位結果
sfr P1ASF       =   0x9D;           //P1口第2功能控制寄存器

#define ADC_POWER   0x80            //ADC電源控制位
#define ADC_FLAG    0x10            //ADC完成標志
#define ADC_START   0x08            //ADC起始控制位
#define ADC_SPEEDLL 0x00            //540個時鐘
#define ADC_SPEEDL  0x20            //360個時鐘
#define ADC_SPEEDH  0x40            //180個時鐘
#define ADC_SPEEDHH 0x60            //90個時鐘

void InitUart();
void InitADC();
void SendData(BYTE dat);
BYTE GetADCResult();
void Delay(WORD n);
void ShowResult();

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;

    InitUart();                     //初始化串口
    InitADC();                      //初始化ADC

    while (1)
    {
        ShowResult();               //顯示ADC結果
    }
}

/*----------------------------
發送ADC結果到PC
----------------------------*/
void ShowResult()
{
    SendData(GetADCResult());       //顯示ADC高8位結果
//    SendData(ADC_LOW2);           //顯示低2位結果
}

/*----------------------------
讀取ADC結果
----------------------------*/
BYTE GetADCResult()
{
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | 0 | ADC_START;
    _nop_();                        //等待4個NOP
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉換完成
    ADC_CONTR &= ~ADC_FLAG;         //Close ADC

    P2 = ADC_RES;

    return ADC_RES;                 //返回ADC結果
}

/*----------------------------
初始化串口
----------------------------*/
void InitUart()
{
    SCON = 0x5a;                    //設置串口為8位可變波特率
#if URMD == 0
    T2L = 0xd8;                     //設置波特率重裝值
    T2H = 0xff;                     //115200 bps(65536-18432000/4/115200)
    AUXR = 0x14;                    //T2為1T模式, 并啟動定時器2
    AUXR |= 0x01;                   //選擇定時器2為串口1的波特率發生器
#elif URMD == 1
    AUXR = 0x40;                    //定時器1為1T模式
    TMOD = 0x00;                    //定時器1為模式0(16位自動重載)
    TL1 = 0xd8;                     //設置波特率重裝值
    TH1 = 0xff;                     //115200 bps(65536-18432000/4/115200)
    TR1 = 1;                        //定時器1開始啟動
#else
    TMOD = 0x20;                    //設置定時器1為8位自動重裝載模式
    AUXR = 0x40;                    //定時器1為1T模式
    TH1 = TL1 = 0xfb;               //115200 bps(256 - 18432000/32/115200)
    TR1 = 1;
#endif
}

/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
    P1ASF = 0x00;                   //不設置P1口為模擬口
    ADC_RES = 0;                    //清除結果寄存器
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
    Delay(2);                       //ADC上電并延時
}

/*----------------------------
發送串口數據
----------------------------*/
void SendData(BYTE dat)
{
    while (!TI);                    //等待前一個數據發送完成
    TI = 0;                         //清除發送標志
    SBUF = dat;                     //發送當前數據
}

/*----------------------------
軟件延時
----------------------------*/
void Delay(WORD n)
{
    WORD x;

    while (n--)
    {
        x = 5000;
        while (x--);
    }
}


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

使用道具 舉報

沙發
ID:1 發表于 2018-12-19 16:42 | 只看該作者
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
回復

使用道具 舉報

板凳
ID:56665 發表于 2019-7-13 16:18 | 只看該作者
測量出內部BandGap參考電壓的ADC轉換值,這個轉換值是ADC值還是電壓值?
回復

使用道具 舉報

地板
ID:378732 發表于 2019-8-31 18:00 | 只看該作者
這就是STC程序,你給搬這里了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品亚洲精品国产欧美kt∨ | 国产精品欧美大片 | 欧美激情一区 | 在线一区二区三区 | 欧美一级二级在线观看 | 亚洲色图综合 | 精品中文在线 | 国产精品久久久久久妇女6080 | 精品成人av | 午夜久久| 日韩av一区二区在线观看 | 影音先锋中文字幕在线观看 | 日韩欧美一区在线 | 久久亚洲一区二区三区四区 | 国产一级片在线观看视频 | 99在线观看 | 久久综合av | 一区二区三区回区在观看免费视频 | 在线黄色网 | 免费午夜视频 | 欧美精品一区在线发布 | 久久亚洲欧美日韩精品专区 | 欧美性精品 | 国产1区| 韩国精品在线 | 精品国产乱码久久久久久88av | 久久激情网 | 免费久久网站 | 中文字幕人成人 | 日韩成人在线观看 | 精品欧美一区二区精品久久久 | 国产在线资源 | 久久毛片 | 国产操操操 | 91精品国产一区二区三区蜜臀 | 日日夜夜天天 | 蜜桃视频在线观看免费视频网站www | 欧美激情网站 | 一区二区三区视频在线观看 | 国产精品久久久久久久久久久久午夜片 | 国产一区二区三区不卡av |