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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機制作的電流表檢測不顯示問題

[復制鏈接]
回帖獎勵 10 黑幣 回復本帖可獲得 10 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主
ID:1001745 發表于 2022-6-10 15:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
根據壇內某位大師制作的電流電壓溫度表,自己也照葫蘆畫瓢畫了一個,軟件稍微修改了一下,通電后溫度,電壓經過調試整體顯示正常。唯獨在檢測電流時發現運放的輸入和輸出電壓都正常。就是不顯示實際電流值,程序看了幾天反復改了幾次都不行。現發帖求助,看有沒有大師幫忙指正一下;由于代碼過長發不出去所以設置了回帖獎勵10金幣。

AV METER.rar

57.39 KB, 下載次數: 14

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

使用道具 舉報

沙發
ID:170318 發表于 2022-6-10 15:47 | 只看該作者
下載下來瞧瞧哪里問題
回復

使用道具 舉報

板凳
ID:170318 發表于 2022-6-10 16:10 | 只看該作者
初步看了一下,程序中ADC初始化有問題,只有檢測電壓的P1.0設為高阻
回復

使用道具 舉報

地板
ID:170318 發表于 2022-6-10 16:21 | 只看該作者
ADC采樣時的轉換通道“ch”是怎么轉換的?這里也有問題的
/******************************
函數說明:查詢方式讀取ADC轉換結果
入口參數:ch  ADC采樣通道
出口參數:int ADC_RES ADC轉換結果
******************************/
unsigned int Get_ADC_Result(unsigned char ch)
{
        unsigned int result;
        ADC_RES = 0;       
        ADC_RESL= 0;                                        //清掉ADC轉換結果寄存器
        ADC_CONTR =ADC_POWER|ADC_SPEED3|ch|ADC_START;//配置ADC,設置轉換通道,啟動轉換
    _nop_();        _nop_();
    _nop_();        _nop_();                        //等待設置ADC_POWER完畢
    while (!(ADC_CONTR & ADC_FLAG));//讀取轉換完畢標志位ADC_FLAG
    ADC_CONTR &= ~ADC_FLAG;         //清除ADC_FLAG標志位
        result = ADC_RES<<2|ADC_RESL;        //讀取10位轉換結果保存到result
    return result;                  //返回ADC轉換結果10位
}
回復

使用道具 舉報

5#
ID:1001745 發表于 2022-6-10 17:03 | 只看該作者
#include "STC15W408AS.H"
#include "inerins.h"

#define ADC_POWER        0x80        //ADC電源控制位
#define ADC_FLAG        0x10        //ADC完成標志位
#define ADC_START        0x08        //ADC啟動控制位
#define ADC_SPEED0        0x00        //ADC轉換速度,一次轉換需要540個時鐘
#define ADC_SPEED1        0x20        //ADC轉換速度,一次轉換需要360個時鐘
#define ADC_SPEED2        0x40        //ADC轉換速度,一次轉換需要180個時鐘
#define ADC_SPEED3        0x60        //ADC轉換速度,一次轉換需要90個時鐘

#define N 8        //ADC采樣使用遞推平均濾波算法,采樣次數

sbit lcdrs=P3^2;        //LCD1602指令和數據寄存器選擇,高電平時為數據,低電平選擇命令
sbit lcdrw=P3^3;        //LCD1602讀寫選擇,高電平為讀,低電平為寫
sbit lcden=P3^4;    //LCD1602使能
unsigned char Show[3]={0,0,0};        //顯示數組A
unsigned char Show1[3]={0,0,0};        //顯示數組uA
unsigned int  Temp_Buf[N+1];
unsigned char Show2[4]={0,0,0,0};        //顯示數組溫度
unsigned char Show3[3]={0,0,0};        //顯示數組電壓
unsigned int xdata ADC_Buf[N+1];                //采樣數組A
unsigned int xdata ADC_Buf2[N+1];        //采樣數值uA
unsigned int xdata Voltage_Buf[N+1];        //采樣數組電池電壓
unsigned int current=0;                        //采樣安值
unsigned int current2=0;                //采樣微安值
unsigned int tempresult=0;                //采樣溫度值
unsigned int voltageresult=0;                //采樣電壓值0-80V
unsigned char num,ADCcount=0,ADCcount2=0,ADCcount3=0,ADCcount4=0;        //ADC采樣次數變量
unsigned char hour=0,minute=0,second=0,time_count=0,time_count2=0,time_count3;
bit flag_400ms=1,flag_1s=1,flag_5s=1;
//unsigned char code table1[]="CURRENT1:";
//unsigned char code table2[]="CURRENT2:";

