基于单片机的电能表设计.docx
- 文档编号:27580614
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:30
- 大小:19.17KB
基于单片机的电能表设计.docx
《基于单片机的电能表设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的电能表设计.docx(30页珍藏版)》请在冰豆网上搜索。
基于单片机的电能表设计
#include"Lcd12864.h"
#include"Ds1302.h"
#include"Eeprom.h"
#include"Rs485.h"
#include"Att7026.h"
sfrT2MOD=0x0c9;//定时器控制字定义
sfrWDT_CONTR=0xE1;//看门狗控制字定义
//Ds1302模块变量
idatauchartime[7]={0};//保存从Ds1302寄存器读出的数据
idatauchartime1[7][2];//保存经过转换的数据,形式为十位、个位
//Ds1302模块变量
uchartao=0;//复费率套数
//****************rs485数据定义
ucharrs485_status=0;
ucharrs485_addr=0;
ucharrs485_data=0xff;
uchari=0;//本模块的循环变量
uchartime2[7]={0};//时间数组
ucharcharge[3]={0};//充值数据存储空间
ucharcontrol=99;//初始化控制字
ucharmima[3]={0};//密码是六个0
ucharaddr[6]={0x99,0x99,0x99,0x99,0x99,0x99};//地址初始化
//*****************rs485数据定义
ucharerr_num=0;
ucharp_key=0;
ucharcrc_key=0;//循环控制
//定时器的参数
uinttimer2_i=0;
uinttimer0_i=0;
ucharmonth;
ucharday;
sbitRelay=P1^2;
//报警位
sbitB_alarm=P1^7;
sbitled=P1^6;
ucharhour;
longpower=0;
longpower1=0;
floatprice=0;
floatyu_e=0;
voidDelay3s(void)//延时3s
{
unsignedchara,b,c;
for(c=167;c>0;c--)
for(b=171;b>0;b--)
for(a=48;a>0;a--);
}
//显示错误信息
Disp_Err(uchardat)//dat为错误代码
{
Clear_Lcd();
Disp_Ch(5,40,E_ch);
Disp_Ch(5,48,R_ch);
Disp_Ch(5,56,R_ch);
Disp_Ch(5,64,FENGEFU_ch);
Disp_Ch(5,72,SHUZI[dat]);
}
//Rs485部分数据转换函数,
ucharBcd_To_Int(ucharc)
{
uchartemp;
temp=c/16;
temp=temp*10+c%16;
returntemp;
}
//从DS1302中的寄存器中读取数值;私有
voidGet_Ds1302()
{
uchari;
ucharaddr=0x81;
for(i=0;i<7;i++)
{
time[i]=Read_Ds1302(addr);
addr=addr+2;
}
}
//获得转换后的ds1302时间信息;私有
voidGet_time1()
{
uchari;
uchartemp;
for(i=0;i<7;i++)
{
temp=time[i];
time1[i][1]=temp%16;
time1[i][0]=(time[i]&0xf0)/16;
}
}
/*******************Lcd和Ds1302之间的联合函数**************/
//参数为0,则为实时数据,否则就是存储数据
voidDisp_Date(uchari)
{
if(i==0)
{
Get_Ds1302();
}
Get_time1();
Disp_Zn(0,0,RI_zh);
Disp_Zn(0,16,QI_zh);
Disp_Ch(0,32,MAOHAO_ch);
//日期信息
Disp_Ch(0,40,SHUZI[2]);
Disp_Ch(0,48,SHUZI[0]);
Disp_Ch(0,56,SHUZI[time1[6][0]]);
Disp_Ch(0,64,SHUZI[time1[6][1]]);
Disp_Ch(0,72,FENGEFU_ch);
Disp_Ch(0,80,SHUZI[time1[4][0]]);
Disp_Ch(0,88,SHUZI[time1[4][1]]);
Disp_Ch(0,96,FENGEFU_ch);
Disp_Ch(0,104,SHUZI[time1[3][0]]);
Disp_Ch(0,112,SHUZI[time1[3][1]]);
}
//参数为0,则为实时数据,否则就是存储数据
voidDisp_Time(i)
{
if(i==0)
{
Get_Ds1302();
}
Get_time1();
Disp_Zn(2,0,SHI_zh);
Disp_Zn(2,16,JIAN_zh);
Disp_Ch(2,32,MAOHAO_ch);
//时间信息
Disp_Ch(2,40,SHUZI[time1[2][0]]);
Disp_Ch(2,48,SHUZI[time1[2][1]]);
Disp_Ch(2,56,FENGEFU_ch);
Disp_Ch(2,64,FENGEFU_ch);
Disp_Ch(2,72,SHUZI[time1[1][0]]);
Disp_Ch(2,80,SHUZI[time1[1][1]]);
Disp_Ch(2,88,FENGEFU_ch);
Disp_Ch(2,96,FENGEFU_ch);
Disp_Ch(2,104,SHUZI[time1[0][0]]);
Disp_Ch(2,112,SHUZI[time1[0][1]]);
}
/*******************Lcd和Ds1302之间的联合函数**************/
/*******************Eeprom和Ds1302之间的联合函数**************/
//保存故障时间
Save_Err_Time()
{
uchari,j;
EEPROM_WP=0;
j=E_Read_Byte(0x01);//获得以前的故障次数
j=j%8;
Get_Ds1302();
for(i=0;i<7;i++)
{
E_Write_Byte(0x31+8*j+i,time[i]);
}
E_Write_Byte(0x01,j+1);
EEPROM_WP=1;
}
/*******************Eeprom和Ds1302之间的联合函数**************/
/*******************Eeprom和Lcd12864之间的联合函数**************/
//显示故障日期及时间,i从0-7
Disp_Err_Time(uchari)
{
ucharj;
EEPROM_WP=0;
for(j=0;j<7;j++)
{
time[j]=E_Read_Byte(0x31+8*i+j);
}
Disp_Date
(1);
Disp_Time
(1);
EEPROM_WP=1;
}
//显示余额不足函数
Disp_Yu_E_Err()
{
Clear_Lcd();
Disp_Zn(0,0,YU_zh);
Disp_Zn(0,16,E_zh);
Disp_Ch(0,32,MAOHAO_ch);
Disp_Ch(0,40,SHUZI[E_Read_Byte(0x02)/16]);
Disp_Ch(0,48,SHUZI[E_Read_Byte(0x02)%16]);
Disp_Ch(0,56,SHUZI[E_Read_Byte(0x03)/16]);
Disp_Ch(0,64,SHUZI[E_Read_Byte(0x03)%16]);
Disp_Ch(0,72,POINT_ch);
Disp_Ch(0,80,SHUZI[E_Read_Byte(0x04)/16]);
Disp_Ch(0,88,SHUZI[E_Read_Byte(0x04)%16]);
Disp_Zn(0,96,YUAN_zh);
Disp_Zn(2,0,YU_zh);
Disp_Zn(2,16,E_zh);
Disp_Zn(2,32,BU_zh);
Disp_Zn(2,48,ZU_zh);
}
/*******************Eeprom和Lcd12864之间的联合函数**************/
voidDisp_Crc()
{
longtemp=220;
crc_key=crc_key%13;
switch(crc_key)
{
case0:
//输出实时信息
{
Clear_Lcd();
Disp_Date(0);
Disp_Time(0);
crc_key++;
break;
}
case1:
//输出电压信号
{
Clear_Lcd();
Disp_Zn(0,0,DIAN_zh);
Disp_Zn(0,16,YA_zh);
//Disp_Ch(0,32,U_ch);
//Disp_Ch(0,40,MAOHAO_ch);
Disp_Ch(2,0,U_ch);
Disp_Ch(2,8,SHUZI[1]);
Disp_Ch(2,16,MAOHAO_ch);
//temp=Get_Uirms(r_URmsa);
Disp_Ch(2,24,SHUZI[temp/100]);
Disp_Ch(2,32,SHUZI[(temp%100)/10]);
Disp_Ch(2,40,SHUZI[temp%10]);
Disp_Ch(4,0,U_ch);
Disp_Ch(4,8,SHUZI[2]);
Disp_Ch(4,16,MAOHAO_ch);
//temp=Get_Uirms(r_URmsb);
Disp_Ch(4,24,SHUZI[temp/100]);
Disp_Ch(4,32,SHUZI[(temp%100)/10]);
Disp_Ch(4,40,SHUZI[temp%10]);
Disp_Ch(6,0,U_ch);
Disp_Ch(6,8,SHUZI[3]);
Disp_Ch(6,16,MAOHAO_ch);
//temp=Get_Uirms(r_URmsc);
Disp_Ch(6,24,SHUZI[temp/100]);
Disp_Ch(6,32,SHUZI[(temp%100)/10]);
Disp_Ch(6,40,SHUZI[temp%10]);
crc_key++;
break;
}
case2:
//输出电流信息
{
Clear_Lcd();
Disp_Zn(0,0,DIAN_zh);
Disp_Zn(0,16,LIU_zh);
Disp_Ch(0,32,I_ch);
Disp_Ch(0,40,MAOHAO_ch);
//temp=Get_Uirms(0x2b);
Disp_Ch(0,48,SHUZI[temp/100]);
Disp_Ch(0,56,SHUZI[(temp%100)/10]);
Disp_Ch(0,64,SHUZI[temp%10]);
Disp_Ch(2,0,I_ch);
Disp_Ch(2,8,SHUZI[1]);
Disp_Ch(2,16,MAOHAO_ch);
//temp=Get_Uirms(r_IRmsa);
Disp_Ch(2,24,SHUZI[temp/100]);
Disp_Ch(2,32,SHUZI[(temp%100)/10]);
Disp_Ch(2,40,SHUZI[temp%10]);
Disp_Ch(4,0,I_ch);
Disp_Ch(4,8,SHUZI[2]);
Disp_Ch(4,16,MAOHAO_ch);
//temp=Get_Uirms(r_IRmsb);
Disp_Ch(4,24,SHUZI[temp/100]);
Disp_Ch(4,32,SHUZI[(temp%100)/10]);
Disp_Ch(4,40,SHUZI[temp%10]);
Disp_Ch(6,0,I_ch);
Disp_Ch(6,8,SHUZI[3]);
Disp_Ch(6,16,MAOHAO_ch);
//temp=Get_Uirms(r_IRmsc);
Disp_Ch(6,24,SHUZI[temp/100]);
Disp_Ch(6,32,SHUZI[(temp%100)/10]);
Disp_Ch(6,40,SHUZI[temp%10]);
crc_key++;
break;
}
case3:
//输出功率信息
{
Clear_Lcd();
Disp_Zn(0,0,GONG_zh);
Disp_Zn(0,16,LV_zh);
Disp_Ch(0,32,MAOHAO_ch);
//temp=Get_PQS(r_Pt);
Disp_Ch(0,40,SHUZI[temp/100]);
Disp_Ch(0,48,SHUZI[(temp%100)/10]);
Disp_Ch(0,56,SHUZI[temp%10]);
crc_key++;
break;
}
case4:
//输出余额信息格式为xxxx.xx元
{
Clear_Lcd();
Disp_Zn(0,0,YU_zh);
Disp_Zn(0,16,E_zh);
Disp_Ch(0,32,MAOHAO_ch);
Disp_Ch(0,40,SHUZI[E_Read_Byte(0x02)/16]);
Disp_Ch(0,48,SHUZI[E_Read_Byte(0x02)%16]);
Disp_Ch(0,56,SHUZI[E_Read_Byte(0x03)/16]);
Disp_Ch(0,64,SHUZI[E_Read_Byte(0x03)%16]);
Disp_Ch(0,72,POINT_ch);
Disp_Ch(0,80,SHUZI[E_Read_Byte(0x04)/16]);
Disp_Ch(0,88,SHUZI[E_Read_Byte(0x04)%16]);
Disp_Zn(0,96,YUAN_zh);
crc_key++;
break;
}
case5:
//输出故障信息1
{
Clear_Lcd();
Disp_Ch(5,0,SHUZI[1]);
Disp_Ch(5,40,E_ch);
Disp_Ch(5,48,R_ch);
Disp_Ch(5,56,R_ch);
Disp_Ch(5,64,FENGEFU_ch);
Disp_Ch(5,72,SHUZI[E_Read_Byte(0x30)]);
Disp_Err_Time(0);
crc_key++;
break;
}
case6:
{
Clear_Lcd();
Disp_Ch(5,0,SHUZI[2]);
Disp_Ch(5,40,E_ch);
Disp_Ch(5,48,R_ch);
Disp_Ch(5,56,R_ch);
Disp_Ch(5,64,FENGEFU_ch);
Disp_Ch(5,72,SHUZI[E_Read_Byte(0x38)]);
Disp_Err_Time
(1);
crc_key++;
break;
}
case7:
{
Clear_Lcd();
Disp_Ch(5,0,SHUZI[3]);
Disp_Ch(5,40,E_ch);
Disp_Ch(5,48,R_ch);
Disp_Ch(5,56,R_ch);
Disp_Ch(5,64,FENGEFU_ch);
Disp_Ch(5,72,SHUZI[E_Read_Byte(0x40)]);
Disp_Err_Time
(2);
crc_key++;
break;
}
case8:
{
Clear_Lcd();
Disp_Ch(5,0,SHUZI[4]);
Disp_Ch(5,40,E_ch);
Disp_Ch(5,48,R_ch);
Disp_Ch(5,56,R_ch);
Disp_Ch(5,64,FENGEFU_ch);
Disp_Ch(5,72,SHUZI[E_Read_Byte(0x50)]);
Disp_Err_Time(3);
crc_key++;
break;
}
case9:
{
Clear_Lcd();
Disp_Ch(5,0,SHUZI[5]);
Disp_Ch(5,40,E_ch);
Disp_Ch(5,48,R_ch);
Disp_Ch(5,56,R_ch);
Disp_Ch(5,64,FENGEFU_ch);
Disp_Ch(5,72,SHUZI[E_Read_Byte(0x58)]);
Disp_Err_Time(4);
crc_key++;
break;
}
case10:
{
Clear_Lcd();
Disp_Ch(5,0,SHUZI[6]);
Disp_Ch(5,40,E_ch);
Disp_Ch(5,48,R_ch);
Disp_Ch(5,56,R_ch);
Disp_Ch(5,64,FENGEFU_ch);
Disp_Ch(5,72,SHUZI[E_Read_Byte(0x60)]);
Disp_Err_Time(5);
crc_key++;
break;
}
case11:
{
Clear_Lcd();
Disp_Ch(5,0,SHUZI[7]);
Disp_Ch(5,40,E_ch);
Disp_Ch(5,48,R_ch);
Disp_Ch(5,56,R_ch);
Disp_Ch(5,64,FENGEFU_ch);
Disp_Ch(5,72,SHUZI[E_Read_Byte(0x68)]);
Disp_Err_Time(6);
crc_key++;
break;
}
case12:
{
Clear_Lcd();
Disp_Ch(5,0,SHUZI[8]);
Disp_Ch(5,40,E_ch);
Disp_Ch(5,48,R_ch);
Disp_Ch(5,56,R_ch);
Disp_Ch(5,64,FENGEFU_ch);
Disp_Ch(5,72,SHUZI[E_Read_Byte(0x70)]);
Disp_Err_Time(7);
crc_key++;
break;
}
}
Delay3s();
if(TR2==0)
TR2=1;
}
/****************************外部终中断1*********************/
voidC_Key(void)interrupt2
{
TR2=0;
Disp_Crc();
WDT_CONTR=0x3f;
}
/****************************外部终中断0*********************/
voidProgram_Key(void)interrupt0
{
if(p_key++)
{
Clear_Lcd();
Disp_Zn(5,0,BIAN_zh);
Disp_Zn(5,16,CHENG_zh);
if(p_key%2)
{
Rs485_Init();
Disp_Ch(5,32,U_ch);
Rs485_Init();
}
else
{
//Ir_Init();
Disp_Ch(5,32,I_ch);
}
}
}
/***************************************************************/
//定时器0处理函数,
voidtimer0()interrupt1
{
TH0=0x3C;
TL0=0xB0;
if(timer0_i++==60)//3s
{
longtemp=0x70;
timer0_i=0;
//temp=Read_Spi(0x2c);//读取标志状态寄存器
if((temp&0x00000008))
{
Disp_Err(0);
B_alarm=0;//报警
err_num=err_num%8;
E_Write_Byte(30+8*err_num,0);
Save_Err_Time();
B_alarm=0;
Relay=0;//切闸
TR2=0;
ET2=0;
}
elseif((temp&0x000000007)!
=0)
{
err_num=err_num%8;
Disp_Err
(1);
E_Write_Byte(30+8*err_num,1);
Save_Err_Time();//保存故障
B_alarm=0;//报警
Relay=0;//切闸
TR2=0;//关闭循显
ET2=0;
}
elseif(E_Read_Byte
(2)==0&&E_Read_Byte(0x03)<16)//低于十元只报警不切闸
{
err_num=err_num%8;
Disp_Yu_E_Err();
E_Write_Byte(30+8*err_num,1);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 电能表 设计