電動車是吃得多才能跑的遠,為方便測試電動車電瓶的容量,前段時間在某寶入手了一個機械式電度表,到手只有十幾元。不過便宜沒好貨,這貨經常停走。檢查發現是機械計數器阻力太大造成的。于是采用單片機對其進行改進,改進思路是用單片機記錄電度表的光耦輸出脈沖,轉換成電度數用數碼管顯示出來。另外還分時顯示了充電器功率(瓦數)和充電時間(小時數)。程序見附件。
電度表改進.jpg (266.34 KB, 下載次數: 57)
下載附件
2018-8-11 13:44 上傳
單片機源程序如下:
- #define MAIN_Fosc 11059200L //定義主時鐘
- //#include<reg52.h>
- #include "STC15Fxxxx.H"
- #define uchar unsigned char
- #define uint unsigned int
- sbit COUNT_IN=P3^2;
- unsigned code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- #define DataPort P1;
- sbit led1=P3^4;
- sbit led2=P3^5;
- sbit led3=P3^6;
- sbit led4=P3^7;
- unsigned long count;
- unsigned long kwh;
- unsigned int w,h;
- float s;
- bit flag;
- void init()
- {
- IT0=1; //INT0負跳變觸發
- TMOD=0x01;//定時器工作于方式1
- TH0=0x3c; //50ms
- TL0=0xb0;
- EA=1; //CPU開中斷總允許
- ET0=1;//開定時中斷
- EX0=1;//開外部INTO中斷
- TR0=1;//啟動定時
- }
- //========================================================================
- // 函數: void Delayms(unsigned int ms)
- // 描述: 延時函數。
- // 參數: ms,要延時的ms數, 這里只支持1~65535ms. 自動適應主時鐘.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2013-4-1
- // 備注:
- //========================================================================
- void Delayms(unsigned int ms)
- {
- unsigned int i;
- do{
- i = MAIN_Fosc / 13000;
- while(--i) ; //14T per loop
- }while(--ms);
- }
- //**********************************************
- void EXINT0() interrupt 0
- {
- // kwh=kwh+.000625;
- count++; //累計電度表輸出脈沖個數
- }
- void time0() interrupt 1
- {
- TH0=0x3c;
- TL0=0xb0; //50ms(實測每次循環52.9514ms,使用STC15W408AS內部時鐘,11.0592Mhz,環境溫度29℃)
- s=s+.0529514; //累計秒數
- }
- void display_SMG_kwh(void)
- {
- P1=table[kwh/1000];
- led1= 0;
- Delayms(5);
- led1 = 1;
- P1=table[kwh%1000/100]&0x7f;
- led2 = 0;
- Delayms(5);
- led2 = 1;
- P1=table[kwh%100/10];
- led3 = 0;
- Delayms(5);
- led3 = 1;
- P1=table[kwh%10];
- led4 = 0;
- Delayms(5);
- led4 = 1;
- }
- void display_SMG_w(void)
- {
- P1=table[w%10000/1000];
- led1= 0;
- Delayms(5);
- led1 = 1;
- P1=(table[w%1000/100]);
- led2 = 0;
- Delayms(5);
- led2 = 1;
- P1=table[w%100/10];
- led3 = 0;
- Delayms(5);
- led3 = 1;
- P1=table[w%10];
- led4 = 0;
- Delayms(5);
- led4 = 1;
- }
- void display_SMG_h(void)
- {
- P1=0x8b;
- // P1=table[h/1000];
- led1= 0;
- Delayms(5);
- led1 = 1;
- P1=table[h%1000/100];
- led2 = 0;
- Delayms(5);
- led2 = 1;
- P1=table[h%100/10]&0x7f;
- led3 = 0;
- Delayms(5);
- led3 = 1;
- P1=table[h%10];
- led4 = 0;
- Delayms(5);
- led4 = 1;
- }
- void main()
- {
- unsigned char a;
- init();
- while(1)
- {
- for(a=0;a<=50;a++)
- {
- kwh=count*.0625; //用電度數=電度表閃燈次數*.000625kwh/1000*100,(2位小數)
- display_SMG_kwh();
- }
- for(a=0;a<=50;a++)
- {
- w=kwh*1000*3600/s; //用電瓦數=累計千瓦時*1000*3600/累計秒數
- display_SMG_w();
- }
- for(a=0;a<=50;a++)
- {
- h=s/360; //用電小時數=累計秒數/3600*10,(1位小數)
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
STC15W408AS+電度表smg4.rar
(47.84 KB, 下載次數: 17)
2018-8-11 13:45 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|