/*************************************
NTC阻值與溫度關系表
Vcc---NTC(±1%)---R(10K±1%)---GND
                |
              ADC端子
NTC使用MF52-103/3435;10K±1%精度;B值:3435±1%
**************************************/
unsigned int code NTCcode[] = {
/*ADC采樣值****溫度值*******電阻值**********/       
        0x033,        // -40.00                190.5562
        0x034,        // -39.00                183.4132
        0x037,        // -38.00                175.6740
        0x039,        // -37.00                167.6467
        0x03c,        // -36.00                159.5647
        0x03f,        // -35.00                151.5975
        0x042,        // -34.00                143.8624
        0x045,        // -33.00                136.4361
        0x049,        // -32.00                129.3641
        0x04d,        // -31.00                122.6678
        0x050,        // -30.00                116.3519
        0x054,        // -29.00                110.4098
        0x059,        // -28.00                104.8272
        0x05d,        // -27.00                99.5847
        0x061,        // -26.00                94.6608
        0x066,        // -25.00                90.0326
        0x06a,        // -24.00                85.6778
        0x06f,        // -23.00                81.5747
        0x074,        // -22.00                77.7031
        0x079,        // -21.00                74.0442
        0x07e,        // -20.00                70.5811
        0x084,        // -19.00                67.2987
        0x089,        // -18.00                64.1834
        0x08f,        // -17.00                61.2233
        0x095,        // -16.00                58.4080
        0x09b,        // -15.00                55.7284
        0x0a1,        // -14.00                53.1766
        0x0a8,        // -13.00                50.7456
        0x0af,        // -12.00                48.4294
        0x0b5,        // -11.00                46.2224
        0x0bd,        // -10.00                44.1201
        0x0c4,        // -9.00                42.1180
        0x0cb,        // -8.00                40.2121
        0x0d3,        // -7.00                38.3988
        0x0db,        // -6.00                36.6746
        0x0e3,        // -5.00                35.0362
        0x0eb,        // -4.00                33.4802
        0x0f3,        // -3.00                32.0035
        0x0fb,        // -2.00                30.6028
        0x0104,        // -1.00                29.2750
        0x010d,        // 0.00                28.0170
        0x0115,        // 1.00                26.8255
        0x011e,        // 2.00                25.6972
        0x0127,        // 3.00                24.6290
        0x0130,        // 4.00                23.6176
        0x0139,        // 5.00                22.6597
        0x0142,        // 6.00                21.7522
        0x014b,        // 7.00                20.8916
        0x0154,        // 8.00                20.0749
        0x015d,        // 9.00                19.2988
        0x0166,        // 10.00                18.5600
        0x0167,        // 11.00                18.4818
        0x016b,        // 12.00                18.1489
        0x0172,        // 13.00                17.6316
        0x017b,        // 14.00                16.9917
        0x0185,        // 15.00                16.2797
        0x0190,        // 16.00                15.5350
        0x019c,        // 17.00                14.7867
        0x01a9,        // 18.00                14.0551
        0x01b6,        // 19.00                13.3536
        0x01c2,        // 20.00                12.6900
        0x01cf,        // 21.00                12.0684
        0x01dc,        // 22.00                11.4900
        0x01e8,        // 23.00                10.9539
        0x01f4,        // 24.00                10.4582
        0x01ff,        // 25.00                10.0000
        0x020a,        // 26.00                9.5762
        0x0215,        // 27.00                9.1835
        0x021f,        // 28.00                8.8186
        0x0229,        // 29.00                8.4784
        0x0233,        // 30.00                8.1600
        0x023c,        // 31.00                7.8608
        0x0245,        // 32.00                7.5785
        0x024e,        // 33.00                7.3109
        0x0257,        // 34.00                7.0564
        0x0260,        // 35.00                6.8133
        0x0268,        // 36.00                6.5806
        0x0271,        // 37.00                6.3570
        0x0279,        // 38.00                6.1418
        0x0282,        // 39.00                5.9343
        0x028a,        // 40.00                5.7340
        0x0292,        // 41.00                5.5405
        0x029a,        // 42.00                5.3534
        0x02a2,        // 43.00                5.1725
        0x02aa,        // 44.00                4.9976
        0x02b1,        // 45.00                4.8286
        0x02b9,        // 46.00                4.6652
        0x02c1,        // 47.00                4.5073
        0x02c8,        // 48.00                4.3548
        0x02d0,        // 49.00                4.2075
        0x02d7,        // 50.00                4.0650
        0x02de,        // 51.00                3.9271
        0x02e5,        // 52.00                3.7936
        0x02ec,        // 53.00                3.6639
        0x02f3,        // 54.00                3.5377
        0x02fa,        // 55.00                3.4146
        0x0301,        // 56.00                3.2939
        0x0308,        // 57.00                3.1752
        0x030f,        // 58.00                3.0579
        0x0316,        // 59.00                2.9414
        0x031d,        // 60.00                2.8250
        0x0320,        // 61.00                2.7762
        0x0324,        // 62.00                2.7179
        0x0328,        // 63.00                2.6523
        0x032d,        // 64.00                2.5817
        0x0331,        // 65.00                2.5076
        0x0336,        // 66.00                2.4319
        0x033b,        // 67.00                2.3557
        0x0341,        // 68.00                2.2803
        0x0346,        // 69.00                2.2065
        0x034b,        // 70.00                2.1350
        0x034f,        // 71.00                2.0661
        0x0354,        // 72.00                2.0004
        0x0358,        // 73.00                1.9378
        0x035d,        // 74.00                1.8785
        0x0361,        // 75.00                1.8225
        0x0365,        // 76.00                1.7696
        0x0368,        // 77.00                1.7197
        0x036c,        // 78.00                1.6727
        0x036f,        // 79.00                1.6282
        0x0372,        // 80.00                1.5860
        0x0376,        // 81.00                1.5458
        0x0378,        // 82.00                1.5075
        0x037b,        // 83.00                1.4707
        0x037e,        // 84.00                1.4352
        0x0381,        // 85.00                1.4006
        0x0383,        // 86.00                1.3669
        0x0386,        // 87.00                1.3337
        0x0389,        // 88.00                1.3009
        0x038b,        // 89.00                1.2684
        0x038e,        // 90.00                1.2360
        0x0391,        // 91.00                1.2037
        0x0393,        // 92.00                1.1714
        0x0396,        // 93.00                1.1390
        0x0399,        // 94.00                1.1067
        0x039b,        // 95.00                1.0744
        0x039e,        // 96.00                1.0422
        0x03a1,        // 97.00                1.0104
        0x03a3,        // 98.00                0.9789
        0x03a6,        // 99.00                0.9481
        0x03a8,        // 100.00                0.9180
        0x03ab,        // 101.00                0.8889
        0x03ad,        // 102.00                0.8610
        0x03b0,        // 103.00                0.8346
        0x03b2,        // 104.00                0.8099
        0x03b4,        // 105.00                0.7870
        0x03b6,        // 106.00                0.7665
        0x03b7,        // 107.00                0.7485
        0x03b9,        // 108.00                0.7334
        0x03ba,        // 109.00                0.7214
        0x03ba        // 110.00                0.7130
};

