欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 如何將電池電壓通過ADC轉(zhuǎn)換顯示到液晶屏上?附單片機(jī)代碼 [打印本頁]

作者: 高低都不調(diào)    時間: 2022-12-29 11:50
標(biāo)題: 如何將電池電壓通過ADC轉(zhuǎn)換顯示到液晶屏上?附單片機(jī)代碼
怎么將電池電壓通過AD轉(zhuǎn)換顯示到液晶上。液晶屏字模已經(jīng)顯示好。一個液晶初始化代碼和ADC轉(zhuǎn)換查詢代碼東拼西湊組成的程序。顯示電壓顯示0.
芯片型號STC15F2K60S2.輸入腳接的P1.7通過兩個1K電阻分壓


單片機(jī)代碼如下
#include "REG51.h"
#include "oled.h"
#include "bmp.h"
#include "intrins.h"
sfr ADC_CONTR   =   0xBC;           //ADC控制寄存器
sfr ADC_RES     =   0xBD;           //ADC高8位結(jié)果
sfr ADC_LOW2    =   0xBE;           //ADC低2位結(jié)果
sfr P1ASF       =   0x9D;           //P1口第2功能控制寄存器

#define ADC_POWER   0x80            //ADC電源控制位
#define ADC_FLAG    0x10            //ADC完成標(biāo)志
#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 InitADC();//初始化ADC
typedef unsigned char BYTE;//串口通道名稱聲明
BYTE ch = 7;                        //ADC通道號
BYTE GetADCResult(BYTE ch);//讀取adc結(jié)果
void ShowResult(BYTE ch);
void nem(BYTE dat);

int main(void)
{        
        Init_ssd1327();
        while(1)
        {
                OLED_ShowChinese(0,48,0,16);
                OLED_ShowChinese(16,48,1,16);
                OLED_ShowNum(40,36,nem,4,32);
                OLED_ShowString(112,36,"V",32);
                delay_ms(1000);
                ShowResult(7);              //顯示通道7
        }
}

/*----------------------------
發(fā)送ADC結(jié)果到液晶顯示
----------------------------*/
void ShowResult(BYTE ch)
{
    nem(ch);                   //顯示通道號
    nem(GetADCResult(ch));     //顯示ADC高8位結(jié)果

//    SendData(ADC_LOW2);           //顯示低2位結(jié)果
}

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

    return ADC_RES;                 //返回ADC結(jié)果
}

/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
    P1ASF = 0xff;                   //設(shè)置P1口為AD口
    ADC_RES = 0;                    //清除結(jié)果寄存器
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
    delay_ms(2);                       //ADC上電并延時
}

        

51hei圖片20221229113832.jpg (3.33 MB, 下載次數(shù): 96)

OLED接線測試

OLED接線測試

51hei圖片20221229114122.png (361.49 KB, 下載次數(shù): 93)

STC15F2K60S2管腳圖

STC15F2K60S2管腳圖

51hei圖片20221229114128.png (158.42 KB, 下載次數(shù): 93)

STC15內(nèi)部ADC結(jié)構(gòu)

STC15內(nèi)部ADC結(jié)構(gòu)

作者: 人工置頂員    時間: 2022-12-30 06:04
頂一下
作者: lkc8210    時間: 2022-12-30 09:17
這代碼編譯時沒報錯嗎?
nem是什么gui??
作者: 高低都不調(diào)    時間: 2022-12-30 11:03
lkc8210 發(fā)表于 2022-12-30 09:17
這代碼編譯時沒報錯嗎?
nem是什么gui??

報了幾個錯,被我解決了。nem是我想顯示的電壓數(shù)值
作者: lkc8210    時間: 2022-12-30 11:39
高低都不調(diào) 發(fā)表于 2022-12-30 11:03
報了幾個錯,被我解決了。nem是我想顯示的電壓數(shù)值

為啥不把新代碼貼上來?
作者: 高低都不調(diào)    時間: 2022-12-30 11:48
lkc8210 發(fā)表于 2022-12-30 11:39
為啥不把新代碼貼上來?

