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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

51單片機(jī)制作的電流表檢測(cè)不顯示問(wèn)題

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

AV METER.rar

57.39 KB, 下載次數(shù): 14

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

使用道具 舉報(bào)

沙發(fā)
ID:170318 發(fā)表于 2022-6-10 15:47 | 只看該作者
下載下來(lái)瞧瞧哪里問(wèn)題
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

#define ADC_POWER        0x80        //ADC電源控制位
#define ADC_FLAG        0x10        //ADC完成標(biāo)志位
#define ADC_START        0x08        //ADC啟動(dòng)控制位
#define ADC_SPEED0        0x00        //ADC轉(zhuǎn)換速度,一次轉(zhuǎn)換需要540個(gè)時(shí)鐘
#define ADC_SPEED1        0x20        //ADC轉(zhuǎn)換速度,一次轉(zhuǎn)換需要360個(gè)時(shí)鐘
#define ADC_SPEED2        0x40        //ADC轉(zhuǎn)換速度,一次轉(zhuǎn)換需要180個(gè)時(shí)鐘
#define ADC_SPEED3        0x60        //ADC轉(zhuǎn)換速度,一次轉(zhuǎn)換需要90個(gè)時(shí)鐘

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

sbit lcdrs=P3^2;        //LCD1602指令和數(shù)據(jù)寄存器選擇,高電平時(shí)為數(shù)據(jù),低電平選擇命令
sbit lcdrw=P3^3;        //LCD1602讀寫(xiě)選擇,高電平為讀,低電平為寫(xiě)
sbit lcden=P3^4;    //LCD1602使能
unsigned char Show[3]={0,0,0};        //顯示數(shù)組A
unsigned char Show1[3]={0,0,0};        //顯示數(shù)組uA
unsigned int  Temp_Buf[N+1];
unsigned char Show2[4]={0,0,0,0};        //顯示數(shù)組溫度
unsigned char Show3[3]={0,0,0};        //顯示數(shù)組電壓
unsigned int xdata ADC_Buf[N+1];                //采樣數(shù)組A
unsigned int xdata ADC_Buf2[N+1];        //采樣數(shù)值uA
unsigned int xdata Voltage_Buf[N+1];        //采樣數(shù)組電池電壓
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采樣次數(shù)變量
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阻值與溫度關(guān)系表
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
};

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

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

/******************************
函數(shù)說(shuō)明:定時(shí)器0初始化,12T自動(dòng)重裝模式,定時(shí)50毫秒
******************************/
void Timer0Init(void)                //50毫秒@6.000MHz
{
        AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式
        TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
        TL0 = 0x58;                //設(shè)置定時(shí)初值
        TH0 = 0x9E;                //設(shè)置定時(shí)初值
        TF0 = 0;                //清除TF0標(biāo)志
        TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
}

/******************************
函數(shù)說(shuō)明:LCD1602初始化
******************************/
void LCD1602_Init(void)
{
        lcdrw=0;
        lcden=0;
        P2=0;
        write_com(0x38);   //設(shè)置顯示模式為兩行5*8顯示
        write_com(0x0C);   //初始化,開(kāi)顯示
        write_com(0x06);   //初始化,讀寫(xiě)一個(gè)字符后地址指針自動(dòng)加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);   //數(shù)據(jù)地址指針從0開(kāi)始
}
/******************************
函數(shù)說(shuō)明:查詢方式讀取ADC轉(zhuǎn)換結(jié)果
入口參數(shù):ch  ADC采樣通道
出口參數(shù):int ADC_RES ADC轉(zhuǎn)換結(jié)果
******************************/
unsigned int Get_ADC_Result(unsigned char ch)
{
        unsigned int result;
        ADC_RES = 0;       
        ADC_RESL= 0;                                        //清掉ADC轉(zhuǎn)換結(jié)果寄存器
        ADC_CONTR =ADC_POWER|ADC_SPEED3|ch|ADC_START;//配置ADC,設(shè)置轉(zhuǎn)換通道,啟動(dòng)轉(zhuǎn)換
    _nop_();        _nop_();
    _nop_();        _nop_();                        //等待設(shè)置ADC_POWER完畢
    while (!(ADC_CONTR & ADC_FLAG));//讀取轉(zhuǎn)換完畢標(biāo)志位ADC_FLAG
    ADC_CONTR &= ~ADC_FLAG;         //清除ADC_FLAG標(biāo)志位
        result = ADC_RES<<2|ADC_RESL;        //讀取10位轉(zhuǎn)換結(jié)果保存到result
    return result;                  //返回ADC轉(zhuǎn)換結(jié)果10位
}

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

        tempvalue=xx*10 + (tempvalue*10 - NTCcode[xx-1]*10)/( NTCcode[xx] - NTCcode[xx-1] );
        //插值法計(jì)算溫度,將數(shù)據(jù)全部擴(kuò)大10倍,使小數(shù)變?yōu)檎麛?shù)

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