/******************************
函數說明:延時函數,執行一次1毫秒,STC_ISP軟件給出 @6MHz 1T單片機
入口參數:ms=延時毫秒數
出口參數:無
******************************/
void Delay_MS(unsigned int ms)
{
        unsigned char i, j;
        while(ms--)
        {
                i = 6;        j = 211;
                do{
                        while (--j);
                } while (--i);
        }
}

/******************************
函數說明:LCD1602驅動
******************************/
void write_com(unsigned char com)
{
        lcdrs=0;                 //rs低電平為寫命令
        P2=com;                         
        Delay_MS(5);
        lcden=1;                 //EN先置高電平
        Delay_MS(5);
        lcden=0;                 //短暫延時后EN置低電平
}
void write_dat(unsigned char dat)
{
        lcdrs=1;                 //rs高電平為寫數據
        P2=dat;
        Delay_MS(5);
        lcden=1;
        Delay_MS(5);
        lcden=0;
}
/******************************
函數說明:初始化ADC寄存器
******************************/
void Init_ADC(void)
{
    P1M1 |= 0x01;
        P1M0 &= ~1;                        //設P1.0為高阻輸入。因3.3V電源很精確,暫未使用2.5V基準電壓源。
        P1ASF = 0x0f;                //打開P1.0,P1.1,P1.2和P1.3口的ADC功能
        ADC_RES = 0;       
        ADC_RESL= 0;                //清掉ADC轉換結果寄存器
    ADC_CONTR = ADC_POWER | ADC_SPEED3;        //使能A/D供電,設置轉換速度90T
}

