TRISA0=1; //设置RA0为输入方式
}
//系统其它初始化子程序 voidinitial() {
CCP2IE=0; SSPIE=0;
//禁止CCP中断 //禁止SSP中断
//初始化CCP2CON,CCP2为特别事件触发方式 //初始化CCPR2寄存器,设置采样间隔500 μs,
CCP2CON=0X0B; CCPR2H=0X01; CCPR2L=0XF4;
//一个周期内电压采40个点 }
//中断服务程序
void interruptadint(void) {
CCP2IF=0;
ADIF=0; //清除中断标志 adresult.adre[0]=ADRESL;
adresult.adre[1]=ADRESH;//读取并存储A/D转换结果,A/D转换的结果 //通过共用体的形式放入了变量y1中 re[k]=adresult.y1; //1次A/D转换的结果存入数组 k++;//数组访问指针加1 }
//主程序 main( ) {
adinitial();
//A/D转换初始化 //系统其它初始化
//数组访问指针赋初值 //定时器1清0 //中断允许 //打开定时器1
initial(); k=0; TMR1H=0X00; TMR1L=0X00; ei(); T1CON=0X01; while(1)
{
if(k==40)break;
//A/D转换次数达到40,则终止
}
di(); //禁止中断
for(k=0;k<40;k++)re[k]=re[k]-0X199;//假设提升电压为2 V,对应十六进制数199H,则 //需在采样值的基础上减去该值 for(k=0,squad=0;k<40;k++){ uo=re[k];
squ=(double)uo; squ=squ*5/1023;
//强制把采得的数据量转换成双精度数,以便运算 //把每点的数据转换成实际数据
squ=squ*squ; //求一点电压的平方
squad=squad+squ;
}//以上求得40点电压的平方和,存于寄存器 squad中 squ=squad/40; //求得平均值 squ=sqrt(squ); //开平方,求得最后的电压值
squ=squ*154.054; //通过变压器的变比和分压电阻分配确定该系数 //以上得到了实际电网的电压值
squ=squ*10; //为了保证显示的小数点的精度,先对电压值乘以10 uo=(int)squ; //强制把U转换成有符号整型量
sprintf(s,\,uo);//通过sprintf函数把需要显示的电压数据转换成 ASII码,并存于数
//组S中 }