/******************************
函數(shù)說(shuō)明:顯示溫度值
******************************/
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);   //個(gè)位,后面要加小數(shù)點(diǎn)
                Show2[3]=0x30+(tempresult%10);            //小數(shù)位
                write_com(0x80+0x09);                                //第一行第11個(gè)字符
                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        //負(fù)溫度(小于0度)
        {
                tempresult=410-tempresult;        //取得0°以下溫度
                //插值法計(jì)算溫度,將數(shù)據(jù)全部擴(kuò)大10倍,使小數(shù)變?yōu)檎麛?shù),+5是四舍五入
                Show2[0]='-';                //顯示負(fù)號(hào)-
                Show2[1]=0x30+(tempresult/100);          //十位
                Show2[2]=0x30+(tempresult%100/10); //個(gè)位,后面要加小數(shù)點(diǎn)
                Show2[3]=0x30+(tempresult%10);          //小數(shù)位
                write_com(0x80+0x09);                                //第一行第11個(gè)字符
                write_dat(Show2[0]);
                write_dat(Show2[1]);
                write_dat(Show2[2]);
                write_dat('.');
                write_dat(Show2[3]);
                write_dat(0xDF); write_dat('C');
        }
}

/******************************
函數(shù)說(shuō)明:獲取A值
******************************/
void Get_Current1(void)
{
        unsigned char xx;
        unsigned int sum,currentvalue;
        sum = currentvalue =0;       
        ADC_Buf[N]=Get_ADC_Result(2);        //將ADC轉(zhuǎn)換結(jié)果放數(shù)組最高位
        if( ++ADCcount < 8)                //采樣初期不使用濾波算法
        {       
                for(xx=0;xx<N;xx++)        //準(zhǔn)備濾波算法的數(shù)據(jù)
                {
                        ADC_Buf[xx]=ADC_Buf[xx+1];//所有數(shù)據(jù)循環(huán)左移
                }
                currentvalue=ADC_Buf[N];//采樣初期使用當(dāng)前采樣值
        }
        else         //只有采樣次數(shù)大于8次以后才使用濾波算法       
        {
                ADCcount=8;        //采樣次數(shù)超過(guò)8次后,固定設(shè)置為8
                for(xx=0;xx<N;xx++)        //濾波算法
                {
                        ADC_Buf[xx]=ADC_Buf[xx+1];//所有數(shù)據(jù)循環(huán)左移
                        sum+=ADC_Buf[xx];        //求和
                }
                currentvalue=sum/N;                //求平均值               
        }       
        currentvalue=currentvalue*0.003288; //ADC平均值轉(zhuǎn)化成A電流值
        if(currentvalue<=2)
                currentvalue=0;
        if(currentvalue>2)
                currentvalue=currentvalue-2;         //實(shí)測(cè)零點(diǎn)漂移了2~3mA
        if(currentvalue<=2)                                         //顯示門(mén)檻
                currentvalue=0;
        current=currentvalue;
}
                                                                       
/******************************
函數(shù)說(shuō)明:顯示A值
******************************/
void Display_A(void)
{
        if(current<=2)
        {
                Show[0]=current%1000/100;                //電流值百位
                Show[1]=current%100/10;        //電流值十位
                Show[2]=current%10;                //電流值個(gè)位
                write_com(0xC0+0x02);                        //第1行第10個(gè)字符開(kāi)始顯示
                if(Show[0]>0)                                       
                        write_dat(0x30+Show[0]);        //寫(xiě)電流值百位
                else
                        write_dat(' ');
                if((Show[0]==0)&&(Show[1]==0))
                        write_dat(' ');                                //寫(xiě)電流值十位
                else
                        write_dat(0x30+Show[1]);
                write_dat(0x30+Show[2]);                //寫(xiě)電流值個(gè)位
                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');       
        }
}

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