/******************************
函數說明:定時器0初始化,12T自動重裝模式,定時50毫秒
******************************/
void Timer0Init(void)                //50毫秒@6.000MHz
{
        AUXR &= 0x7F;                //定時器時鐘12T模式
        TMOD &= 0xF0;                //設置定時器模式
        TL0 = 0x58;                //設置定時初值
        TH0 = 0x9E;                //設置定時初值
        TF0 = 0;                //清除TF0標志
        TR0 = 1;                //定時器0開始計時
}

/******************************
函數說明:LCD1602初始化
******************************/
void LCD1602_Init(void)
{
        lcdrw=0;
        lcden=0;
        P2=0;
        write_com(0x38);   //設置顯示模式為兩行5*8顯示
        write_com(0x0C);   //初始化,開顯示
        write_com(0x06);   //初始化,讀寫一個字符后地址指針自動加1
        write_com(0x01);   //清屏

/***********************************************/
        write_com(0x40);                //自定義字符電量滿,使用0x00自定義位置
        write_dat(0x00);                //編碼 0x00,0x0c,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E
        write_dat(0x0C);               
        write_dat(0x1E);               
        write_dat(0x1E);               
        write_dat(0x1E);               
        write_dat(0x1E);               
        write_dat(0x1E);               
        write_dat(0x1E);
/***********************************************/
        write_com(0x48);        //自定義字符電量75%,使用0x01自定義位置
        write_dat(0x00);                //編碼 0x00,0x0c,0x1E,0x12,0x1E,0x1E,0x1E,0x1E
        write_dat(0x0C);               
        write_dat(0x1E);               
        write_dat(0x12);               
        write_dat(0x1E);               
        write_dat(0x1E);               
        write_dat(0x1E);               
        write_dat(0x1E);
/***********************************************/
        write_com(0x50);        //自定義字符電量50%,使用0x02自定義位置
        write_dat(0x00);                //編碼 0x00,0x0c,0x1E,0x12,0x12,0x1E,0x1E,0x1E
        write_dat(0x0C);               
        write_dat(0x1E);               
        write_dat(0x12);               
        write_dat(0x12);               
        write_dat(0x1E);               
        write_dat(0x1E);               
        write_dat(0x1E);
/***********************************************/
        write_com(0x58);        //自定義字符電量25%,使用0x03自定義位置
        write_dat(0x00);                //編碼 0x00,0x0c,0x1E,0x12,0x12,0x12,0x1E,0x1E
        write_dat(0x0C);               
        write_dat(0x1E);               
        write_dat(0x12);               
        write_dat(0x12);               
        write_dat(0x12);               
        write_dat(0x1E);               
        write_dat(0x1E);
/***********************************************/
        write_com(0x58);        //自定義字符電量0%,使用0x04自定義位置
        write_dat(0x00);                //編碼 0x00,0x0c,0x1E,0x12,0x12,0x12,0x12,0x1E
        write_dat(0x0C);               
        write_dat(0x1E);               
        write_dat(0x12);               
        write_dat(0x12);               
        write_dat(0x12);               
        write_dat(0x12);               
        write_dat(0x1E);
/***********************************************/

        write_com(0x80);   //數據地址指針從0開始
}
/******************************
函數說明:查詢方式讀取ADC轉換結果
入口參數:ch  ADC采樣通道
出口參數:int ADC_RES ADC轉換結果
******************************/
unsigned int Get_ADC_Result(unsigned char ch)
{
        unsigned int result;
        ADC_RES = 0;       
        ADC_RESL= 0;                                        //清掉ADC轉換結果寄存器
        ADC_CONTR =ADC_POWER|ADC_SPEED3|ch|ADC_START;//配置ADC,設置轉換通道,啟動轉換
    _nop_();        _nop_();
    _nop_();        _nop_();                        //等待設置ADC_POWER完畢
    while (!(ADC_CONTR & ADC_FLAG));//讀取轉換完畢標志位ADC_FLAG
    ADC_CONTR &= ~ADC_FLAG;         //清除ADC_FLAG標志位
        result = ADC_RES<<2|ADC_RESL;        //讀取10位轉換結果保存到result
    return result;                  //返回ADC轉換結果10位
}

