因时间关系不能很详细,大致指出几点,其中主要是(一),后几点是一般估计仅做参考:
(一)

你启动AD转换后马上读结果,肯定是不行的。这一类的单片机AD转换,通常需要数十微秒到数百微妙的时间才能完成。这个问题通常有两种方法解决:
一种方法是:
在定时器中断的一个中断节拍的服务程序中,读取上一步的AD转换结果后,启动下一拍的AD转换。这种办法适合于中断节拍大于AD转换所需的时间,但还不是太大的情况。按这个办法,第一次启动AD转换当然得放到总初始化中去了。
第二种方法是:
中断节拍仍由定时器中断来形成,但在定时器中断的中断服务程序中,只做启动AD转换(必须开放“AD转换完成中断”)的操作,该中断服务程序就结束。其他的操作全放到“AD完成中断”的中断服务程序中去做。这种办法适合于定时中断节拍比AD转换所需的时间大得多的情况。
(二)
没有必要每次中断服务程序中重设定时器,这样做程序麻烦倒是次要的,主要是定时精度就差多了去了。应该在总初始化时设置成固定的周期中断。
(三)
您没有给出变量的定义,从程序中看似乎用了很多浮点型的变量。我们知道,对于这类8位单片机,浮点运算的目标程序的效率将会大大降低,很可能降低一、二个数量级,这取决于您所用的C语言的编译器。如果您的程序中还有其他并行的任务的话,不排除会因为CPU的繁忙度过高而造成时序冲突的错误。
按照这个题目的精度需要,不用浮点,就用unsigned int型的整数,用来代表电压的内部值,中间变量(例如累加用的那个uh)可以用long型或unsigned long就够了。“内部值”的满量程,代表真实的多少V电压,只要自己规定个比例系数,最后要输出显示的时候再换算不迟。

如果这样做,只剩下一个“平方根”麻烦些,定点的平方根算法倒是有,只是需要你自己根据开方前的量程和开方后的量程关系来适当选取。大不了,用查表法也是一个办法。
(四)
从程序中看,您设了很多个数组,但是没起作用,实际上只需要用简单变量就够了的。用数组不仅浪费内存,程序运行效率也会低。一般单片机的内存都是不太富裕的,减小没必要的浪费,也可以减小出现如“堆栈溢出”等故障的概率。
电能质量的主要指标有:
电压偏差、频率偏差、三相电压不平衡、电压波动和闪变、公用电网谐波和公用电网间谐波等。
我国还对应颁布了六项的电能质量相关标准,分别是:
1、GB/T12325-2008 电能质量供电电压偏差?
2、GB/T15945-2008 电能质量电力系统频率偏差?
3、GB/T15543-2008 电能质量三相电压不平衡度?
4、GB/T12326-2008 电能质量电压波动和闪变?

5、GB/T14549-1993 电能质量公用电网谐波?
6、GB/T24337-2009 电能质量公用电网间谐波
电能质量即电力系统中电能的质量。理想的电能应该是完美对称的正弦波。一些因素会使波形偏离对称正弦,由此便产生了电能质量问题。
电能质量(PowerQuality),从严格意思上讲,衡量电能质量的主要指标有电压、频率和波形。从普遍意义上讲是指优质供电,包括电压质量、电流质量、供电质量和用电质量四个方面的相关术语和概念。


