標(biāo)題: STM8S USB電壓電流表制作 12864顯示附單片機(jī)源碼 [打印本頁(yè)]
作者: 鄺威 時(shí)間: 2018-11-25 22:20
標(biāo)題: STM8S USB電壓電流表制作 12864顯示附單片機(jī)源碼
附件是別的大神設(shè)計(jì)制作的 我只是做分享。
STM8S003F3P6(常用的ST7565驅(qū)動(dòng))12864USB電壓電流表
之前看到sabaka發(fā)的帖子“STM8S003F3表頭自校準(zhǔn)版”,正好在 學(xué)習(xí)STM8S003F3P6,加上之前手頭有廢棄的U盾,已參考網(wǎng)上帖子成功點(diǎn)亮其中的ST7565 12864LCD屏,就 想著利用這12864屏來(lái)做這個(gè)USB電壓電流表。原帖采用1602顯示,經(jīng)過(guò)一番摸索改寫(xiě)ST7565驅(qū)動(dòng),略微調(diào)整源程序,終于完成了這個(gè)試驗(yàn)品。
先上圖。正面:

背面:

點(diǎn)亮:

帶個(gè)USB小臺(tái)燈:

改變小臺(tái)燈亮度:

使用的U盾(中間長(zhǎng)條型的)

拆開(kāi)的樣子:排線(xiàn)印字FPC11289B-V0.3

試驗(yàn)品考慮不周,PCB切割飛線(xiàn),STM8調(diào)試接口也沒(méi)預(yù)留,帶來(lái)很多麻煩,LCD屏接口線(xiàn)也只好飛線(xiàn)連接。下面提供經(jīng)修改改善的PCB工程和IAR源程序工程供大家參考。程序中電量統(tǒng)計(jì)只畫(huà)了界面,計(jì)算部分未加入。
電路圖:

PCB:打算12864LCD屏單獨(dú)一層PCB,2層疊放,有空再做一個(gè)。

附件:
另手頭還有2種U盾,屏幕都不一樣,其中一種背光與屏幕一體的,排線(xiàn)印字12864-898 A4-A, FPC-9的接口,只用到7根線(xiàn),適合做個(gè)模塊使用。


根據(jù)原電路大致測(cè)出接口如下,也不知道對(duì)不對(duì)。
1、9空,2、3接背光LED,7接3.3V電源,8接GND,4、5、6接MCU,功能不明。LCD控制IC不明,猜測(cè)是否也是ST7565?三線(xiàn)SPI模式? 期待高手搞定