/******************************
函數說明:獲取溫度值
入口參數:無
出口參數:無
******************************/
void Get_Temp(void)
{
        unsigned char xx;
        unsigned int sum,tempvalue;
        sum = tempvalue =0;       
        Temp_Buf[N]=Get_ADC_Result(0);        //將ADC轉換結果放數組最高位
        if( ++ADCcount3 < 8)                //采樣初期不使用濾波算法
        {       
                for(xx=0;xx<N;xx++)        //準備濾波算法的數據
                {
                        Temp_Buf[xx]=Temp_Buf[xx+1];//所有數據循環左移
                }
                tempvalue=Temp_Buf[N];//采樣初期使用當前采樣值
        }
        else         //只有采樣次數大于8次以后才使用濾波算法       
        {
                ADCcount3=8;        //采樣次數超過8次后,固定設置為8
                for(xx=0;xx<N;xx++)        //濾波算法
                {
                        Temp_Buf[xx]=Temp_Buf[xx+1];//所有數據循環左移
                        sum+=Temp_Buf[xx];        //求和
                }
                tempvalue=sum/N;                //求平均值               
        }       
        xx=0;
        while( tempvalue > NTCcode[xx] )        //將當前溫度值與溫度表對比,得到所在位置
        {        xx++;        }

        tempvalue=xx*10 + (tempvalue*10 - NTCcode[xx-1]*10)/( NTCcode[xx] - NTCcode[xx-1] );
        //插值法計算溫度,將數據全部擴大10倍,使小數變為整數

        //tempvalue=tempvalue-30;//修正溫度,比正常高3.0度(擴大10倍為30)
        tempresult=tempvalue;
}

/******************************
函數說明:顯示溫度值
******************************/
void Display_temp(void)
{
        if(tempresult>400)        //正溫度(大于0度)
        {
                tempresult=tempresult-400;        //取得0°以上溫度
                if(tempresult>999)//大于100度顯示最高位
                        Show2[0]=0x30+(tempresult/1000);
                else                         //小于100度不顯示最高位
                        Show2[0]=' ';
                Show2[1]=0x30+(tempresult%1000/100);        //十位
                Show2[2]=0x30+(tempresult%100/10);   //個位,后面要加小數點
                Show2[3]=0x30+(tempresult%10);            //小數位
                write_com(0x80+0x09);                                //第一行第11個字符
                write_dat(Show2[0]);
                write_dat(Show2[1]);
                write_dat(Show2[2]);
                write_dat('.');
                write_dat(Show2[3]);
                write_dat(0xDF); write_dat('C');

        }
        else        //負溫度(小于0度)
        {
                tempresult=410-tempresult;        //取得0°以下溫度
                //插值法計算溫度,將數據全部擴大10倍,使小數變為整數,+5是四舍五入
                Show2[0]='-';                //顯示負號-
                Show2[1]=0x30+(tempresult/100);          //十位
                Show2[2]=0x30+(tempresult%100/10); //個位,后面要加小數點
                Show2[3]=0x30+(tempresult%10);          //小數位
                write_com(0x80+0x09);                                //第一行第11個字符
                write_dat(Show2[0]);
                write_dat(Show2[1]);
                write_dat(Show2[2]);
                write_dat('.');
                write_dat(Show2[3]);
                write_dat(0xDF); write_dat('C');
        }
}

