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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
樓主: 劉海龍
打印 上一主題 下一主題
收起左側

開源基于STC單片機內部基準mini電壓表—極簡設計創新制作

  [復制鏈接]
161#
ID:620993 發表于 2019-10-15 16:52 | 只看該作者
謝謝樓主,正需要
回復

使用道具 舉報

162#
ID:239055 發表于 2019-10-27 08:01 來自手機 | 只看該作者
謝謝了,龍哥
回復

使用道具 舉報

163#
ID:239055 發表于 2019-10-27 08:02 來自手機 | 只看該作者
等我做好了,再來請教
回復

使用道具 舉報

164#
ID:239055 發表于 2019-10-27 22:14 來自手機 | 只看該作者
p1.0只能用來測內部基準嗎?
回復

使用道具 舉報

165#
ID:632444 發表于 2019-11-3 10:25 來自手機 | 只看該作者
手上剛好有這個單片機,改天就試試,謝謝
回復

使用道具 舉報

166#
ID:64269 發表于 2019-11-7 12:23 | 只看該作者
學一習,學習一下.非常感謝
回復

使用道具 舉報

167#
ID:197178 發表于 2019-11-14 18:52 | 只看該作者
好小巧
回復

使用道具 舉報

168#
ID:644368 發表于 2019-11-19 18:58 | 只看該作者
下載來學習學習
回復

使用道具 舉報

169#
ID:24685 發表于 2019-12-22 21:22 | 只看該作者
龍哥每次都是精品
回復

使用道具 舉報

170#
ID:428400 發表于 2019-12-26 18:56 | 只看該作者
liu牛人,不知道STC的精度怎么樣
回復

使用道具 舉報

171#
ID:123732 發表于 2019-12-30 19:35 | 只看該作者
c20160526 發表于 2019-10-27 22:14
p1.0只能用來測內部基準嗎?

p1.0-p1.7都可以測外部電壓
回復

使用道具 舉報

172#
ID:127666 發表于 2020-1-10 13:15 | 只看該作者
不知道用431精度會不會更好
回復

使用道具 舉報

173#
ID:684413 發表于 2020-1-10 20:57 | 只看該作者
學習一下,電路簡單。
回復

使用道具 舉報

174#
ID:562099 發表于 2020-1-12 20:59 | 只看該作者
對于初學者,這也是最新款的單片機了,就是要這樣去學習啊,真是好論壇
回復

使用道具 舉報

175#
ID:623647 發表于 2020-1-14 16:32 | 只看該作者
下載學習一下
回復

使用道具 舉報

176#
ID:75864 發表于 2020-1-15 08:45 | 只看該作者
很好,感謝樓主分享!
回復

使用道具 舉報

177#
ID:136485 發表于 2020-1-15 15:10 | 只看該作者
測試能用,多謝分享,但是小數后一直跳動,加個104電容電壓就誤差大了
回復

使用道具 舉報

178#
ID:577329 發表于 2020-1-24 20:59 | 只看該作者
1123212143255 發表于 2016-11-3 04:02
做出來了,引腳可以任意改,非常好用。



怎么改?我都是16口的,麻煩講解一下。
回復

使用道具 舉報

179#
ID:283207 發表于 2020-2-1 23:06 | 只看該作者
STC15W408AS,學習一下
回復

使用道具 舉報

180#
ID:36359 發表于 2020-2-11 22:38 | 只看該作者
找了一圈 終于找到了,感謝樓主,發現樓主真的很有耐心,解答了網友各種問題。表示感謝!
回復

使用道具 舉報

181#
ID:51443 發表于 2020-4-8 07:57 | 只看該作者
把顯示部分這樣改了一下覺得更符合視覺習慣:
void disp()           //0.00V-30.0V
{
   unsigned int i;
   if(v>=10000)
      for(i=0;i<50;i++)
                {
         diplay_data (1,disdata[v/10000]);
         diplay_data (2,disdata[v%10000/1000]+0x80);
         diplay_data (3,disdata[v%1000/100]);
        }
        else if((10000>v)&&(v>80))                        
         for(i=0;i<50;i++)
          {
                diplay_data (1,disdata[v/1000]+0x80);
                diplay_data (2,disdata[v%1000/100]);
                diplay_data (3,disdata[v%100/10]);
          }
   else
            for(i=0;i<50;i++)
          {
                diplay_data (1,disdata[0]+0x80);
                diplay_data (2,disdata[0]);
                diplay_data (3,disdata[0]);
          }
}
回復

