#include<stdio.h>
#include<reg51.h>
#include<INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define nop _nop();_nop();_nop();_nop();
sbit _CS = P2^3;
sbit _WR = P2^2;
sbit DATA = P2^1;
sfr P1_ADC_EN = 0x97;
sfr ADC_CONTR = 0xc5;
sfr ADC_DATA = 0xc6;
sfr ADC_DATAL = 0xbe;
sfr P1M0 = 0x91;
sfr P1M1 = 0x92;
sbit SCK = P1^7;
sbit SI = P1^5;
sbit SO = P1^6;
sbit KEY = P1^5;
sbit Hold_Pin = P2^0;
sbit WP_Pin =P2^4;
//unsigned char xdata upper_128[128]; /* global array to store read data */
/* to upper RAM area from 80H - FFH */
bit sendbit;
bit KEY_UP;
unsigned int times;
unsigned char idata senddata[20];
unsigned char idata recdata[6];
unsigned int P_1,I_1,V_1;
unsigned int P_2,I_2,V_2,Effi;
unsigned char disp_data[6]={0x01,0x23,0x45,0x67,0x89,0xab};
unsigned int YEAR ;
unsigned int code TIME_STEP[]={253,10,20,30,40,50,60,70,80,90,100,200,300,400,500,600,700,800};
unsigned int V1_Array[8];
unsigned int V2_Array[8];
unsigned int I1_Array[8];
unsigned int I2_Array[8];
unsigned long idata addr;
unsigned char month,day,hour ,min,sec,mode;
unsigned char code led[19]={
0xd7,0x06,0xe3,0xa7,0x36,0xb5,0xf5,0x07,0xf7,0xb7
,0x77,0xf4,0xd1,0xe6,0xf1,0x71 // a,b,c,d,e,f
,0x02,0x00,0x10 // -,NC,
};
/*------------------------
功能:延时
参数:uint
返回:无
说明:无
-------------------------*/
void dely(uint y)
{
uint j,i;
while(y--)
for(j=250;j>0;j--)
{
i=0;
}
}
void delay(uint n)
{
uint j,i;
for(j=0;j<n;j++)
{
i=0;
}
}
/*------------------------
功能:写字节
参数:uchar k,uchar N
返回:无
说明:无
-------------------------*/
void write_byte(uchar k,uchar n)
{
uchar i;
for(i=0;i<n;i++)
{
_WR = 0;
if(k&0x80) //p6.3
DATA =1;
else
DATA =0;
_WR =1;
k=k<<1;
}
}
void write_byte1(uchar k,uchar n)
{
uchar i;
for(i=0;i<n;i++)
{
_WR = 0;
if(k&0x01)
DATA =1;
else
DATA =0;
_WR =1;
k=k>>1;
}
}
/*------------------------
功能:写命令
-------------------------*/
void write_com(uchar com)
{
dely(2);
_WR =0;
DATA =0;
_WR = 1;
write_byte(com,8);
}
/*------------------------
功能:写数据
-------------------------*/
void write_dat(uchar add,uchar mdata)
{
_CS =0;
add=add<<2;
write_byte(0xa0,3); //写101
write_byte(add,6);
write_byte1(mdata,4);
_CS =1;
}
/*------------------------
功能:清屏
-------------------------*/
void display_clr(void)
{
uchar i;
for(i=0;i<32;i++)
{
write_dat(i,0x00);
}
}
/*-------------------------
功能:初始化液晶
-------------------------*/
void int1621(void)
{
_CS =1;
dely(2);
_WR =0;
dely(2);
DATA =1;
dely(2);
_CS = 0;
write_byte(0x80,3);
write_com(0x02);
write_com(0x30);
write_com(0x06);
write_com(0x52);
CS =1;
display_clr();
}
/*-------------------------
功能:显示
-------------------------*/
void dis_data(uchar add,uchar dat) //对应 表上的ASCII码表 ,最高位对应小数点
{
write_dat(add<<1,led[dat&0x0f]>>4);
if((dat & 0x80) ==0x80)
{
write_dat((add<<1)+1,((led[dat&0x0f])&0x0f) | 0x08);
}
else
write_dat((add<<1)+1,led[dat]);
}
/* 显示字符串
void display(unsigned char *dat_array)
{
unsigned char i,tmp;
_CS =0;
write_byte(0xa0,3); //写101
write_byte(0,6);
for( i=0;i<6;i++)
{
tmp=dat_array[i];
tmp=tmp >>4;
write_byte1(led[tmp&0x0f]>>4,4);
write_byte1(led[tmp&0x0f]&0x0f,4);
tmp=dat_array[i]&0x0f;
write_byte1(led[tmp&0x0f]>>4,4);
write_byte1(led[tmp&0x0f]&0x0f,4);
};
_CS =1;
}
*/
/* 显示 日期函数
void disp_date(unsigned char offs)
{
unsigned char i;
dis_data(0,0x11);
i=1+offs;
dis_data(0+i,YEAR/1000);
dis_data(1+i,(YEAR %1000)/100);
dis_data(2+i,(YEAR %100)/10);
dis_data(3+i,(YEAR %10));
dis_data(4+i,16);
dis_data(5+i,(month %100)/10);
dis_data(6+i,(month %10));
dis_data(7+i,16);
dis_data(8+i,(day %100)/10);
dis_data(9+i,(day %10));
dis_data(10+i,0x11);
}*/
//显示时间函数
void Disp_SEC()
{
unsigned char i;
dis_data(0,0x11);
i=1;
dis_data(0+i,((P_1 %1000)/100)|0x80);
dis_data(1+i,(P_1 %100)/10);
dis_data(2+i,(P_1 %10));
dis_data(3+i,0x11);
dis_data(4+i,((P_2 %1000)/100)|0x80);
dis_data(5+i,(P_2 %100)/10);
dis_data(6+i,(P_2 %10));
dis_data(7+i,0x11);
dis_data(8+i,(Effi %1000)/100);
dis_data(9+i,((Effi %100)/10)|0x80);
dis_data(10+i,(Effi %10));
}
void Disp_Real(unsigned int index,unsigned int V1,unsigned int I1)
{
dis_data(0,((index%1000)/100 ) |0x80 );
dis_data(1,( index % 100) /10) ;
dis_data(2,(index %10));
dis_data(3,0x11 );
dis_data(4,((V1%10000)/1000)|0x80 );
dis_data(5,((V1%1000)/100) );
dis_data(6,(V1%100)/10 ) ;
dis_data(7,(V1 %10));
dis_data(8,0x11 );
dis_data(9,((I1%1000)/100)|0x80 ) ;
dis_data(10,(I1%100)/10) ;
dis_data(11,(I1 %10));
}
/////////////////AD 转换模块 ////////////////////////
unsigned int get_ad_result( )
{
unsigned char AD_finished =0;
unsigned int data tmp;
ADC_DATA =0;
ADC_CONTR = ADC_CONTR | 0x08; //启动AD转换
AD_finished =0;
tmp=0;
while((AD_finished ==0)&&(tmp <10000))
{
AD_finished = (ADC_CONTR &0x10);
tmp++;
}
ADC_CONTR=ADC_CONTR &0xe7; //11100111 关闭转换
tmp = (int)ADC_DATA;
tmp =tmp <<2;
AD_finished = ADC_DATAL&0x03;
tmp=tmp + AD_finished;
return(tmp);
}
init_AD()
{
ADC_CONTR =ADC_CONTR | 0x80; //开启A/D转换电源 1ms延迟时间
P1M0 = 0x07; // 0000 0111 为 AD 转换输入
P1M1 = 0x07;
delay(200);
}
// AD 通道切换
// 切换通道后,需要延时20us到200us,如果不切换,不需要等待,延迟
//输入参数为 0 - 7
SetAd_CH(unsigned char ch)
{
ADC_CONTR = 0xE0 | ch ;
}
///////////////////////////AD转换结束 //////////////////////////////
//////////////////////// 串口传送模块 ///////////////////////
void init_com()
{
TMOD=0xa1;
TH1=0xfe; //f5 ---20MHZ 19200bit/s F3 ----- 24MHZ
TL1=0xfe;
ES=1;ET0=0; /*串扣中断关闭,定时器0关闭中断 */
SCON=0x50;
PCON=0xb0;
IP=0x00;
TR1=1;TR0=1;
EA =1;
SBUF =0xaa;
}
unsigned char getdata()
{
unsigned char i,tmp;
tmp=senddata[1];
for (i=1;i<18;i++) senddata[i]=senddata[i+1];
senddata[0]=senddata[0]-1;
return tmp;
}
/*------------------------------串口中断--------------------------------*/
void series(void) interrupt 4
{
unsigned char data tmp;
if (TI==1)
{
TI=0;
if (senddata[0] >0)
{
SBUF=getdata();
}
else
sendbit=0;
}
else
{
RI=0;
tmp=recdata[0];
tmp++;
if (tmp<6) //数据包未处理结束作丢包处理.
{
recdata[0]=tmp;
recdata[tmp]=SBUF;
};
}
}
/*
void put_data1(unsigned char dat)
{
unsigned char tmp;
tmp=senddata[0];
tmp++;
senddata[tmp]=dat;
senddata[0]=tmp;
}
*/
void comm()
{
unsigned char data i;
if(( senddata[0]>0 ) && (!sendbit) )
{
TI =1;
sendbit=1;
};
if (recdata[0]>1 )
times++;
else
times =0;
if (times>1000) //