/******************************
函數說明:獲取A值
******************************/
void Get_Current1(void)
{
        unsigned char xx;
        unsigned int sum,currentvalue;
        sum = currentvalue =0;       
        ADC_Buf[N]=Get_ADC_Result(2);        //將ADC轉換結果放數組最高位
        if( ++ADCcount < 8)                //采樣初期不使用濾波算法
        {       
                for(xx=0;xx<N;xx++)        //準備濾波算法的數據
                {
                        ADC_Buf[xx]=ADC_Buf[xx+1];//所有數據循環左移
                }
                currentvalue=ADC_Buf[N];//采樣初期使用當前采樣值
        }
        else         //只有采樣次數大于8次以后才使用濾波算法       
        {
                ADCcount=8;        //采樣次數超過8次后,固定設置為8
                for(xx=0;xx<N;xx++)        //濾波算法
                {
                        ADC_Buf[xx]=ADC_Buf[xx+1];//所有數據循環左移
                        sum+=ADC_Buf[xx];        //求和
                }
                currentvalue=sum/N;                //求平均值               
        }       
        currentvalue=currentvalue*0.003288; //ADC平均值轉化成A電流值
        if(currentvalue<=2)
                currentvalue=0;
        if(currentvalue>2)
                currentvalue=currentvalue-2;         //實測零點漂移了2~3mA
        if(currentvalue<=2)                                         //顯示門檻
                currentvalue=0;
        current=currentvalue;
}
                                                                       
/******************************
函數說明:顯示A值
******************************/
void Display_A(void)
{
        if(current<=2)
        {
                Show[0]=current%1000/100;                //電流值百位
                Show[1]=current%100/10;        //電流值十位
                Show[2]=current%10;                //電流值個位
                write_com(0xC0+0x02);                        //第1行第10個字符開始顯示
                if(Show[0]>0)                                       
                        write_dat(0x30+Show[0]);        //寫電流值百位
                else
                        write_dat(' ');
                if((Show[0]==0)&&(Show[1]==0))
                        write_dat(' ');                                //寫電流值十位
                else
                        write_dat(0x30+Show[1]);
                write_dat(0x30+Show[2]);                //寫電流值個位
                write_dat(' ');
                write_dat('A');
        }
        else                                                           //超量程顯示"999"
        {
                write_com(0xC0+0x02);
                write_dat('9');
                write_dat('9');
                write_dat('9');
                write_dat(' ');
                write_dat('A');       
        }
}

/******************************
函數說明:獲取uA值
******************************/
void Get_Current2(void)
{
        unsigned char xx;
        unsigned int sum,currentvalue;
        sum = currentvalue =0;       
        ADC_Buf2[N]=Get_ADC_Result(1);        //將ADC轉換結果放數組最高位
        if( ++ADCcount2 < 8)                //采樣初期不使用濾波算法
        {       
                for(xx=0;xx<N;xx++)        //準備濾波算法的數據
                {
                        ADC_Buf2[xx]=ADC_Buf2[xx+1];//所有數據循環左移
                }
                currentvalue=ADC_Buf2[N];//采樣初期使用當前采樣值
        }
        else         //只有采樣次數大于8次以后才使用濾波算法       
        {
                ADCcount2=8;        //采樣次數超過8次后,固定設置為8
                for(xx=0;xx<N;xx++)        //濾波算法
                {
                        ADC_Buf2[xx]=ADC_Buf2[xx+1];//所有數據循環左移
                        sum+=ADC_Buf2[xx];        //求和
                }
                currentvalue=sum/N;                //求平均值               
        }       
        currentvalue=currentvalue*0.6445; //ADC平均值轉化成uA電流值
        if(currentvalue<15) currentvalue=0;
        if(currentvalue>=15)
                currentvalue=currentvalue-15;         //實測零點漂移了15uA
        if(currentvalue<=3)                                         //顯示門檻
                currentvalue=0;
        current2=currentvalue;
}

