/*************************************************************
Copyright (C),NEC Electronics (China)
File name:
Author: Version:1.0 Date:
Description:
Others:
Function List:
History:
1. Date:
Author:
Modification:
2. ...
**************************************************************/
#include "main.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void main()
{
CG_init();
Port_init();
lcd_init();
delay(10);
while(1){
while(j<2){
choose_fre();
j++;
}
j=0;
if(fre>=1000){
while(N!=512){
N++;
true_peak_init();
}
while(N!=0)
{
ADC(ad[N-1]);
true(turn);
peak(turn);
N--;
}
}
else{
true_peak_init();
while(N!=0)
{
ADC(ad[N-1]);
true(turn);
peak(turn);
N--;
}
}
time++;
RMS=sqrt(frms/rmsnum)+RMS;
Vpp=peakup-peakdown+Vpp;
frms=0;
rmsnum=0;
N=0;
peakup=-100;
peakdown=100;
P5.7=0;
if(time==1){
P5.7=1;
if(key_choose==0){
displayfre();
displayvpp();
displayrms();
}
if(key_choose==1){
int i;
float tmp;
plot_fit1();
plot_fit1();
plot_fit1();
//plot_fit1();
//plot_fit1();
//plot_fit1();
LCD12864_Clean();
for(i=0;i<128;i++)
display_point(i,54*(ver*ad[i]/256.0-2.5)/Vpp,1);
for(i=0;i<50;i++){
delay(10000);
delay(10000);
delay(10000);
}
LCD12864_Clean();
for(i=0;i<128;i++)
display_point(i,54*(ver*ad[i+128]/256.0-2.5)/Vpp,1);
for(i=0;i<50;i++){
delay(10000);
delay(10000);
delay(10000);
}
LCD12864_Clean();
for(i=0;i<128;i++)
display_point(i,54*(ver*ad[i+256]/256.0-2.5)/Vpp,1);
for(i=0;i<50;i++){
delay(10000);
delay(10000);
delay(10000);
}
LCD12864_Clean();
for(i=0;i<128;i++)
display_point(i,54*(ver*ad[i+384]/256.0-2.5)/Vpp,1);
for(i=0;i<50;i++){
delay(10000);
delay(10000);
delay(10000);
}
//for(i=0;i<128;i++)
// display_point(i,54*(ver*ad[i]/256.0-2.6)/Vpp,1);
}
Global_init();
}
}
}
void CG_init()
{
//System clock: 20 MHz
CMC = 0x51;
CSC = 0x41;
CKC = 0x38;
}
/* This function is used to initial all the port used */
void Port_init()
{
PM3.1=0; //P3.1 output
PM6&=0x07; //P6.0 to P6.2 input;P6.3 to P6.7 output
P6.3 =0;
P6.4 =0;
P6.5 =0;
P6.6 =0;
P6.7 =0;
P3.1 =0;
//AD data
PM8=0xFF;
//AD control
PM7.0=0; //WR
PM7.1=0; //RD
PM7.2=1;
PM5.3=0;
PM5.7=0;
PM5.6=1;
PM5.1=0;
PM5.2=1;
P5.3=1; //INTR
//low frequency input
PM4.2=1;
//high frequency input
PM0.0=1;
PM5.4=0;
PM5.5=1;
PM12.0=1;
//12864
PM2=0x00; //as the input of LCD 12864 Module
PM15.0=0;
PM15.1=0;
PM15.2=0;
}
void choose_fre(void)
{
high_init();TT0=0x0003;
if(fre<1000) {period_init(); TT0=0x0010;}
}
void period_init(void){
DI();
TAU0EN = 1;
TPS0 = 0X000B;
TMR04 = 0X0104;
TS0= 0x0010;
TMIF04=0;
TMMK04=0;
EI();
state_period=1;
while(state_period==1);
}
__interrupt void Time_4( void ){
flag_period++;
if(flag_period>=3)
{
lowtime=lowtime+TDR04+1;
if(flag_period==4){
flag_period=0;
fre=1/(0.0001024*lowtime/2);
state_period=0;
lowtime=0;
}
}
}
void high_init(void)
{
DI();
state_high=1;
TAU0EN = 1; /*set Timer1*/
TPS0 = 0X0000;
TMR01 = 0X0000;
TMR00 = 0x1106; /*a question*/
//TMPR001=0;
//TMPR101=0;
TDR01 = 0X4E1F;/*delay one second*/
TDR00 = 0xFFFF;
TS0= 0x0002|0x0001;
TMIF01=0;
TMIF00=0;
TMMK01=0;
TMMK00=0;
EI();
while(state_high==1);
}
__interrupt void Time_1(void)
{
flag_high++;
if(flag_high==1000){
TT0=0x0001;
fre=(0xFFFF-TCR00)+65535*Num;
state_high=0;
Num=0;
flag_high=0;
}
}
__interrupt void Time_0(void)
{
Num++;
}
void true_peak_init(void)
{
DI();
if(fre>=1000){
TAU0EN = 1;
TPS0 = 0X0000;
TMR05 = 0X0000;
if(fre>100000) TDR05 = N;
else if(fre>50000) TDR05=N*4;
else if(fre>20000) TDR05 = N*4;
else if(fre>10000) TDR05 = N*10;
else if(fre>5000) TDR05 = N*20;
else if(fre>2500) TDR05 = N*40;
else TDR05 = N*80;
choose_rms=1;
TMIF05=0;
TMMK05=0;
EGP0=0;
EGN0=1;
PIF0=0;
PMK0=0;
TMPR005=0;
TMPR105=0;
state_true_peak_1=1;
state_true_peak_2=1;
EI();
while(state_true_peak_1==1);
}
else{
TAU0EN = 1;
TPS0 = 0X0009;
TMR05 = 0X0000;
TDR05=1/fre/100/0.0000256;
choose_rms=0;
TMIF05=0;
TMMK05=0;
EGP0=0;
EGN0=1;
PIF0=0;
PMK0=0;
TMPR005=0;
TMPR105=0;
state_true_peak_1=1;
state_true_peak_2=1;
EI();
while(state_true_peak_1==1);
}
}
__interrupt void outinter_0(void)
{
if(choose_rms==1)
{
EGP0=0;
EGN0=0;
DI();
TS0= 0x0020;
EI();
while(state_true_peak_2==1);
state_true_peak_1=0;
}
else{
EGP0=0;
EGN0=0;
DI();
TS0= 0x0020;
EI();
while(state_true_peak_2==1);
state_true_peak_1=0;
TT0=0x0020;
DI();
}
}
__interrupt void Time_5(void)
{
if(choose_rms==1){
TT0=0x0020;
EGP0=0;
EGN0=0;
DI();
RD=0;
while(INTR==1);
getdata=P8;
RD=1;
ad[N-1]=getdata;
state_true_peak_2=0;
}
else{
EGP0=0;
EGN0=0;
RD=0;
while(INTR==1);
getdata=P8;
RD=1;
ad[N]=getdata;
N++;
if(N==512){
state_true_peak_2=0;}
}
}
void ADC(unsigned char c)
{
turn=(float)c/255*ver-2.5;
}
void true(float a)
{
rmsnum++;
frms=frms+a*a;
}
void peak(float b)
{
if(b>=peakup)
{
peakup=b;
}
if(b<=peakdown)
{
peakdown=b;
}
}
void displayfre(void){
LCD12864_Clean();
LCD_clr();
print_float(fre,0x80+2);
LCD_print_str("频率",0x80);
LCD_print_str("Hz",0x80+7);
}
void displayvpp(void)
{
Vpp=Vpp/time;
LCD_print_str("峰峰值",0x90);
print_float(Vpp,0x90+3);
LCD_print_str("V",0x90+7);
}
void displayrms(void){
RMS=RMS/time;
LCD_print_str("有效值",0x88);
print_float(RMS,0x88+3);
LCD_print_str("V",0x88+7);
}
void Global_init(){
frms=0;
rmsnum=0;
N=0;
peakup=-100;
peakdown=100;
P5.4=1;
RMS=0;
Vpp=0;
time=0;
j=0;
}
void plot_fit(void){
int i,down,up,jj;
float times,tmp;
times=N_num1/256.0;
for(i=0;i<128;i++){
tmp=0;
down=ceiling1(times*i);
up=floor1(times*(i+1));
for(jj=down;j