使用道具 舉報

182#
ID:311661 發表于 2020-4-13 17:36 | 只看該作者
很不錯的分享,支持一下
回復

使用道具 舉報

183#
ID:686739 發表于 2020-4-21 07:00 來自手機 | 只看該作者
謝謝分享
回復

使用道具 舉報

184#
ID:428400 發表于 2020-4-25 18:43 | 只看該作者
有仿制成功的朋友嗎?
回復

使用道具 舉報

185#
ID:537743 發表于 2020-4-25 22:05 | 只看該作者
好東西,謝謝分享!
回復

使用道具 舉報

186#
ID:738263 發表于 2020-4-26 18:30 | 只看該作者
亂跳,根本看不出是多少V??
回復

使用道具 舉報

187#
ID:738263 發表于 2020-4-26 18:33 | 只看該作者
電路一模一樣的搭建了,程序下載了。顯示亂眺??請問為何?
回復

使用道具 舉報

188#
ID:738263 發表于 2020-4-26 18:34 | 只看該作者
用的是STC15W408AS 35I   28DIP
回復

使用道具 舉報

189#
ID:600952 發表于 2020-4-27 15:24 | 只看該作者
好帖,基于STC單片機內部基準(Bandgap voltage reference)mini電壓表—極簡設計,非常詳細,精華!
成品小巧便攜,很實用,建議再加上量程檔位變化就更好了,不過這個30V量程已經夠用了
學習到了,謝謝分享!!!
回復

使用道具 舉報

190#
ID:779135 發表于 2020-6-14 17:18 | 只看該作者
好評,好用
回復

使用道具 舉報

191#
ID:766985 發表于 2020-6-16 09:14 | 只看該作者
收藏學習一下
回復

使用道具 舉報

192#
ID:491577 發表于 2020-6-18 10:28 | 只看該作者
這種電路只能用來學習,了解ADC是怎么回事,要想做電壓表誤差太大。首先10K分壓電阻太小,對要檢測的電壓影響很大,萬用表的分壓電阻是10M,舉個例子:兩個串聯的10K電阻,兩端接5V電壓,兩個電阻間的電壓應該是2.5V,如果用你的這個電路測量會是多少伏呢?認真想想,肯定不會是2.5V,如果是更大的電阻100K呢,誤差就更大了。
回復

使用道具 舉報

193#
ID:491577 發表于 2020-6-18 10:45 | 只看該作者
真正能用的電壓表必須要大于10M的分壓電阻,分壓電阻的大小是會影響到被測電路電壓的,并且要運算放大器做電壓跟隨,直接用ADC芯片測量電壓,測電池電壓沒問題,要測實際電路電壓只能呵呵。
回復

使用道具 舉報

194#
ID:554177 發表于 2020-8-13 17:39 | 只看該作者
不錯,正好做這個,收藏了
回復

使用道具 舉報

195#
ID:143767 發表于 2020-8-29 18:18 | 只看該作者
樓主你好,我想把3位數碼管的電壓顯示變成電量百分比顯示,比如鋰電池在4.2V的時候顯示100,在2.8V的時候顯示1,請問程序需要怎樣改?謝謝!
回復

使用道具 舉報

196#
ID:143767 發表于 2020-9-2 10:34 | 只看該作者
這帖子還是不錯的,可惜沒人頂快沉了,我想用這個做個電量指示裝置,不知程序如何修改,不知樓主還能否看到此貼。
回復

使用道具 舉報

197#
ID:66416 發表于 2021-7-11 22:20 | 只看該作者
樓主能不能改個共陽的程序?
或者在4LED_YIN.h中指明一下,怎樣修改?
回復

使用道具 舉報

198#
ID:951574 發表于 2021-7-12 11:24 | 只看該作者
電路簡潔,先收藏一下
回復

使用道具 舉報

199#
ID:66416 發表于 2021-7-13 01:21 | 只看該作者
@樓主,過來幫忙看一下,為什么我用的共陽極的,改了程序還是沒有顯示:
一、原理圖:
二、STC15ADC.c
/********************************************/
//2016.10.20日 1:01編寫完成
//作者:劉海龍 (讀單片機內部BandGap基準電壓值參考的STC官網程序)
//硬件:STC15W408AS+3位共陰數碼管+2個10K的電阻(1/4w)
//晶振無說明的情況選12M
//測量口P1.3
#include <STC15W.h>
#include <intrins.h>
#include<4LED_YIN.H>//數碼管驅動顯示程序
#include <BandGap.H>//包含讀單片機內部BandGap基準電壓值       
/********************************/
void main (void)
{        Delay20ms();//待系統穩定
    InitADC();//初始化ADC
    P1M1=0X08;//P1.3高阻輸入
          init();//IO口設置初始化
    while (1)
    {
        ShowResult(3);//顯示通道P1.3的測量值、單位為毫伏
                    disp();        //數碼管顯示電壓值
    }
}


