📄 main().c
字号:
#include"SPCE061V004.h"
#include"IO_bit.h"
#include"math.h"
#define load IOB0 //同相高电平输出口
#define din IOB1 //同相高电平输出口
#define dclk IOB2 //同相高电平输出口
#define dout IOB3 //上拉输入口(外部中断源2,下降沿触发)
#define pi 3.1415926
///////////////////////////////////////////////////////
unsigned int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;
float fre1=0,fre2=0;
unsigned int ad=0;
unsigned int a[1000];
unsigned int i=0;
float wp,yp;
float dianliu ,dianya;
double ys,yss;
//////////////////////////////////////////////////////向CH452送数据
void ch452_write(unsigned int ldata,unsigned int hdata)
{
unsigned i;
for(i=0;i<8;i++)
{
dclk=0;
if(ldata&0x0001) din=1;
else din=0;
dclk=1;
ldata=ldata>>1;
}
for(i=0;i<4;i++)
{
dclk=0;
if(hdata&0x0001) din=1;
else din=0;
dclk=1;
hdata=hdata>>1;
}
load=0;
load=1;
}
////////////////////////////////////////////////////// 从CH452读取数据
unsigned int ch452_read(void)
{
unsigned int i, key=0,com=0x07;
for(i=0;i<4;i++)
{
if(com&0x01) din=1;
else din=0;
com>>=1;
dclk=0;
dclk=1;
}
load=0;
load=1;
for(i=0;i<7;i++)
{ key=key|dout;
dclk=0;
dclk=1;
key=key<<1;
}
key=key>>1;
return (key);
}
///////////////////////////////////////////////////// 初始化CH452
void ch452_init(void)
{
ch452_write(0x0001,0x0002);
ch452_write(0x0023,0x0004);
ch452_write(0x0080,0x0005);
}
void sys_Init(void)
{ ////////////////////////////////////////////////////IO口初始化
//*P_IOB_Dir=*P_IOB_Dir&0xfff7;
//*P_IOB_Dir=*P_IOB_Dir|0x0007;
//*P_IOB_Attrib=*P_IOB_Attrib&0xfff7;
//*P_IOB_Attrib=*P_IOB_Attrib|0x0007;
//*P_IOB_Data=*P_IOB_Data|0x000f;
*P_IOA_Dir=0xff00;
*P_IOA_Attrib=0xffff;
*P_IOA_Data=0x0000;
*P_IOB_Dir=0xff07;
*P_IOB_Attrib=0xff07;
*P_IOB_Data=0xff0f;
/////////////////////////////////////////开键盘显示功能
ch452_init();
*P_ADC_Ctrl= C_ADCE;
*P_DAC_Ctrl=C_DA1_Direct;
*P_INT_Ctrl=C_IRQ3_EXT2 ;
__asm("INT IRQ");
}
////////////////////////////////////////////////////键盘显示从0到65535
void disp1(unsigned int data)
{
unsigned long int i,c[8]={0x8,0x9,0xa,0xb,0xc,0xd,0xe,0x1};
unsigned int s;
ch452_init();
for(i=0;i<5;i++)
{
s=data%10;
ch452_write(s,c[i]);
if(i==3)
ch452_write(s|0x80,c[i]);
data=data/10;
//if(data==0) break;
}
}
////////////////////////////////////////////////////////////
void AD1(void)
{ unsigned int buff;
float tem;
*P_ADC_MUX_Ctrl= C_ADC_CH4;
*P_ADC_Ctrl= C_ADCE;
buff=*P_ADC_LINEIN_Data;//开始转换
while(!(*P_ADC_MUX_Ctrl&0x8000));
buff=*P_ADC_LINEIN_Data;
*P_ADC_Ctrl=0x0002;//关AD转换
tem=buff*3.3/0xffc0;
dianliu=tem;
// disp2(x1);
}
void AD2(void)
{ unsigned int buff;
float tem;
*P_ADC_MUX_Ctrl= C_ADC_CH5;
*P_ADC_Ctrl= C_ADCE;
buff=*P_ADC_LINEIN_Data;//开始转换
while(!(*P_ADC_MUX_Ctrl&0x8000));
buff=*P_ADC_LINEIN_Data;
*P_ADC_Ctrl=0x0002;//关AD转换
tem=buff*3.3/0xffc0;
dianya=tem;
// disp2(x1);
}
///////////////////////////////////////////
////////////////////////////////////////////////////////////
void IRQ3(void) __attribute__ ((ISR));
void IRQ3(void)
{
unsigned int key_code,i;
key_code=ch452_read();
switch(key_code)
{ case 0x0040:disp1((unsigned int)(dianliu*1000+10));
ch452_write(0xa,0x0f);
for(i=0;i<1000;i++)
*P_Watchdog_Clear=1;
break; //显示电流有效值
case 0x0041:disp1((unsigned int)(dianya*1000+300)) ;
ch452_write(0xd,0x0f);
for(i=0;i<1000;i++)
*P_Watchdog_Clear=1; break; //显示电压有效值
case 0x0042:disp1((unsigned int)(fre1*1000.00));
ch452_write(0xf,0x0f);
for(i=0;i<1000;i++)
*P_Watchdog_Clear=1; break; //显示电网频率
case 0x0043:disp1((unsigned int)(ys*1000.00));
ch452_write(0xe,0x0f);
for(i=0;i<1000;i++)
*P_Watchdog_Clear=1; break; //显示功率因素
case 0x0044:disp1((unsigned int )(yp*1000));
for(i=0;i<1000;i++)
*P_Watchdog_Clear=1;
ch452_write(0x19,0x0f);
ch452_write(0x1,0x0e); break; //显示有功功率
case 0x0045:disp1((unsigned int )(wp*1000));
for(i=0;i<1000;i++)
*P_Watchdog_Clear=1;
ch452_write(0x19,0x0f);
ch452_write(0x2,0x0e); break; //显示无功功率
//case 0x0046:flag3=1;ch452_write(0x7,0x0e);break;
//case 0x0047:flag4=1;break;
/* case 0x0048:key9();break;
case 0x0049:key10();break;
case 0x004a:key11();break;
case 0x004b:key11();break;
case 0x004c:key12();break;
case 0x004d:key13();break;
case 0x004e:key14();break;
case 0x004f:key15();break;*/
default:break;
}
*P_INT_Clear=0x0200;
}
float s;
//////////////////////////////////////////////////////
main()
{ unsigned int count=0;
unsigned int data1=0,data2=0;
sys_Init();
disp1(0);
while(1)
{
while(IOA0==0) /////测周期
{*P_Watchdog_Clear=1;}
while(IOA0==1)
{*P_Watchdog_Clear=1;}
*P_TimerA_Ctrl= C_SourceA_Fosc256 +C_SourceB_1 ;
while(IOA0==0)
{*P_Watchdog_Clear=1;}
while(IOA0==1)
{*P_Watchdog_Clear=1;}
*P_TimerA_Ctrl=C_SourceA_0 +C_SourceB_1 ;
data1=*P_TimerA_Data;
*P_TimerA_Data=0x0000;
while(IOA1==1) ////测高电平时间
{*P_Watchdog_Clear=1;}
while(IOA1==0);
{*P_Watchdog_Clear=1;}
*P_TimerA_Ctrl=C_SourceA_Fosc256+C_SourceB_1 ;
while(IOA1==1)
{*P_Watchdog_Clear=1;}
*P_TimerA_Ctrl=C_SourceA_0+C_SourceB_1 ;
data2=*P_TimerA_Data;
*P_TimerA_Data=0x0000;
AD1();
dianliu=dianliu/3.77;
AD2();
dianya=dianya*12.64;
fre1=(float)(96000.00/data1);
fre2=(float)(96000.00/data2);
s=data2*1.0/data1;
ys=cos((double)(2*pi*s)); //计算功率因素
yss=sin((double)(2*pi*s));
yp= dianya*dianliu*ys; //计算无功功率,有功功率。
wp= dianya*dianliu*yss;
*P_Watchdog_Clear=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -