找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1253|回复: 0
打印 上一主题 下一主题
收起左侧

STC15W408AS单片机+数码管显示电度表每闪功率程序

[复制链接]
跳转到指定楼层
楼主
ID:343102 发表于 2023-8-23 18:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在电子式电度表很便宜,买了一个测量电动车的充电量,以此估算电池性能。
为方便观察充电时间和充电功率,本人用STC15W408AS做了一个计时计数器。利用光敏二极管将电度表的闪灯信号转化为电脉冲信号,经单片机计算处理后,用一个4位数码管轮流显示充电度数、每闪功率和充电时长。程序见附件。

单片机源程序如下:

  1. #define MAIN_Fosc                12000000        //定义主时钟
  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;   //max 4294967295*.000625Kwh=2684354Kws
  14. unsigned long  kwh;    //max 4294967295*.000625Kwh=2684354Kws
  15. unsigned int t0,t1,w0,w,s10;  //t0,t1 max 65535*.05=3276s, w max 45000w, s10 max 65535*10s/3600s=182h,7.58day
  16. unsigned char h;              //max 65535*10s/3600s=182h,7.58day
  17. bit flag;

  18. void init()
  19. {
  20.    IT0=1;        //INT0负跳变触发        
  21.    TMOD=0x01;//定时器工作于方式1
  22.    TH0=0x3c;          //50ms 12Mhz
  23.    TL0=0xb0;
  24.          EA=1; //CPU开中断总允许
  25.    ET0=1;//开定时中断
  26.    EX0=1;//开外部INTO中断
  27.    TR0=1;//启动定时
  28. }
  29. //========================================================================
  30. // 函数: void  Delayms(unsigned int ms)
  31. // 描述: STC15延时函数。
  32. // 参数: ms,要延时的ms数, 这里只支持1~65535ms. 自动适应主时钟.
  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++;         //累计电度表输出脉冲个数
  51.         w0=45000/t1;  //每闪功率瓦数 w=.625*3600*20/t1(50毫秒数)
  52.         t1=0;         //每闪时长清0
  53. }

  54. void time0() interrupt 1
  55. {
  56.   TH0=0x3c;
  57.   TL0=0xb0;         //50ms,STC15W408AS内部时钟,12Mhz
  58.   t0++;          //累计时长
  59.   t1++;          //每闪时长
  60.         if(t0>199) //10s 200*.05s=10s
  61.         {
  62.          t0=0;
  63.          s10=s10+1;  //max 65535*10s/3600s=182h,7.58day
  64.         }
  65.         if(t1>65534) //max 65534*.05=3276s
  66.         {
  67.          t1=65534;
  68.         }
  69. }

  70. void display_SMG_kwh(void)
  71. {
  72.    P1=table[kwh/1000];
  73.    led1= 0;
  74.    Delayms(5);
  75.    led1 = 1;

  76.    P1=table[kwh%1000/100]&0x7f;
  77.    led2 = 0;
  78.    Delayms(5);
  79.    led2 = 1;

  80.    P1=table[kwh%100/10];
  81.    led3 = 0;
  82.    Delayms(5);
  83.    led3 = 1;

  84.    P1=table[kwh%10];
  85.    led4 = 0;
  86.    Delayms(5);
  87.    led4 = 1;
  88. }

  89. void display_SMG_w(void)
  90. {
  91.    P1=table[w%10000/1000];
  92.    led1= 0;
  93.    Delayms(5);
  94.    led1 = 1;

  95.    P1=(table[w%1000/100]);
  96.    led2 = 0;
  97.    Delayms(5);
  98.    led2 = 1;

  99.    P1=table[w%100/10];
  100.    led3 = 0;
  101.    Delayms(5);
  102.    led3 = 1;

  103.    P1=table[w%10];
  104.    led4 = 0;
  105.    Delayms(5);
  106.    led4 = 1;
  107. }

  108. void display_SMG_h(void)
  109. {
  110.    P1=0x8b;
  111. //   P1=table[h/1000];
  112.    led1= 0;
  113.    Delayms(5);
  114.    led1 = 1;

  115.    P1=table[h%1000/100];
  116.    led2 = 0;
  117.    Delayms(5);
  118.    led2 = 1;

  119.    P1=table[h%100/10]&0x7f;
  120.    led3 = 0;
  121.    Delayms(5);
  122.    led3 = 1;

  123.    P1=table[h%10];
  124.    led4 = 0;
  125.    Delayms(5);
  126.    led4 = 1;
  127. }

  128. void main()
  129. {
  130.   unsigned char a;
  131.   init();
  132.   while(1)
  133.   {
  134.    for(a=0;a<=50;a++)
  135.    {
  136.     kwh=count*.0625;               //用电度数=电度表闪灯次数*.000625kwh*100,(2位小数)
  137.     display_SMG_kwh();
  138.    }
  139.    for(a=0;a<=50;a++)
  140.    {
  141. //    w=kwh*1000*3600/s10;                   //用电瓦数=累计千瓦时*1000*3600/累计秒数
  142.                 w=w0;
  143.     display_SMG_w();
  144.    }
  145.    for(a=0;a<=50;a++)
  146.    {
  147.     h=s10/360;                            //用电小时数=累计秒数/3600*10,(1位小数)
  148.     display_SMG_h();
  149.    }
  150.   }
  151. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶1 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表