/******************************
函數說明:顯示uA值
******************************/
void Display_uA(void)
{
        if(current2<=400)
        {
                Show1[0]=current2%1000/100;                //電流值百位
                Show1[1]=current2%100/10;                //電流值十位
                Show1[2]=current2%10;                        //電流值個位
                write_com(0xC0+0x0A);                        //第2行第10個字符開始顯示
                if(Show1[0]>0)                                       
                        write_dat(0x30+Show1[0]);        //寫電流值百位
                else
                        write_dat(' ');
                if((Show1[0]==0)&&(Show1[1]==0))
                        write_dat(' ');                                //寫電流值十位
                else
                        write_dat(0x30+Show1[1]);
                write_dat(0x30+Show1[2]);                //寫電流值個位
                write_dat(' ');
                write_dat('u');
                write_dat('A');
        }
        else                                                           //超量程顯示"999"
        {
                write_com(0xC0+0x0A);
                write_dat('9');
                write_dat('9');
                write_dat('9');
                write_dat(' ');
                write_dat('u');
                write_dat('A');       
        }
}

/******************************
函數說明:獲取電池電壓值
******************************/
void Get_voltage(void)
{
        unsigned char xx;
        unsigned int sum,voltagevalue;
        sum = voltagevalue =0;       
        Voltage_Buf[N]=Get_ADC_Result(3);        //將ADC轉換結果放數組最高位
        if( ++ADCcount4 < 8)                //采樣初期不使用濾波算法
        {       
                for(xx=0;xx<N;xx++)        //準備濾波算法的數據
                {
                        Voltage_Buf[xx]=Voltage_Buf[xx+1];//所有數據循環左移
                }
                voltagevalue=Voltage_Buf[N];//采樣初期使用當前采樣值
        }
        else         //只有采樣次數大于8次以后才使用濾波算法       
        {
                ADCcount4=8;        //采樣次數超過8次后,固定設置為8
                for(xx=0;xx<N;xx++)        //濾波算法
                {
                        Voltage_Buf[xx]=Voltage_Buf[xx+1];//所有數據循環左移
                        sum+=Voltage_Buf[xx];        //求和
                }
                voltagevalue=sum/N;                //求平均值               
        }       
        voltagevalue=voltagevalue*155.3; //ADC平均值轉化成電池電壓值mV
        if(voltageresult>=400)
                voltageresult=voltagevalue-400;         //修正誤差
        else
                voltageresult=0;
}

/******************************
函數說明:顯示電壓值
******************************/
void Display_voltage(void)
{

        Show3[0]=voltageresult/10000;         //電壓值十位,單位V
        Show3[1]=voltageresult%10000/1000; //電壓值個位,單位V
        Show3[2]=voltageresult%1000/100;        //電壓值小數位
        write_com(0x80+0x01);                        //第2行第1個字符開始顯示                                       
        if(Show3[0]>0)
                write_dat(0x30+Show3[0]);        //電壓值十數
        else if(Show3[0]==0)
                write_dat(' ');
        write_dat(0x30+Show3[1]);        //電壓值個數位
        write_dat('.');                                //電壓值小數點
        write_dat(0x30+Show3[2]);        //電壓值小數位
        write_dat('V');

/*
        write_com(0xC0+0x00);                        //第2行第1個字符開始顯示
        if(voltageresult>=880)
                write_dat(0x00);                        //電池電壓大于8.8V顯示滿格4格電量
        else if(voltageresult<880&&voltageresult>=770)
                write_dat(0x01);                        //電池電壓介于8.8V和7.7V之間顯示3格電量
        else if(voltageresult<770&&voltageresult>=720)
                write_dat(0x02);                        //電池電壓介于7.7V和7.2V之間顯示2格電量
        else if(voltageresult<720&&voltageresult>=600)
                write_dat(0x03);                        //電池電壓介于7.2V和6.0V之間顯示1格電量
        else if(voltageresult<600)
                write_dat(0x04);                        //電池電壓小于6.0V顯示0格電量
*/
}