這個代碼就是改好的,編譯器可以通過編譯就是不知道哪里錯了顯示屏不顯示電壓值
作者: wulin    時間: 2022-12-30 15:06
高低都不調(diào) 發(fā)表于 2022-12-30 11:48
這個代碼就是改好的,編譯器可以通過編譯就是不知道哪里錯了顯示屏不顯示電壓值

ADC轉(zhuǎn)換結(jié)果不是電壓,還要通過公式計算才能得到電壓值。模擬信號輸入端口要設(shè)置高阻模式。
  1. /*----------------------------
  2. 發(fā)送ADC結(jié)果到液晶顯示
  3. ----------------------------*/
  4. void ShowResult(BYTE ch)
  5. {
  6.         unsigned int mV;
  7.         unsigned char temp;
  8.     nem(ch);                   //顯示通道號
  9.         temp=GetADCResult(ch);
  10.         //毫伏=(參考電壓VCC*八位ADC結(jié)果*1000/256)*分壓比
  11.         mV=5*(long)temp*1000/256*2;
  12.         nem(mV);     //顯示電壓毫伏
  13. }
  14. /*----------------------------
  15. 初始化ADC
  16. ----------------------------*/
  17. void InitADC()
  18. {
  19.         P1M0 = 0x80;                                         //設(shè)置P1.7高阻 1000 0000
  20.         P1M1 = 0x00;
  21.     P1ASF = 0x80;                   //設(shè)置P1.7口為模擬輸入
  22.     ADC_RES = 0;                    //清除結(jié)果寄存器
  23.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
  24.     delay_ms(2);                       //ADC上電并延時
  25. }
  26. /*----------------------------
  27. 讀取ADC結(jié)果
  28. ----------------------------*/
  29. BYTE GetADCResult(BYTE ch)
  30. {
  31.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  32.     _nop_();                        //等待4個NOP
  33.     _nop_();
  34.     _nop_();
  35.     _nop_();
  36.     while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉(zhuǎn)換完成
  37.     ADC_CONTR &= ~ADC_FLAG;         //Close ADC
  38.     return ADC_RES;                 //返回8位ADC結(jié)果
  39. }
復(fù)制代碼


作者: 高低都不調(diào)    時間: 2022-12-31 13:56
感謝各位熱情回答修改好的代碼液晶上成功顯示電壓3866mv 電腦串口也可以同時顯示AD轉(zhuǎn)換值


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


#include "reg51.h"
#include "intrins.h"
#include "oled.h"
#include "bmp.h"

#define FOSC    11059200L
#define BAUD    115200

typedef unsigned char BYTE;
typedef unsigned int WORD;

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

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

sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull
sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
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  AUXR       =   0x8e;       //輔助寄存器                              

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

#define ADC_POWER   0x80            //ADC電源控制位
#define ADC_FLAG    0x10            //ADC完成標(biāo)志
#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(BYTE ch);
void Delay(WORD n);
void ShowResult(BYTE ch);
unsigned int num;//AD轉(zhuǎn)換數(shù)據(jù)緩存
unsigned int mV;//AD電壓顯示數(shù)字毫伏
ch=7;

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x80;
    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
        Init_ssd1327();                 //初始化OLED液晶驅(qū)動
    while (1)
    {
        ShowResult(7);              //顯示通道7
                OLED_ShowChinese(0,48,0,16);
                OLED_ShowChinese(16,48,1,16);
                OLED_ShowNum(40,36,num,4,32);
                OLED_ShowString(112,48,"mV",16);
                num=5*(long)ADC_RES*1000/256*2;
    }
}

/*----------------------------
發(fā)送ADC結(jié)果到PC
----------------------------*/
void ShowResult(BYTE ch)
{
    SendData(ch);                   //顯示通道號
    SendData(GetADCResult(ch));     //顯示ADC高8位結(jié)果

//    SendData(ADC_LOW2);           //顯示低2位結(jié)果
}

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

    return ADC_RES;                 //返回ADC結(jié)果
}

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

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

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

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

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


作者: 13869300    時間: 2023-10-28 20:05
學(xué)習(xí)了抽空試一下




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1