/******************************
函數(shù)說(shuō)明:顯示uA值
******************************/
void Display_uA(void)
{
        if(current2<=400)
        {
                Show1[0]=current2%1000/100;                //電流值百位
                Show1[1]=current2%100/10;                //電流值十位
                Show1[2]=current2%10;                        //電流值個(gè)位
                write_com(0xC0+0x0A);                        //第2行第10個(gè)字符開(kāi)始顯示
                if(Show1[0]>0)                                       
                        write_dat(0x30+Show1[0]);        //寫(xiě)電流值百位
                else
                        write_dat(' ');
                if((Show1[0]==0)&&(Show1[1]==0))
                        write_dat(' ');                                //寫(xiě)電流值十位
                else
                        write_dat(0x30+Show1[1]);
                write_dat(0x30+Show1[2]);                //寫(xiě)電流值個(gè)位
                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');       
        }
}

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

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

        Show3[0]=voltageresult/10000;         //電壓值十位,單位V
        Show3[1]=voltageresult%10000/1000; //電壓值個(gè)位,單位V
        Show3[2]=voltageresult%1000/100;        //電壓值小數(shù)位
        write_com(0x80+0x01);                        //第2行第1個(gè)字符開(kāi)始顯示                                       
        if(Show3[0]>0)
                write_dat(0x30+Show3[0]);        //電壓值十?dāng)?shù)
        else if(Show3[0]==0)
                write_dat(' ');
        write_dat(0x30+Show3[1]);        //電壓值個(gè)數(shù)位
        write_dat('.');                                //電壓值小數(shù)點(diǎn)
        write_dat(0x30+Show3[2]);        //電壓值小數(shù)位
        write_dat('V');

/*
        write_com(0xC0+0x00);                        //第2行第1個(gè)字符開(kāi)始顯示
        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定時(shí)中斷
        EA=1;
        while(1)
        {               
/*
                if(flag_1s)
                {
                        flag_1s=0;
                        write_com(0x80);   //數(shù)據(jù)地址指針從0開(kāi)始
                        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秒檢測(cè)一次電池電壓
                {
                        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;
        }  
}
回復(fù)

使用道具 舉報(bào)

6#
ID:1001745 發(fā)表于 2022-6-10 20:10 | 只看該作者
jhczy 發(fā)表于 2022-6-10 16:21
ADC采樣時(shí)的轉(zhuǎn)換通道“ch”是怎么轉(zhuǎn)換的?這里也有問(wèn)題的
/******************************
函數(shù)說(shuō)明:查 ...

謝謝大師指導(dǎo),理應(yīng)來(lái)說(shuō)如果ADC查詢有問(wèn)題,測(cè)溫度和電壓是不是也不能正常顯示?可是現(xiàn)在測(cè)溫和測(cè)電壓是正常的
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美理论片在线 | 欧美一区二区成人 | 亚洲国产欧美日韩 | 狠狠干天天干 | 日日干干夜夜 | 亚洲九九精品 | 日韩视频中文字幕 | 日日日操 | 欧美国产日韩在线 | 亚洲国产欧美国产综合一区 | 国产午夜精品视频 | 国产精品视频一 | 国产精品一区二区三区久久久 | 久久久久久国产精品免费免费男同 | av手机在线 | 色综合视频在线 | 精品在线99| 日韩1区2区 | 一呦二呦三呦国产精品 | www.亚洲精品 | 欧美中文字幕在线观看 | 国产精品高潮呻吟久久 | 久久久精 | 成人妇女免费播放久久久 | 久久精品一级 | 日本久久久久久久久 | 日韩精品福利 | 国产一区二区三区久久久久久久久 | av毛片在线免费观看 | 久久久青草婷婷精品综合日韩 | 一区二区三区高清在线观看 | 亚洲成人综合社区 | 7777精品伊人久久精品影视 | 国产一区二区三区 | 成人亚洲在线 | 亚洲一区二区 | 国产成人精品av | 午夜精品一区二区三区三上悠亚 | 992人人草 | 99久久婷婷国产综合精品电影 | 在线观看中文字幕 |