void main(void)
{
        Init_ADC();                                //初始化ADC
        LCD1602_Init();                        //初始化LCD1602
        Timer0Init();
        ET0=1;                        //允許T0定時中斷
        EA=1;
        while(1)
        {               
/*
                if(flag_1s)
                {
                        flag_1s=0;
                        write_com(0x80);   //數據地址指針從0開始
                        write_dat(0x30+(hour/10));
                        write_dat(0x30+(hour%10));
                        write_dat(':');
                        write_dat(0x30+(minute/10));
                        write_dat(0x30+(minute%10));
                        write_dat(':');
                        write_dat(0x30+(second/10));
                        write_dat(0x30+(second%10));
                }
*/
                if(flag_400ms)
                {
                        flag_400ms=0;
                        for(num=0;num<8;num++)
                        {
                                Get_Current1();        //獲取A電流值
                                Get_Current2();        //獲取uA電流值
                                Get_Temp();                //獲取溫度值
                                Get_voltage();        //獲取電壓值
                        }
                        Display_temp();                //顯示溫度值
                        Display_voltage();        //顯示電壓值
                        Display_A();                //顯示A電流值
                        Display_uA();                //顯示mA電流值
                }
/*
                if(flag_5s)                                //每5秒檢測一次電池電壓
                {
                        flag_5s=0;
                        for(num=0;num<8;num++)
                        {
                                Get_voltage();         //獲取電壓值                               
                        }
                        Display_voltage(); //顯示電壓值
                }
*/       
        }
}


void time0(void) interrupt 1
{
        time_count++;
        time_count2++;
        if(time_count==20)
        {
                time_count=0;
                second++;
                flag_1s=1;
                time_count3++;
        }
        if(time_count2==8)
        {
                time_count2=0;
                flag_400ms=1;
        }
        if(time_count3==5)
        {
                time_count3=0;
                flag_5s=1;
        }
        if(second==60)
        {
                second=0;
                minute++;
        }
        if(minute==60)
        {
                minute=0;
                hour++;
                if(hour>=100)
                        hour=0;
        }  
}
回復

使用道具 舉報

6#
ID:1001745 發表于 2022-6-10 20:10 | 只看該作者
jhczy 發表于 2022-6-10 16:21
ADC采樣時的轉換通道“ch”是怎么轉換的?這里也有問題的
/******************************
函數說明:查 ...

謝謝大師指導,理應來說如果ADC查詢有問題,測溫度和電壓是不是也不能正常顯示?可是現在測溫和測電壓是正常的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产99 | 国产精品福利视频 | 三级在线视频 | 亚洲黄色成人网 | 久久久久久一区 | 国产最好的av国产大片 | 四虎免费视频 | 91在线导航 | 精品国产免费一区二区三区演员表 | 羞羞视频网站免费观看 | 亚洲精品一区中文字幕乱码 | 国产成人精品久久二区二区91 | 国产一区二区三区四区 | 五月激情六月婷婷 | 精品国产一区二区三区日日嗨 | 小早川怜子xxxxaⅴ在线 | 久久久精品一区二区三区 | 99爱国产 | 亚洲精品一区二三区不卡 | 久草视频观看 | 中文字幕一区二区在线观看 | 成人福利在线视频 | 天堂成人国产精品一区 | 中文字幕第一页在线 | 无码一区二区三区视频 | 成人在线播放网站 | 黄色国产视频 | 激情综合五月 | 国产精品视频播放 | 97caoporn国产免费人人 | 欧美成人精品激情在线观看 | 日韩1区| 国产精品美女久久久 | 国产精品美女在线观看 | 日韩1区| 欧美中文字幕一区二区 | 99精品网站 | 日韩综合在线视频 | 自拍偷拍亚洲一区 | 成人性生交大片免费看中文带字幕 | 国产在线小视频 |