單片機(jī)源程序如下:
- <font style="font-size: 14px">#include <iostm8s103f2.h>
- #include "ST7565_12864.h"
- #include "ziku.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define KEY PA_IDR_IDR3 //PA 的第3位做KEY
- void EEP_Init(void) //EEPROM初始化
- {
- FLASH_CR1 = 0x00;
- FLASH_CR2 = 0x00;
- FLASH_NCR2 = 0xFF;
- FLASH_DUKR = 0xae; //寫(xiě)入第一個(gè)秘鑰
- FLASH_DUKR = 0x56; //寫(xiě)入第二個(gè)秘鑰
- while(!(FLASH_IAPSR&0x08)); //等待就緒
- }
- void EEP_W(uchar addr,float data) //寫(xiě)EEPROM
- {
- float *p;
- p=(float *)(0x4000+addr);
- *p=data;
- while(!(FLASH_IAPSR&0x04)); //等待完成
- }
- float EEP_R(uchar addr) //讀EEPROM
- {
- float *p;
- p=(float *)(0x4000+addr);
- return *p;
- }
- void Hellow(void) //初始屏幕
- {
- ClearScreen(); //清除屏幕
- DisplayFont(2, 8+4, FONT_8X16,19); //U
- DisplayFont(2, 16+4, FONT_8X16,17); //S
- DisplayFont(2, 24+4, FONT_8X16,14); //B
- DisplayFont(2, 32+4, FONT_16X16,0);//電
- DisplayFont(2, 48+4, FONT_16X16,1);//壓
- DisplayFont(2, 64+4, FONT_16X16,0);//電
- DisplayFont(2, 80+4, FONT_16X16,2);//流
- DisplayFont(2, 96+4, FONT_16X16,3);//表
- DisplayFont(5, 40+4, FONT_16X16,9);//丑
- DisplayFont(5, 56+4, FONT_16X16,10);//孩
- }
- void ADC_Init(void)
- {
- ADC_CR1 = 0x20; //分頻系數(shù)為4 單次轉(zhuǎn)換模式 先不啟動(dòng)ADC轉(zhuǎn)換
- ADC_CR2 = 0x00; //非外部觸發(fā) 數(shù)據(jù)左對(duì)齊 禁止掃描模式
- ADC_CSR = 0x03; //禁止轉(zhuǎn)換結(jié)束中斷 設(shè)置轉(zhuǎn)換通道為AIN3
- ADC_TDRL|= 0x60; //禁止AIN5AIN6施密特觸發(fā)器功能
- }
- uint Get_Adc(uchar ac) //獲取adc值
- {
- uint Value;
- ADC_CSR = ac; //選擇通道
- ADC_CR1 |= 0x01; //第一次寫(xiě)1是從低功耗模式喚醒
- ADC_CSR &= ~0x80; //清除轉(zhuǎn)換標(biāo)志
- ADC_CR1 |= 0x01; //開(kāi)始轉(zhuǎn)換
- while(!(0x80&ADC_CSR)); //等待轉(zhuǎn)換完成
- Value = (uint) ADC_DRH; //取高8位
- Value = Value<<2; //左移兩位
- Value += ADC_DRL; //取低兩位
- return(Value); //返回adc值
- }
- float Ad_Av(uchar ac) //采樣400次求平均
- {
- float Val_Av=0;
- uint num;
- for(num=0;num<400;num++)
- {
- Val_Av += Get_Adc(ac);
- }
- Val_Av = Val_Av/400;
- return(Val_Av);
- }
- void Write_Lcd0(void) //固定顯示底板發(fā)去LCD
- {
- DisplayFont(0, 8+4, FONT_16X16,0); //電
- DisplayFont(0, 24+4, FONT_16X16,1); //壓
- DisplayFont(0, 40+4, FONT_8X16,12); //:
- DisplayFont(0, 112+4, FONT_8X16,20); //V
- DisplayFont(2, 8+4, FONT_16X16,0); //電
- DisplayFont(2, 24+4, FONT_16X16,2); //流
- DisplayFont(2, 40+4, FONT_8X16,12); //:
- DisplayFont(2, 112+4, FONT_8X16,13); //A
- DisplayFont(4, 8+4, FONT_16X16,4); //功
- DisplayFont(4, 24+4, FONT_16X16,5); //率
- DisplayFont(4, 40+4, FONT_8X16,12); //:
- DisplayFont(4, 104+4, FONT_16X16,11); //W
- DisplayFont(6, 8+4, FONT_16X16,14); //容
- DisplayFont(6, 24+4, FONT_16X16,15); //量
- DisplayFont(6, 40+4, FONT_8X16,12); //:
- DisplayFont(6, 96+4, FONT_8X16,22); //m
- DisplayFont(6, 104+4, FONT_8X16,13); //A
- DisplayFont(6, 112+4, FONT_8X16,15); //H
- // DisplayFont(6, 104+4, FONT_16X16,12); //Ω
- }
-
- void Write_Lcd1(int ad,uchar xl,uchar yl)//把電壓電阻功率發(fā)去LCD,ad采集數(shù)值,xl yl顯示位置
- {
- if(ad/1000>=1) //電壓如果不足10V,就把1位顯示為空
- {
- DisplayFont(xl,yl+4, FONT_8X16,ad/1000); //十位
- }
- else DisplayFont(xl,yl+4,FONT_8X16,10); //空格
- DisplayFont(xl,yl+8+4, FONT_8X16,(ad%1000)/100); //個(gè)位
- DisplayFont(xl,yl+16+4, FONT_8X16,11); //"."小數(shù)點(diǎn)
- DisplayFont(xl,yl+24+4, FONT_8X16,ad%100/10); //十分位
- DisplayFont(xl,yl+32+4, FONT_8X16,ad%10); //百分位
- }
- void Write_Lcd2(int ad,uchar xl,uchar yl) //把電流值發(fā)去LCD
- {
- DisplayFont(xl,yl+4, FONT_8X16,ad/1000); //個(gè)位
- DisplayFont(xl,yl+8+4, FONT_8X16,11); //"."小數(shù)點(diǎn)
- DisplayFont(xl,yl+16+4, FONT_8X16,ad%1000/100); //十分位
- DisplayFont(xl,yl+24+4, FONT_8X16,ad%100/10); //百分位
- DisplayFont(xl,yl+32+4, FONT_8X16,ad%10); //千分位
- }
- void Write_Lcd3(int ad,uchar xl,uchar yl) //把容量值發(fā)去LCD
- {
- DisplayFont(xl,yl+4, FONT_8X16,ad/10000); //萬(wàn)位
- DisplayFont(xl,yl+8+4, FONT_8X16,ad%10000/1000); //千位
- DisplayFont(xl,yl+16+4, FONT_8X16,ad%1000/100); //百位
- DisplayFont(xl,yl+24+4, FONT_8X16,ad%100/10); //十位
- DisplayFont(xl,yl+32+4, FONT_8X16,ad%10); //個(gè)位
- }
- void Correct(void) //校準(zhǔn)
- {
- float V2,Iov,I1,I2,I3,AIN7;
- uchar a,flag;
- ClearScreen(); //清除屏幕
- DisplayFont(1, 48+4, FONT_16X16,7); //校
- DisplayFont(1, 64+4, FONT_16X16,8); //準(zhǔn)
- DisplayFont(4, 8+4, FONT_8X16,16); //I
- DisplayFont(4, 16+4, FONT_8X16,23); //n
- DisplayFont(4, 24+4, FONT_8X16,24); //p
- DisplayFont(4, 32+4, FONT_8X16,26); //u
- DisplayFont(4, 40+4, FONT_8X16,25); //t
- DisplayFont(4, 48+4, FONT_8X16,12); //:
-
- DisplayFont(4, 64+4, FONT_8X16,10); //空格
- DisplayFont(4, 72+4, FONT_8X16,10); //空格
- DisplayFont(4, 80+4, FONT_8X16,10); //空格
- DisplayFont(4, 88+4, FONT_8X16,5); //5
- DisplayFont(4, 96+4, FONT_8X16,10); //空格
- DisplayFont(4, 104+4, FONT_8X16,20); //V
- Delay(40);
- flag=1;
- while(flag)
- {
- if(!KEY)
- {
- Delay1(20);
- if(KEY)
- {
- AIN7 = Ad_Av(7); //取得基準(zhǔn)的ADC數(shù)值
- V2 = Ad_Av(5); //取得校準(zhǔn)電壓的ADC數(shù)值
- V2 = V2*10/AIN7; //????
- // V2 = V2/AIN7; //????
- EEP_W(0x04,V2);
- flag = 0;
- }
- }
- }
- for(a=0;a<16;a++)
- {
- DisplayFont(4, 64+4, FONT_8X16,10); //空格
- DisplayFont(4, 72+4, FONT_8X16,10); //空格
- DisplayFont(4, 80+4, FONT_8X16,10); //空格
- DisplayFont(4, 88+4, FONT_8X16,0); //0
- DisplayFont(4, 96+4, FONT_8X16,22); //m
- DisplayFont(4, 104+4, FONT_8X16,13); //A
- Delay(40);
- }
- flag=1;
- while(flag)
- {
- if(!KEY)
- {
- Delay1(20);
- if(KEY)
- {
- Iov = Ad_Av(6);
- EEP_W(0x10,Iov);
- flag = 0;
- }
- }
- }
- for(a=0;a<16;a++)
- {
- DisplayFont(4, 64+4, FONT_8X16,10); //空格
- DisplayFont(4, 72+4, FONT_8X16,1); //1
- DisplayFont(4, 80+4, FONT_8X16,0); //0
- DisplayFont(4, 88+4, FONT_8X16,0); //0
- DisplayFont(4, 96+4, FONT_8X16,22); //m
- DisplayFont(4, 104+4, FONT_8X16,13); //A
- Delay(40);
- }
- flag=1;
- while(flag)
- {
- if(!KEY)
- {
- Delay1(20);
- if(KEY)
- {
- AIN7 = Ad_Av(7);
- I1 = Ad_Av(6);
- I1 = (I1-Iov)/AIN7;
- EEP_W(0x08,I1);
- flag = 0;
- }
- }
- }
- for(a=0;a<16;a++)
- {
- DisplayFont(4, 64+4, FONT_8X16,1); //1
- DisplayFont(4, 72+4, FONT_8X16,0); //0
- DisplayFont(4, 80+4, FONT_8X16,0); //0
- DisplayFont(4, 88+4, FONT_8X16,0); //0
- DisplayFont(4, 96+4, FONT_8X16,22); //m
- DisplayFont(4, 104+4, FONT_8X16,13); //A
- Delay(40);
- }
- flag=1;
- while(flag)
- {
- if(!KEY)
- {
- Delay1(20);
- if(KEY)
- {
- AIN7 = Ad_Av(7);
- I2 = Ad_Av(6);
- I2 = (I2-Iov)/AIN7;
- EEP_W(0x0c,I2);
- flag = 0;
- }
- }
- }
- for(a=0;a<16;a++)
- {
- DisplayFont(4, 64+4, FONT_8X16,3); //3
- DisplayFont(4, 72+4, FONT_8X16,0); //0
- DisplayFont(4, 80+4, FONT_8X16,0); //0
- DisplayFont(4, 88+4, FONT_8X16,0); //0
- DisplayFont(4, 96+4, FONT_8X16,22); //m
- DisplayFont(4, 104+4, FONT_8X16,13); //A
- Delay(40);
- }
- flag=1;
- while(flag)
- {
- if(!KEY)
- {
- Delay1(20);
- if(KEY)
- {
- AIN7 = Ad_Av(7);
- I3 = Ad_Av(6);
- I3 = (I3-Iov)/AIN7;
- EEP_W(0x14,I3);
- flag = 0;
- }
- }
- }
- }
- void main() //主函數(shù)
- {
- float V,V2,I,I1,I2,I3,Iov,AIN7,R,W;
- CLK_CKDIVR=0x00;
- //Delay(1000);
- GPIO_Init();
- ADC_Init();
- EEP_Init();
- Lcd_Init();
- Hellow();
- Delay1(800);
- while(!KEY)
- {
- Delay1(10);
- if(KEY)
- Correct();
- }
- V2 = EEP_R(0x04); //對(duì)應(yīng)5V
- I1 = EEP_R(0x08); //對(duì)應(yīng)100MA 電流校正值
- I2 = EEP_R(0x0c); //對(duì)應(yīng)1000MA 電流校正值
- Iov = EEP_R(0x10); //對(duì)應(yīng)0MA 電流校正值
- I3 = EEP_R(0x14); //對(duì)應(yīng)3000MA 電流校正值
- ClearScreen(); //清除屏幕
- while(1)
- {
- Write_Lcd0(); //顯示固定底版
- AIN7 = Ad_Av(7); //通道7為內(nèi)部參考電壓
- I = Ad_Av(6); //通道6電流采樣
- V = Ad_Av(5); //通道5電壓采樣
- if(V>1)
- {
- V = V/AIN7/V2*5069; //5V校正時(shí)輸入5.069V
- }
- else
- {
- V = 0;
- }
- if((I-Iov)>0 & (I/AIN7)<=I1*2) //計(jì)算電流
- I = (I-Iov)/AIN7/I1*100;
- else if((I/AIN7)>I1*2 & (I/AIN7)<=I2*2)
- I = (I-Iov)/AIN7/I2*1000;
- else
- I = (I-Iov)/AIN7/I3*3000;
- R = V/I; //計(jì)算電阻
- W = V*I/1000; //計(jì)算功率
- Delay1(5);
- Write_Lcd1((int)V,0,56); //寫(xiě)入電壓
- Write_Lcd2((int)I,2,64); //電流
- /*
- if(I<1)
- {
- Write_Lcd1(0,4,64); //寫(xiě)入電阻
- }
- else
- {
- Write_Lcd1((int)R,4,64); //電阻。
- }
- */
- Write_Lcd1((int)W,4,56); //功率
- Write_Lcd3(0,6,56); //容量
- Delay1(400);
- }
- }
- </font>
復(fù)制代碼
0.png (37.98 KB, 下載次數(shù): 125)
下載附件
2018-11-26 01:28 上傳
所有資料51hei提供下載:
STM8S USB電壓電流表.zip
(3.26 MB, 下載次數(shù): 457)
2018-11-25 22:20 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者: wkman 時(shí)間: 2018-11-26 10:03
膜拜大神,stm8玩出花來(lái)了,,不過(guò)就是mcu貴了點(diǎn)
作者: lzhl 時(shí)間: 2018-11-26 21:20
不錯(cuò),很好,謝謝分享
作者: csj0492 時(shí)間: 2018-12-1 21:29
膜拜大神,stm8玩出花來(lái)了,,
作者: csj0492 時(shí)間: 2018-12-1 21:38
不錯(cuò),很好,謝謝分享
作者: fly_apple 時(shí)間: 2018-12-5 10:47
我家里好像也扔著這樣一個(gè)U盾,這下有事做了
作者: shahai 時(shí)間: 2019-2-8 21:18
下載研究一下。。。。。
作者: fyp5593 時(shí)間: 2019-2-10 22:31
好厲害