三、4LED_YIN.H
/***********四位共陰數碼管驅動程序************/
//stc15w單片機
//1在主程序前加上初始化init();程序
//2硬件連接變動時需修改下面的參數
sbit H1        = P1^0;//設置第1位數碼管陽極連接的I/O口
sbit H2        = P1^1;//設置第2位數碼管陽極連接的I/O口
sbit H3        = P1^2;//設置第3位數碼管陽極連接的I/O口
//sbit H4        = P1^7;//設置第4位數碼管陽極連接的I/O口
sbit a        = P3^7;
sbit b        = P3^6;
sbit c        = P3^5;
sbit d        = P3^4;
sbit e        = P3^3;
sbit f        = P3^2;
sbit g        = P3^1;
sbit dp        = P3^0;
unsigned char PWM;//顯示亮度
unsigned int v;//定義測量電壓變量
#define P1M0SET                0x00 //設置I/O口工作方式//00000000(左到右,高到低位)
#define P1M1SET                0x00 //設置I/O口工作方式//00000000
#define P3M0SET                0xFF //設置I/O口工作方式//11111111
#define P3M1SET                0x00 //設置I/O口工作方式//00000000
/*****以上定義需要根據實際硬件情況更改******/
#define light                        9         //設置LED顯示的亮度(值域:1~9)
#define DELAY_L                12         //設置每一個點顯示的時間長度(1~20)
/********* 延時函數    ***************/
void delay (unsigned int a){ // 用于點掃描的延時
        unsigned int i;
        while( a-- != 0){
                for(i = 0; i < DELAY_L; i++);
        }                                     
}
/*********************************************************************************************/
unsigned char code disdata[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09}; //顯示0~9的段碼

//數碼管:負向位置;共陽極;負向連接

void dis_off (void){
        P3 = P3M0SET; //關所有顯示
        P1 = ~P1M0SET;
        delay(10-PWM);
}
/*********************************************************************************************/
void displayHH1 (unsigned char q){ //第1位數碼管顯示程序
        unsigned char i;
        i = q & 0x7F;
        if(i == 0x7F){
                H1 = 0;a = 0;}delay(PWM);dis_off();
        i = q & 0xBF;
        if(i == 0xBF){
                H1 = 0;b = 0;}delay(PWM);dis_off();
        i = q & 0xDF;
        if(i == 0xDF){
                H1 = 0;c = 0;}delay(PWM);dis_off();
        i = q & 0xEF;
        if(i == 0xEF){
                H1 = 0;d = 0;}delay(PWM);dis_off();
        i = q & 0xF7;
        if(i == 0xF7){
                H1 = 0;e = 0;}delay(PWM);dis_off();
        i = q & 0xFB;
        if(i == 0xFB){
                H1 = 0;f = 0;}delay(PWM);dis_off();
        i = q & 0xFD;
        if(i == 0xFD){
                H1 = 0;g = 0;}delay(PWM);dis_off();
        i = q & 0xFE;
        if(i == 0xFE){
                H1 = 0;dp = 0;}delay(PWM);dis_off();
}
/*********************************************************************************************/
void displayHH2 (unsigned char q){ //第2位數碼管顯示程序
        unsigned char i;
        i = q & 0x7F;
        if(i == 0x7F){
                H2 = 0;a = 0;}delay(PWM);dis_off();
        i = q & 0xBF;
        if(i == 0xBF){
                H2 = 0;b = 0;}delay(PWM);dis_off();
        i = q & 0xDF;
        if(i == 0xDF){
                H2 = 0;c = 0;}delay(PWM);dis_off();
        i = q & 0xEF;
        if(i == 0xEF){
                H2 = 0;d = 0;}delay(PWM);dis_off();
        i = q & 0xF7;
        if(i == 0xF7){
                H2 = 0;e = 0;}delay(PWM);dis_off();
        i = q & 0xFB;
        if(i == 0xFB){
                H2 = 0;f = 0;}delay(PWM);dis_off();
        i = q & 0xFD;
        if(i == 0xFD){
                H2 = 0;g = 0;}delay(PWM);dis_off();
        i = q & 0xFE;
        if(i == 0xFE){
                H2 = 0;dp = 0;}delay(PWM);dis_off();
}
/*********************************************************************************************/
void displayHH3 (unsigned char q){ //第3位數碼管顯示程序
        unsigned char i;
        i = q & 0x7F;
        if(i == 0x7F){
                H3 = 0;a = 0;}delay(PWM);dis_off();
        i = q & 0xBF;
        if(i == 0xBF){
                H3 = 0;b = 0;}delay(PWM);dis_off();
        i = q & 0xDF;
        if(i == 0xDF){
                H3 = 0;c = 0;}delay(PWM);dis_off();
        i = q & 0xEF;
        if(i == 0xEF){
                H3 = 0;d = 0;}delay(PWM);dis_off();
        i = q & 0xF7;
        if(i == 0xF7){
                H3 = 0;e = 0;}delay(PWM);dis_off();
        i = q & 0xFB;
        if(i == 0xFB){
                H3 = 0;f = 0;}delay(PWM);dis_off();
        i = q & 0xFD;
        if(i == 0xFD){
                H3 = 0;g = 0;}delay(PWM);dis_off();
        i = q & 0xFE;
        if(i == 0xFE){
                H3 = 0;dp = 0;}delay(PWM);dis_off();
}
void diplay_data (unsigned char l,unsigned char q){
                switch (l){//顯示的數碼管位置               
                                case 1://                       
                                        displayHH1(q); //將顯示數據送入               
                                        break;//               
                                case 2://                       
                                        displayHH2(q); //將顯示數據送入               
                                        break;//               
                                case 3://                       
                                        displayHH3(q); //將顯示數據送入               
                                        break;//
//                                case 4://                       
//                                        displayHH4(q); //將顯示數據送入               
//                                        break;//                       
                               
                }
}

