#include <STC12C5A60S2.H>
#define uint unsigned int
#define uchar unsigned char
#include"zm.h"
#include"1602.h"
#include"uart.h"
#include"math.h"
sbit qh=P3^6;
sbit ql=P3^7;
void init();
void display();
void lcd_ini();
uchar i,k;
uint dy,dl,yggl,pl,ydl,gy,wggl,szgl;
bit flag,key_flag,dis_flag,clr_flag,send_flag;
uchar code buf[]={0x01,0x04,0x00,0x00,0x00,0x0a,0x70,0x0d};
uchar code sz[]="0123456789:.VAHzkWhvar";
uchar code hz[]="dydlplydlygglwgglszglglys";
uchar len1,len2;
uchar idata tmp1[50],tmp2[20];
void uartInit()//串口1初始化
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器时钟12T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFD; //设置定时初始值
TH1 = 0xFD; //设置定时重载值
ET1 = 0; //禁止定时器中断
EA=1;
TR1 = 1; //定时器1开始计时
ES=1;
}
//串口2初始化
void Uart2Init(void) //9600bps@11.0592MHz
{
/*AUXR &= 0xB7; //波特率不倍速
S2CON = 0x92; //8位数据,可变波特率
AUXR &= 0xBF; //独立波特率发生器时钟为Fosc/12,即12T
BRT = 0xFE; //设定独立波特率发生器重装值
AUXR |= 0x10; //启动独立波特率发生器
IE2=0x01;*/
AUXR &= 0xF7; //波特率不倍速
S2CON = 0x50; //8位数据,可变波特率
AUXR &= 0xFB; //定时器时钟12T模式
BRT = 0xFD; //设置定时重载值
AUXR |= 0x10; //启动独立波特率发射器
EA=1;
IE2=0x01;//ES2=1
}
void send(uchar dat)//串口1发送1个字节
{
SBUF=dat;
while(!TI);
TI=0;
}
void sendData(uchar *dat)
{
uchar i;
for(i=0;i<8;i++)
send(dat[i]);
}
void send2(uchar dat)//串口2发送1个字节
{
S2BUF=dat;
while(!(S2CON&0x02));
S2CON&=~0x02;
}
void send_str(uchar *str)
{
while(*str!='\0')
send2(*str++);
}
void uart1() interrupt 4//串口接收中断
{
//static uchar recData;//记录中断次数的变量
if(RI)
{
tmp1[len1]=SBUF;
len1++;
if(len1==50)
len1=0;
RI=0;
}
}
void uart2() interrupt 8//串口2接收中断
{
//static uchar receiveData;
if(S2CON&0x01)
{
S2CON &= ~0x01;
tmp2[len2] = S2BUF;
len2++;
if(len2==20)
{
len2=0;
}
}
}
void main()
{
init();
uartInit();
Uart2Init();
dis_flag=1;
while(1)
{
if(!qh&&!key_flag)
{
flag=!flag;
key_flag=1;
clr_flag=1;
dis_flag=1;
}
if(!ql&&!key_flag)
{
send(0x01);
send(0x42);
send(0x80);
send(0x11);
dis_flag=1;
key_flag=1;
}
for(i=0;i<40;i++)
{
dy=tmp1[i+3]*256+tmp1[i+4];//电压
dl=tmp1[i+5]*256+tmp1[i+6];//电流
yggl=tmp1[i+9]*256+tmp1[i+10];//有功功率
ydl=tmp1[i+13]*256+tmp1[i+14];//用电量
pl=tmp1[i+17]*256+tmp1[i+18];//频率
gy=tmp1[i+19]*256+tmp1[i+20];//功率因素
szgl=(dy/10.0)*(dl/1000.0)*10;//视在功率
if(yggl>=szgl)
wggl=0;
else
wggl=sqrt((szgl/10.0)*(szgl/10.0)-(yggl/10.0*yggl/10.0));
dis_flag=1;
send_str("#dy:");
send2(dy/1000+0x30);
send2(dy%1000/100+0x30);
send2(dy%100/10+0x30);
send2('.');
send2(dy%10+0x30);
send2('V');
send2('*');
send_str("#dl:");
send2(dl/1000+0x30);
send2('.');
send2(dl%1000/100+0x30);
send2(dl%100/10+0x30);
send2(dl%10+0x30);
send2('A');
send2('*');
send_str("#pl:");
send2(pl/100+0x30);
send2(pl%100/10+0x30);
send2('.');
send2(pl%10+0x30);
send_str("Hz");
send2('*');
send_str("#ydl:");
send2(ydl/1000+0x30);
send2('.');
send2(ydl%1000/100+0x30);
send2(ydl%100/10+0x30);
send2(ydl%10+0x30);
send_str("kWh");
send2('*');
send_str("#yg:");
send2(yggl/1000+0x30);
send2(yggl%1000/100+0x30);
send2(yggl%100/10+0x30);
send2('.');
send2(yggl%10+0x30);
send2('W');
send2('*');
send_str("#wg:");
send2(wggl/100+0x30);
send2(wggl%100/10+0x30);
send2(wggl%10+0x30);
send_str("var");
send2('*');
send_str("#sz:");
send2(szgl/1000+0x30);
send2(szgl%1000/100+0x30);
send2(szgl%100/10+0x30);
send2('.');
send2(szgl%10+0x30);
send_str("V.A");
send2('*');
send_str("#gy:");
send2(gy/100+0x30);
send2('.');
send2(gy%100/10+0x30);
send2(gy%10+0x30);
send2('!');
for(k=0;k<40;k++)
tmp1[k]=0;
break;
}
if(clr_flag)
{
lcd_ini();
clr_flag=0;
}
if(dis_flag)
{
display();
dis_flag=0;
}
if(send_flag)
{
send_flag=0;
sendData(buf);
}
if(qh&&ql)
key_flag=0;
}
}
void init()
{
wcmd(0xc0);
wcmd(0x3f);
lcd_ini();
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
}
void display()
{
wcmd(0x80);
wdat(hz[0]);
wdat(hz[1]);
wdat(sz[10]);
wdat(sz[dy/1000]);
wdat(sz[dy%1000/100]);
wdat(sz[dy%100/10]);
wdat(sz[11]);
wdat(sz[dy%10]);
wdat(sz[12]);
wcmd(0xC0);
wdat(hz[2]);
wdat(hz[3]);
wdat(sz[10]);
wdat(sz[dl/1000]);
wdat(sz[11]);
wdat(sz[dl%1000/100]);
wdat(sz[dl%100/10]);
wdat(sz[dl%10]);
wdat(sz[13]);
Delay20us(50000);
Delay20us(50000);
Delay20us(50000);
Delay20us(50000);
lcd_ini();
wcmd(0x80);
wdat(hz[4]);
wdat(hz[5]);
wdat(sz[10]);
wdat(sz[pl/100]);
wdat(sz[pl%100/10]);
wdat(sz[11]);
wdat(sz[pl%10]);
wdat(sz[14]);
wdat(sz[15]);
wcmd(0xC0);
wdat(hz[6]);
wdat(hz[7]);
wdat(hz[8]);
wdat(sz[10]);
wdat(sz[ydl/1000]);
wdat(sz[11]);
wdat(sz[ydl%1000/100]);
wdat(sz[ydl%100/10]);
wdat(sz[ydl%10]);
wdat(sz[16]);
wdat(sz[17]);
wdat(sz[18]);
Delay20us(50000);
Delay20us(50000);
Delay20us(50000);
Delay20us(50000);
lcd_ini();
wcmd(0x80);
wdat(hz[9]);
wdat(hz[10]);
wdat(hz[11]);
wdat(hz[12]);
wdat(sz[10]);
wdat(sz[yggl/1000]);
wdat(sz[yggl%1000/100]);
wdat(sz[yggl%100/10]);
wdat(sz[11]);
wdat(sz[yggl%10]);
wdat(sz[17]);
wcmd(0xC0);
wdat(hz[13]);
wdat(hz[14]);
wdat(hz[15]);
wdat(hz[16]);
wdat(sz[10]);
wdat(sz[wggl/1000]);
wdat(sz[wggl%1000/100]);
wdat(sz[wggl%100/10]);
wdat(sz[11]);
wdat(sz[wggl%10]);
wdat(sz[19]);
wdat(sz[20]);
wdat(sz[21]);
Delay20us(50000);
Delay20us(50000);
Delay20us(50000);
Delay20us(50000);
lcd_ini();
wcmd(0x80);
wdat(hz[17]);
wdat(hz[18]);
wdat(hz[19]);
wdat(hz[20]);
wdat(sz[10]);
wdat(sz[szgl/1000]);
wdat(sz[szgl%1000/100]);
wdat(sz[szgl%100/10]);
wdat(sz[11]);
wdat(sz[szgl%10]);
wdat(sz[12]);
wdat(sz[13]);
wcmd(0xC0);
wdat(hz[21]);
wdat(hz[22]);
wdat(hz[23]);
wdat(hz[24]);
wdat(sz[10]);
wdat(sz[gy/100]);
wdat(sz[11]);
wdat(sz[gy%100/10]);
wdat(sz[gy%10]);
Delay20us(50000);
Delay20us(50000);
Delay20us(50000);
Delay20us(50000);
lcd_ini();
}
uchar count;
void timer()interrupt 1
{
count++;
if(count==20)
{
count=0;
send_flag=1;
}
}
|