![]() |
發布時間: 2022-12-29 11:50
正文摘要:怎么將電池電壓通過AD轉換顯示到液晶上。液晶屏字模已經顯示好。一個液晶初始化代碼和ADC轉換查詢代碼東拼西湊組成的程序。顯示電壓顯示0. 芯片型號STC15F2K60S2.輸入腳接的P1.7通過兩個1K電阻分壓 單片機代碼 ... |
學習了抽空試一下 |
感謝各位熱情回答修改好的代碼液晶上成功顯示電壓3866mv 電腦串口也可以同時顯示AD轉換值 //本示例在Keil開發環境下請選擇Intel的8058芯片型號進行編譯 //若無特別說明,工作頻率一般為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作為波特率發生器 //1:使用定時器1的模式0(16位自動重載模式)作為波特率發生器 //2:使用定時器1的模式2(8位自動重載模式)作為波特率發生器 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位結果 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(BYTE ch); void Delay(WORD n); void ShowResult(BYTE ch); unsigned int num;//AD轉換數據緩存 unsigned int mV;//AD電壓顯示數字毫伏 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液晶驅動 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; } } /*---------------------------- 發送ADC結果到PC ----------------------------*/ void ShowResult(BYTE ch) { SendData(ch); //顯示通道號 SendData(GetADCResult(ch)); //顯示ADC高8位結果 // SendData(ADC_LOW2); //顯示低2位結果 } /*---------------------------- 讀取ADC結果 ----------------------------*/ 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轉換完成 ADC_CONTR &= ~ADC_FLAG; //Close ADC return ADC_RES; //返回ADC結果 } /*---------------------------- 初始化串口 ----------------------------*/ void InitUart() { SCON = 0x5a; //設置串口為8位可變波特率 #if URMD == 0 T2L = (65536 - (FOSC/4/BAUD)); T2H = (65536 - (FOSC/4/BAUD)) >> 8; AUXR = 0x14; //T2為1T模式, 并啟動定時器2 AUXR |= 0x01; //選擇定時器2為串口1的波特率發生器 #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; //設置定時器1為8位自動重裝載模式 AUXR = 0x40; //定時器1為1T模式 TH1 = TL1 = (256 - (FOSC/32/BAUD)); TR1 = 1; #endif } /*---------------------------- 初始化ADC ----------------------------*/ void InitADC() { P1ASF = 0x80; //設置P1口為AD口 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--); } } |
高低都不調 發表于 2022-12-30 11:48 ADC轉換結果不是電壓,還要通過公式計算才能得到電壓值。模擬信號輸入端口要設置高阻模式。
|
lkc8210 發表于 2022-12-30 11:39 這個代碼就是改好的,編譯器可以通過編譯就是不知道哪里錯了顯示屏不顯示電壓值 |
高低都不調 發表于 2022-12-30 11:03 為啥不把新代碼貼上來? |
lkc8210 發表于 2022-12-30 09:17 報了幾個錯,被我解決了。nem是我想顯示的電壓數值 |
這代碼編譯時沒報錯嗎? nem是什么gui?? |
頂一下 |