/*****************IO口初始化**************************/
void init (void){       
                P3M1=P3M1SET;
                P3M0=P3M0SET;
                P1M0=P1M0SET;
                P1M1=P1M1SET;
                dis_off();
                PWM = light;}
/*******************************************/
/******************顯示程序*************************/
void disp(){
unsigned int i;
        for(i=0;i<50;i++){
                diplay_data (1,disdata[v/1000]+0x80);
                diplay_data (2,disdata[v%1000/100]);
                diplay_data (3,disdata[v%100/10]);
        }
}


四、BandGap.H
//內部BandGap為基準測電壓
//-----------------------------------------
#define  uchar unsigned char  
#define uint  unsigned int
unsigned int v;       
//ADC相關設定參數
#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個時鐘
//-----------------------------------------
//BandGap相關參數
//注意:需要在下載代碼時選擇"在ID號前添加重要測試參數"選項,才可在程序中獲取此參數
//#define ID_ADDR_ROM 0x03f7      //1K程序空間的MCU
//#define ID_ADDR_ROM 0x07f7      //2K程序空間的MCU
//#define ID_ADDR_ROM 0x0bf7      //3K程序空間的MCU
//#define ID_ADDR_ROM 0x0ff7      //4K程序空間的MCU
//#define ID_ADDR_ROM 0x13f7      //5K程序空間的MCU
#define ID_ADDR_ROM 0x1ff7      //8K程序空間的MCU
//#define ID_ADDR_ROM 0x27f7      //10K程序空間的MCU
//#define ID_ADDR_ROM 0x2ff7      //12K程序空間的MCU
//#define ID_ADDR_ROM 0x3ff7      //16K程序空間的MCU
//#define ID_ADDR_ROM 0x4ff7      //20K程序空間的MCU
//#define ID_ADDR_ROM 0x5ff7      //24K程序空間的MCU
//#define ID_ADDR_ROM 0x6ff7      //28K程序空間的MCU
//#define ID_ADDR_ROM 0x7ff7      //32K程序空間的MCU
//#define ID_ADDR_ROM 0x9ff7      //40K程序空間的MCU
//#define ID_ADDR_ROM 0xbff7      //48K程序空間的MCU
//#define ID_ADDR_ROM 0xcff7      //52K程序空間的MCU
//#define ID_ADDR_ROM 0xdff7      //56K程序空間的MCU
//#define ID_ADDR_ROM 0xeff7      //60K程序空間的MCU


