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

QQ登錄

只需一步,快速開始

帖子
查看: 4283|回復(fù): 1
收起左側(cè)

用單片機(jī)對(duì)機(jī)械式電度表進(jìn)行改進(jìn) 附源程序

[復(fù)制鏈接]
ID:343102 發(fā)表于 2018-8-11 13:45 | 顯示全部樓層 |閱讀模式
電動(dòng)車是吃得多才能跑的遠(yuǎn),為方便測(cè)試電動(dòng)車電瓶的容量,前段時(shí)間在某寶入手了一個(gè)機(jī)械式電度表,到手只有十幾元。不過便宜沒好貨,這貨經(jīng)常停走。檢查發(fā)現(xiàn)是機(jī)械計(jì)數(shù)器阻力太大造成的。于是采用單片機(jī)對(duì)其進(jìn)行改進(jìn),改進(jìn)思路是用單片機(jī)記錄電度表的光耦輸出脈沖,轉(zhuǎn)換成電度數(shù)用數(shù)碼管顯示出來。另外還分時(shí)顯示了充電器功率(瓦數(shù))和充電時(shí)間(小時(shí)數(shù))。程序見附件。
電度表改進(jìn).jpg

單片機(jī)源程序如下:
  1. #define MAIN_Fosc                11059200L        //定義主時(shí)鐘
  2. //#include<reg52.h>
  3. #include        "STC15Fxxxx.H"
  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. sbit COUNT_IN=P3^2;
  7. unsigned code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  8. #define   DataPort P1;
  9. sbit led1=P3^4;
  10. sbit led2=P3^5;
  11. sbit led3=P3^6;
  12. sbit led4=P3^7;

  13. unsigned long count;
  14. unsigned long  kwh;
  15. unsigned int w,h;
  16. float s;
  17. bit flag;

  18. void init()
  19. {
  20.    IT0=1;        //INT0負(fù)跳變觸發(fā)        
  21.    TMOD=0x01;//定時(shí)器工作于方式1
  22.    TH0=0x3c;          //50ms
  23.    TL0=0xb0;
  24.    EA=1; //CPU開中斷總允許
  25.    ET0=1;//開定時(shí)中斷
  26.    EX0=1;//開外部INTO中斷
  27.    TR0=1;//啟動(dòng)定時(shí)
  28. }
  29. //========================================================================
  30. // 函數(shù): void  Delayms(unsigned int ms)
  31. // 描述: 延時(shí)函數(shù)。
  32. // 參數(shù): ms,要延時(shí)的ms數(shù), 這里只支持1~65535ms. 自動(dòng)適應(yīng)主時(shí)鐘.
  33. // 返回: none.
  34. // 版本: VER1.0
  35. // 日期: 2013-4-1
  36. // 備注:
  37. //========================================================================
  38. void  Delayms(unsigned int ms)
  39. {
  40.      unsigned int i;
  41.          do{
  42.              i = MAIN_Fosc / 13000;
  43.                   while(--i)        ;   //14T per loop
  44.      }while(--ms);
  45. }
  46. //**********************************************
  47. void EXINT0() interrupt 0
  48. {
  49. //  kwh=kwh+.000625;
  50.   count++;         //累計(jì)電度表輸出脈沖個(gè)數(shù)
  51. }

  52. void time0() interrupt 1
  53. {
  54.   TH0=0x3c;
  55.   TL0=0xb0;         //50ms(實(shí)測(cè)每次循環(huán)52.9514ms,使用STC15W408AS內(nèi)部時(shí)鐘,11.0592Mhz,環(huán)境溫度29℃)
  56.   s=s+.0529514;          //累計(jì)秒數(shù)
  57. }

  58. void display_SMG_kwh(void)
  59. {
  60.    P1=table[kwh/1000];
  61.    led1= 0;
  62.    Delayms(5);
  63.    led1 = 1;

  64.    P1=table[kwh%1000/100]&0x7f;
  65.    led2 = 0;
  66.    Delayms(5);
  67.    led2 = 1;

  68.    P1=table[kwh%100/10];
  69.    led3 = 0;
  70.    Delayms(5);
  71.    led3 = 1;

  72.    P1=table[kwh%10];
  73.    led4 = 0;
  74.    Delayms(5);
  75.    led4 = 1;
  76. }

  77. void display_SMG_w(void)
  78. {
  79.    P1=table[w%10000/1000];
  80.    led1= 0;
  81.    Delayms(5);
  82.    led1 = 1;

  83.    P1=(table[w%1000/100]);
  84.    led2 = 0;
  85.    Delayms(5);
  86.    led2 = 1;

  87.    P1=table[w%100/10];
  88.    led3 = 0;
  89.    Delayms(5);
  90.    led3 = 1;

  91.    P1=table[w%10];
  92.    led4 = 0;
  93.    Delayms(5);
  94.    led4 = 1;
  95. }

  96. void display_SMG_h(void)
  97. {
  98.    P1=0x8b;
  99. //   P1=table[h/1000];
  100.    led1= 0;
  101.    Delayms(5);
  102.    led1 = 1;

  103.    P1=table[h%1000/100];
  104.    led2 = 0;
  105.    Delayms(5);
  106.    led2 = 1;

  107.    P1=table[h%100/10]&0x7f;
  108.    led3 = 0;
  109.    Delayms(5);
  110.    led3 = 1;

  111.    P1=table[h%10];
  112.    led4 = 0;
  113.    Delayms(5);
  114.    led4 = 1;
  115. }

  116. void main()
  117. {
  118.   unsigned char a;
  119.   init();
  120.   while(1)
  121.   {
  122.    for(a=0;a<=50;a++)
  123.    {
  124.     kwh=count*.0625;               //用電度數(shù)=電度表閃燈次數(shù)*.000625kwh/1000*100,(2位小數(shù))
  125.     display_SMG_kwh();
  126.    }
  127.    for(a=0;a<=50;a++)
  128.    {
  129.     w=kwh*1000*3600/s;                   //用電瓦數(shù)=累計(jì)千瓦時(shí)*1000*3600/累計(jì)秒數(shù)
  130.     display_SMG_w();
  131.    }
  132.    for(a=0;a<=50;a++)
  133.    {
  134.     h=s/360;                            //用電小時(shí)數(shù)=累計(jì)秒數(shù)/3600*10,(1位小數(shù))
  135. ……………………

  136. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
STC15W408AS+電度表smg4.rar (47.84 KB, 下載次數(shù): 17)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:137736 發(fā)表于 2022-11-2 09:37 | 顯示全部樓層
請(qǐng)介紹的再詳細(xì)些,多上些圖。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表