作者: jxchen 時(shí)間: 2019-4-20 14:43
看看~~~~~~~~~~~~~
作者: m182892 時(shí)間: 2019-4-23 18:24
不錯(cuò),很好,謝謝分享
作者: 西點(diǎn)鐘靈毓秀 時(shí)間: 2019-4-23 21:38
這個(gè)可以做著玩玩
作者: FQ967 時(shí)間: 2019-4-28 13:35
下載學(xué)習(xí)一下!謝謝!
作者: m182892 時(shí)間: 2019-5-21 10:19
下載了,謝謝分享!
作者: wusenlin 時(shí)間: 2019-6-4 15:10
真會(huì)玩,學(xué)習(xí)學(xué)習(xí)了
作者: 智成科技 時(shí)間: 2019-7-8 15:58
很棒的設(shè)計(jì),正準(zhǔn)備做一個(gè)太陽(yáng)能充電流量監(jiān)測(cè)模塊
作者: yuri_su 時(shí)間: 2019-10-9 14:44
想做一個(gè)OLED 12864的
作者: whcwhx 時(shí)間: 2019-11-18 19:07
想要學(xué)習(xí)
作者: 雙城 時(shí)間: 2019-12-6 10:32
感謝分享。厲害,羨慕呀!向大神靠攏!
作者: hyzqq 時(shí)間: 2020-1-11 21:42
下載學(xué)習(xí),謝謝分享。
作者: heyanrong1 時(shí)間: 2020-1-11 22:01
好東西。
作者: cdl511 時(shí)間: 2020-1-15 14:08
很好,謝謝分享!向大神靠攏!
作者: xlzhu 時(shí)間: 2020-1-18 14:35
學(xué)習(xí)了,謝謝分享!
作者: yhtuse 時(shí)間: 2020-3-16 15:52
謝謝提供,學(xué)習(xí)了!
作者: 中恒電子asus 時(shí)間: 2020-4-5 12:22
膜拜大神
作者: 初雪 時(shí)間: 2020-4-10 08:51
雙向的嗎?
作者: monkeg3267 時(shí)間: 2020-4-23 21:23
謝謝提供,學(xué)習(xí)了!
作者: lcmwork 時(shí)間: 2020-7-5 16:12
謝謝分享!最近在收集這方面的資料自已也是弄個(gè)。先學(xué)習(xí)一下!
作者: xiesonny 時(shí)間: 2020-7-7 08:40
老弟,做的不錯(cuò)呀,
作者: yhtuse 時(shí)間: 2020-7-10 00:29
請(qǐng)教樓主,能否修改為2000V 1mA顯示?
作者: cykhyk 時(shí)間: 2020-7-24 19:11
用LM358的線(xiàn)性度好嗎
作者: rayin 時(shí)間: 2020-11-15 17:24
不錯(cuò),值得學(xué)習(xí)。51hei有你更精彩!
作者: cyrs 時(shí)間: 2021-1-11 15:33
樓主不是一般的
作者: 大漠游民 時(shí)間: 2021-3-29 18:57
做的不錯(cuò)呀!
作者: fruitfox 時(shí)間: 2021-12-13 02:47
看看能不能改成 INA219零漂移
作者: lcmwork 時(shí)間: 2022-5-7 11:35
感謝分享。收下學(xué)習(xí),最近剛好在研究
作者: fpw214 時(shí)間: 2022-5-28 10:40
外掛個(gè)高位AD做個(gè)高精度電壓電流表豈不是很爽
作者: 562034962 時(shí)間: 2023-12-4 22:53
謝謝提供,學(xué)習(xí)了!
作者: duckyer 時(shí)間: 2023-12-26 14:04
U上有l(wèi)m358,可以在U內(nèi),加入mcu制作!
作者: joyb 時(shí)間: 2023-12-26 14:50
給個(gè)例程,一起玩
作者: hclin 時(shí)間: 2023-12-28 19:41
有意思,謝謝分享。
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |