📄 main.c
字号:
#include "Main.h"
#include "Lcd.h"
#include "Ad.h"
#include "Keyled.h"
#define POW_GATE 5 //门限
#define SamplRate 39800
#define pi 3.14159
sfr16 ADC0 = 0xbe; // ADC0 data
/*
int16(1024 * cos(n*pi/512)) n = 0:511
*/
int code COSMT[]={
1024,1024,1024,1024,1024,1024,1023,1023,1023,1022,1022,1022,1021,1021,1020,1020,1019,1018,1018,1017,1016,1016,1015,1014,1013,1012,1011,1010,1009,1008,1007,
1006,1004,1003,1002,1000,999,998,996,995,993,992,990,989,987,985,983,982,980,978,976,974,972,970,968,966,964,962,960,958,955,953,951,948,946,944,941,939,936,
934,931,928,926,923,920,917,915,912,909,906,903,900,897,894,891,888,885,882,878,875,872,868,865,862,858,855,851,848,844,841,837,834,830,826,822,819,815,811,
807,803,799,796,792,788,784,779,775,771,767,763,759,755,750,746,742,737,733,729,724,720,715,711,706,702,697,692,688,683,678,674,669,664,659,654,650,645,640,
635,630,625,620,615,610,605,600,595,590,584,579,574,569,564,558,553,548,543,537,532,526,521,516,510,505,499,494,488,483,477,472,466,460,455,449,443,438,432,
426,421,415,409,403,398,392,386,380,374,369,363,357,351,345,339,333,327,321,315,309,303,297,291,285,279,273,267,261,255,249,243,237,230,224,218,212,206,200,
194,187,181,175,169,163,156,150,144,138,132,125,119,113,107,100,94,88,82,75,69,63,57,50,44,38,31,25,19,13,6,0,-6,-13,-19,-25,-31,-38,-44,-50,-57,-63,-69,-75,
-82,-88,-94,-100,-107,-113,-119,-125,-132,-138,-144,-150,-156,-163,-169,-175,-181,-187,-194,-200,-206,-212,-218,-224,-230,-237,-243,-249,-255,-261,-267,-273,
-279,-285,-291,-297,-303,-309,-315,-321,-327,-333,-339,-345,-351,-357,-363,-369,-374,-380,-386,-392,-398,-403,-409,-415,-421,-426,-432,-438,-443,-449,-455,
-460,-466,-472,-477,-483,-488,-494,-499,-505,-510,-516,-521,-526,-532,-537,-543,-548,-553,-558,-564,-569,-574,-579,-584,-590,-595,-600,-605,-610,-615,-620,
-625,-630,-635,-640,-645,-650,-654,-659,-664,-669,-674,-678,-683,-688,-692,-697,-702,-706,-711,-715,-720,-724,-729,-733,-737,-742,-746,-750,-755,-759,-763,
-767,-771,-775,-779,-784,-788,-792,-796,-799,-803,-807,-811,-815,-819,-822,-826,-830,-834,-837,-841,-844,-848,-851,-855,-858,-862,-865,-868,-872,-875,-878,
-882,-885,-888,-891,-894,-897,-900,-903,-906,-909,-912,-915,-917,-920,-923,-926,-928,-931,-934,-936,-939,-941,-944,-946,-948,-951,-953,-955,-958,-960,-962,
-964,-966,-968,-970,-972,-974,-976,-978,-980,-982,-983,-985,-987,-989,-990,-992,-993,-995,-996,-998,-999,-1000,-1002,-1003,-1004,-1006,-1007,-1008,-1009,
-1010,-1011,-1012,-1013,-1014,-1015,-1016,-1016,-1017,-1018,-1018,-1019,-1020,-1020,-1021,-1021,-1022,-1022,-1022,-1023,-1023,-1023,-1024,-1024,-1024,
-1024,-1024
};
/*
int16(1024 * sin(n*pi/1024)) n = 0:1023
*/
int code SINMT[]={
0,3,6,9,13,16,19,22,25,28,31,35,38,41,44
,47,50,53,57,60,63,66,69,72,75,78,82,85,
88,91,94,97,100,103,107,110,113,116,119,
122,125,128,132,135,138,141,144,147,150,
153,156,160,163,166,169,172,175,178,181,
184,187,191,194,197,200,203,206,209,212,
215,218,221,224,227,230,234,237,240,243,
246,249,252,255,258,261,264,267,270,273,
276,279,282,285,288,291,294,297,300,303,
306,309,312,315,318,321,324,327,330,333,
336,339,342,345,348,351,354,357,360,363,
366,369,371,374,377,380,383,386,389,392,
395,398,401,403,406,409,412,415,418,421,
424,426,429,432,435,438,441,443,446,449,
452,455,458,460,463,466,469,472,474,477,
480,483,485,488,491,494,497,499,502,505,
507,510,513,516,518,521,524,526,529,532,
535,537,540,543,545,548,550,553,556,558,
561,564,566,569,572,574,577,579,582,584,
587,590,592,595,597,600,602,605,607,610,
613,615,618,620,623,625,628,630,632,635,
637,640,642,645,647,650,652,654,657,659,
662,664,666,669,671,674,676,678,681,683,
685,688,690,692,695,697,699,702,704,706,
708,711,713,715,717,720,722,724,726,729,
731,733,735,737,739,742,744,746,748,750,
752,755,757,759,761,763,765,767,769,771,
773,775,777,779,782,784,786,788,790,792,
794,796,798,799,801,803,805,807,809,811,
813,815,817,819,821,822,824,826,828,830,
832,834,835,837,839,841,843,844,846,848,
850,851,853,855,857,858,860,862,863,865,
867,868,870,872,873,875,877,878,880,882,
883,885,886,888,889,891,893,894,896,897,
899,900,902,903,905,906,907,909,910,912,
913,915,916,917,919,920,922,923,924,926,
927,928,930,931,932,934,935,936,937,939,
940,941,942,944,945,946,947,948,950,951,
952,953,954,955,957,958,959,960,961,962,
963,964,965,966,967,968,969,970,971,972,
973,974,975,976,977,978,979,980,981,982,
983,983,984,985,986,987,988,989,989,990,
991,992,993,993,994,995,996,996,997,998,
998,999,1000,1000,1001,1002,1002,1003,1004,1004,1005,1006,1006,1007,1007,1008,
1008,1009,1009,1010,1010,1011,1011,1012,1012,1013,1013,1014,1014,1015,1015,1016,
1016,1016,1017,1017,1017,1018,1018,1018,1019,1019,1019,1020,1020,1020,1020,1021,
1021,1021,1021,1022,1022,1022,1022,1022,1023,1023,1023,1023,1023,1023,1023,1024,
1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,
1024,1024,1024,1024,1023,1023,1023,1023,1023,1023,1023,1022,1022,1022,1022,1022,
1021,1021,1021,1021,1020,1020,1020,1020,1019,1019,1019,1018,1018,1018,1017,1017,
1017,1016,1016,1016,1015,1015,1014,1014,1013,1013,1012,1012,1011,1011,1010,1010,
1009,1009,1008,1008,1007,1007,1006,1006,1005,1004,1004,1003,1002,1002,1001,1000,
1000,999,998,998,997,996,996,995,994,993,993,992,991,990,989,989,988,987,986,985,
984,983,983,982,981,980,979,978,977,976,975,974,973,972,971,970,969,968,967,966,
965,964,963,962,961,960,959,958,957,955,954,953,952,951,950,948,947,946,945,944,
942,941,940,939,937,936,935,934,932,931,930,928,927,926,924,923,922,920,919,917,
916,915,913,912,910,909,907,906,905,903,902,900,899,897,896,894,893,891,889,888,
886,885,883,882,880,878,877,875,873,872,870,868,867,865,863,862,860,858,857,855,
853,851,850,848,846,844,843,841,839,837,835,834,832,830,828,826,824,822,821,819,
817,815,813,811,809,807,805,803,801,799,798,796,794,792,790,788,786,784,782,779,
777,775,773,771,769,767,765,763,761,759,757,755,752,750,748,746,744,742,739,737,
735,733,731,729,726,724,722,720,717,715,713,711,708,706,704,702,699,697,695,692,
690,688,685,683,681,678,676,674,671,669,666,664,662,659,657,654,652,650,647,645,
642,640,637,635,632,630,628,625,623,620,618,615,613,610,607,605,602,600,597,595,
592,590,587,584,582,579,577,574,572,569,566,564,561,558,556,553,550,548,545,543,
540,537,535,532,529,526,524,521,518,516,513,510,507,505,502,499,497,494,491,488,
485,483,480,477,474,472,469,466,463,460,458,455,452,449,446,443,441,438,435,432,
429,426,424,421,418,415,412,409,406,403,401,398,395,392,389,386,383,380,377,374,
371,369,366,363,360,357,354,351,348,345,342,339,336,333,330,327,324,321,318,315,
312,309,306,303,300,297,294,291,288,285,282,279,276,273,270,267,264,261,258,255,
252,249,246,243,240,237,234,230,227,224,221,218,215,212,209,206,203,200,197,194,
191,187,184,181,178,175,172,169,166,163,160,156,153,150,147,144,141,138,135,132,
128,125,122,119,116,113,110,107,103,100,97,94,91,88,85,82,78,75,72,69,66,63,60,57
,53,50,47,44,41,38,35,31,28,25,22,19,16,13,9,6,3
};
//----------------外部变量声明------------------
extern unsigned int AD_Index;//AD采样游标
//---------------内部函数声明
void SYSCLK_Init( void );//时钟初始化
void PORT_Init( void ); //配置端口
void Timer0_Init (void); //时钟0
void Timer3_Init (void); //采样定时
void StartANA(void); //一次完整分析
void ReapeatDis_F(void);
void ReapeatDis_A(void);
// -------------------------------------FFT region---------------------------
struct compx //复杂类型 中间计算用
{
long int real;
long int imag;
}compx ;
struct compx_S // 简单类型
{
int real;
int imag;
}compx_S ;
struct compx_S EE(struct compx_S b1,struct compx b2); //复数乘
void FFT(struct compx_S *xin,int N); //FFT
void Change(struct compx_S *new,unsigned int T[]); //变换 1024 ---》 2048
unsigned int xdata result[1024]; //FFT结果 功率值
unsigned int xdata result_LAST[1024]; //FFT结果 功率值 上一次
struct compx_S xdata signal[1025]; //s[1025] 为 求 共轭对称用 共存放了 2048 个有效点
void sort_S(unsigned int A[],int n,unsigned int DEX[]);//排序
unsigned int POW_Index[1024]; //排序后索引
unsigned int POW_Index_LAST[1024]; //排序后索引
//----------------全局变量声明------------------
tWord For1S = 400; //400*2.5 = 1000 ms PCA模块
tByte Count25ms = 10; //延时功能模块
tByte KeyValue = 0; //键值
unsigned char bdata State = 0x00; //系统状态
sbit IsDist = State^0; //是否失真度
sbit FREQSel = State^1; //0 为100HZ 1 为20HZ
sbit IsANA = State^2; //这个5秒过程是否分析过 是否已经分析过
sbit IsHold = State^4; //是否暂停显示 只有暂停显示的时候 可以参看原来的记录
sbit IsHDC = State^5; //是否有直流分量
sbit ISNSCR = State^6; //是否需要清平
sbit ISLast = State^7; //是否显示的上一次的值
unsigned char SECEND = 0; //控制的时钟依据
unsigned char DispalyIndex; //显示游标
unsigned char DispalyIndex_OLD; //上一次的显示游标
unsigned long int POW_ALL; //总功率
unsigned long int POW_OTHER; //谐波功率
unsigned int FRANGE; //失真度
void main(void)
{
unsigned int i;
WDTCN = 0xde;
WDTCN = 0xad; //关看门狗
SYSCLK_Init();
PORT_Init();
Timer0_Init();
Timer3_Init();
ADC_Init();
EA=1; //开总中断
//Init VALUE
DispalyIndex = 0;
DispalyIndex_OLD = 0;
//Lcdmain(); //欢迎
Hd7279_Init();
Test7279(0);
StartANA();
_nop_();
while(1)
{
if(IsDist)
{
StartANA();
if(POW_Index[0] == 0) //有直流分量
{
i = 2;
IsHDC = 1;
}
else
{
i = 1;
IsHDC = 0;
}
for(i; i < 25;i ++)
POW_OTHER += result[i];
FRANGE = POW_OTHER * 1000 / result[IsHDC]; //选择除
ReapeatDis_F();
}
else
{
if(SECEND == 5)
{
SECEND = 0;
IsANA = 0; //又一个五秒开始
if(!IsHold)
ReapeatDis_A(); //显示
}
if((SECEND == 3) && (IsANA == 0))
{
IsANA = 1;
if(!IsHold) //这样暂停中将会不分析
StartANA();
}
if(DispalyIndex_OLD != DispalyIndex)
{
DispalyIndex_OLD = DispalyIndex;
ReapeatDis_A(); //显示
}
}
//Delay25ms(5);
}
}
void StartANA(void)
{
unsigned int i;
P30 = 0;
/*-----------赋值给上一次----------*/
for(i = 0;i < 1024; i ++)
{
result_LAST[i] = result[i];
POW_Index_LAST[i] = POW_Index[i];
}
AD_Index = 0; //初始设为零
ReadIn();
/*
for(i=0;i < 2048; i = i + 2)
{
//signal[i/2].real = 4096 * sin(pi*i / 2); //偶数项 1024 时 相当于 1 V 4096 * 3 -- 14 位
//signal[i/2].imag = 4096 * sin(pi*(i+1) / 2); //技术项
signal[i/2].real = 4096 ; //偶数项 1024 时 相当于 1 V 4096 * 3 -- 14 位
signal[i/2].imag = - 4096; //技术项
}
*/
for(i = 0 ;i < 1024;i ++)
POW_Index[i] = i; //初始化索引表
FFT(signal,501); //RESULT --> signal
Change(signal , result); //求功率
sort_S(result , 1024 , POW_Index); //排序
P30 = 1;
}
//内部函数实现
void SYSCLK_Init( void )
{
int i;
OSCXCN = 0x67; // 打开外部22.1184MHz的晶体
for (i=0; i < 256; i++) ;
while (!(OSCXCN & 0x80)) ; // 等待外部晶体稳定
OSCICN = 0x88; // 使用外部晶体作为系统时钟 是能始终丢失检测
// OSCICN = 0x07; //或者使用内部16MHz 精确度不高
}
void Timer0_Init (void) //2.5ms //定时运行程序的
{
CKCON|=0x8;
TMOD|=0x1; //16位
TR0 = 0;
TH0 = (-SYSCLK/400) >> 8; // 2.5ms
TL0 = -SYSCLK/400;
TR0 = 1; //开始 Timer0
IE|= 0x2;
}
void Timer3_Init (void)
{
EIE2 |= 0x01; //允许中断
EIP2 |= 0x01; //优先级升高
TMR3CN = 0x02; //禁止中 CLK = SYSCLK
TMR3RLL = -SYSCLK / SamplRate;
TMR3RLH = (-SYSCLK / SamplRate) >> 8;
TMR3H = (-SYSCLK / SamplRate) >> 8;
TMR3L = -SYSCLK / SamplRate;
}
void Timer3_ISR(void) interrupt 14
{
TMR3CN &= (~0x80); //清除中断标志
AD0INT = 0; //清除标志
while (AD0INT == 0);
if(AD_Index % 2)
signal[AD_Index / 2].imag = ADC0;
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -