标题:
用单片机对机械式电度表进行改进 附源程序
[打印本页]
作者:
风158
时间:
2018-8-11 13:45
标题:
用单片机对机械式电度表进行改进 附源程序
电动车是吃得多才能跑的远,为方便测试电动车电瓶的容量,前段时间在某宝入手了一个机械式电度表,到手只有十几元。不过便宜没好货,这货经常停走。检查发现是机械计数器阻力太大造成的。于是采用单片机对其进行改进,改进思路是用单片机记录电度表的光耦输出脉冲,转换成电度数用数码管显示出来。另外还分时显示了充电器功率(瓦数)和充电时间(小时数)。程序见附件。
电度表改进.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
作者:
zmc419
时间:
2022-11-2 09:37
请介绍的再详细些,多上些图。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1