//-----------------------------------------
//聲明

void Delay20ms()                //@12.000MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 1;
        j = 234;
        k = 113;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}


/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
           P1ASF = 0x00;                   //不設置P1口為AD口
    ADC_RES = 0;                    //清除結果寄存器
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
        Delay20ms();
}
/*----------------------------
讀取ADC結果
----------------------------*/
uint GetADCResult(uchar ch)
{
    uint ADC_10BIT_RES;
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
    _nop_();                        //等待4個NOP
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉換完成
    ADC_CONTR &= ~ADC_FLAG;         //關閉 ADC
    ADC_10BIT_RES=ADC_RES;      //得到高8位
    ADC_10BIT_RES<<=2;
    ADC_10BIT_RES+=ADC_RESL;     //得到低2位
    return ADC_10BIT_RES;                 //返回ADC結果

}

/*----------------------------
發送ADC結果
----------------------------*/
void ShowResult(uchar ch)
{
    uint adc_res10,//測量設定通道adc值
    bandgap,       //bandgap預儲存校準值,單位毫伏
    adc_9gallery_res; //測量第九通道(bandgap)值
    float power_voltage,        //系統供電電壓,單位毫伏
    ADC_voltage;     //設定通道電壓值,單位毫伏

    uchar  code *cptr; //定義ROM(代碼)區指針
    //uchar  idata *iptr;//定義RAM(內存)區指針

    cptr = ID_ADDR_ROM;         //從程序區讀取BandGap電壓值(單位:毫伏mV)
    bandgap=*cptr++;
    bandgap<<=8;
    bandgap+=*cptr;
    /*iptr = ID_ADDR_RAM;         //從內存區讀取BandGap電壓值(單位:毫伏mV)
    bandgap=*iptr++;              //兩種方法結果一樣,上面的方法需要在下載式勾選"在ID號前添加重要測試參數"選項,才可在程序中獲取此參數
    bandgap<<=8;                  //下面的方法不需要
    bandgap+=*iptr;    */
    //測量設定通道adc值
    ADC_RES = 0;                    //清除結果寄存器
    P1ASF = 0x08;                   //設置P1.3口為AD口
    GetADCResult(ch);
    GetADCResult(ch);                 //讀三次獲得穩定
    adc_res10= GetADCResult(ch);
    //測量第九通道(bandgap)值
    ADC_RES = 0;                    //清除結果寄存器
    P1ASF = 0x00;                   //設置讀第九通道
    GetADCResult(0);                 //測bandgap時,調用此函數時通道數只能填0
    GetADCResult(0);                 //讀三次獲得穩定
    adc_9gallery_res=GetADCResult(0);
    //計算系統供電電壓
    power_voltage=(float)bandgap*1024/adc_9gallery_res;
    //計算ADC通道測得電壓值
    ADC_voltage=(float)bandgap*adc_res10/adc_9gallery_res;
        v=ADC_voltage;
        v=v*2;
}


原理圖.jpg (185.98 KB, 下載次數: 998)

原理圖

原理圖
回復

使用道具 舉報

200#
ID:53978 發表于 2021-7-13 08:33 | 只看該作者
留個記號 有時間了來學習一下,謝謝大神們。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线日韩视频 | 一区二区成人 | 亚洲精品色 | 黄色一级毛片 | 久久久国产一区 | 欧美日韩一区在线 | 国产一区在线免费 | 中文字幕第十一页 | 国产中文一区二区三区 | 小川阿佐美pgd-606在线 | 欧美一级免费片 | 欧美色999 | 日韩中文字幕av | 中文字幕加勒比 | 久久国产亚洲 | 亚洲一区二区三区在线播放 | 久久国产视频网 | 久久久久久久久久爱 | 九九亚洲 | 日韩久久网 | 久久精品小短片 | 99热首页 | 久久精品视频在线免费观看 | 少妇特黄a一区二区三区88av | 成人亚洲精品 | 亚洲高清在线 | 国产精久久久久久久妇剪断 | 日韩欧美亚洲 | 国产伦一区二区三区四区 | 日韩欧美精品一区 | 国产一级免费视频 | 国产在线精品一区二区 | 欧美一区永久视频免费观看 | 毛片免费在线 | 啪啪免费 | 日韩精品一区二区三区视频播放 | 亚州成人 | 午夜寂寞影院列表 | 色综合久久88色综合天天 | 91在线精品视频 | 欧美日韩在线一区 |