您可以添加到网摘 让更多人关注此文章:
//这是一个两路交流信号的AD转换,然后和标准比较决定输出大于标准的那一路,默认输出A路 #include <pic.h> #include <math.h> #include <stdio.h>
bank1 int re0[40]; //定义存放A/D转换结果的数组,在bank0中 bank1 int re1[40]; //定义存放A/D转换结果的数组,在bank1中 unsigned int i,j, k; //定义几个整型变量 double squ ,squad; //平方寄存器和平方和寄存器,squ又通用为存储其它数值 double standard; //定义双精度浮点型 int uo;
//系统各I/O口初始化 void ioinitial() { TRISA=0X03; //RA0~RA1为输入 RA2~RA4为输出 TRISB=0XC0; // RB0~RB5为输出 RB6~RB7为输入 RB1=1; //B路关断 RB2=0; // 选A导通 RB3=0; // A路导通 RB4=0; // LEDB不亮 RB5=1; // LEDA亮 }
//RA0 A/D转换初始化子程序 void ad0initial() { ADCON0= 0XC1; //选择A/D通道为RA0,RC时钟,且打开A/D转换器 //在工作状态,使A/D转换时钟为 ADCON1=0X02; // RA0 RA1为模拟通道 VDD为参考电压5V ADIF=0; // 清ad中断标志位 ADIE=1; //A/D转换中断允许 GIE=1; //全局中断使能(允许CPU响应所有中断源产生的中断请求 RP0 =0; //设置RA0为输入方式 }
//RA1 A/D转换初始化子程序 void ad1initial() { ADCON0= 0XC9; //选择A/D通道为RA1,RC时钟,且打开A/D转换器 //在工作状态,使A/D转换时钟为 ADCON1=0X02; // RA0 RA1为模拟通道 VDD为参考电压5V ADIF=0; // 清ad中断标志位 ADIE=1; //A/D转换中断允许 GIE=1; //全局中断使能(允许CPU响应所有中断源产生的中断请求 }
//数据采集延时子程序 void delay0() { for(i=0;i<10;i++) continue; }
//AD转换间隔 void delay1() { for(i=0;i<10;i++) continue; }
// 存AD0结果 void ad0store() { ADIF=0; //清除中断标志 re0[i]=ADRES; //1次A/D转换的结果存入数组 }
// 存AD1结果 void ad1store() { ADIF=0; //清除中断标志 re1[j]=ADRES; //1次A/D转换的结果存入数组 }
// 处理AD040次AD转换结果得到交流信号有效值 void ad0process() {for(i=0,squad=0;i<40;i++) { uo=re0[i]; squ=(double)uo; //强制把采得的数据量转换成双精度数,以便运算 squ=squ*5/256; //把每点的数据转换成实际数据 squ=squ*squ; //求一点电压的平方 squad=squad+squ; } //以上求得40点电压的平方和,存于寄存器squad中 squ=squad/40; //求得平均值 squ=sqrt(squ); //开平方,求得最后的电压值 }
// 处理AD140次AD转换结果得到交流信号有效值 void ad1process() {for(j=0,squad=0;j<40;j++) { uo=re1[j]; squ=(double)uo; //强制把采得的数据量转换成双精度数,以便运算 squ=squ*5/256; //把每点的数据转换成实际数据 squ=squ*squ; //求一点电压的平方 squad=squad+squ; } //以上求得40点电压的平方和,存于寄存器squad中 squ=squad/40; //求得平均值 squ=sqrt(squ); //开平方,求得最后的电压值 }
// A路通 void aon() { RB1=1; //B路关断 RB2=0; // 选A导通 RB3=0; // A路导通 RB4=0; // LEDB不亮 RB5=1; // LEDA亮 }
// B路通 void bon() { RB1=0; //A路关断 RB2=1; // 选B导通 RB3=1; // B路导通 RB4=1; // LEDB亮 RB5=0; // LEDA不亮 }
//主程序 main() { ioinitial(); //系统各I/O口初始化 standard=0.273861 ; //75dbuv转换为电压为0.273861 for (i=0;i<40;i++) { ad0initial(); //A/D转换初始化 delay0(); //AD采集延时 ADGO=1 ; //启动A/D转换 for(i=1;ADGO=1;i=1) {continue;} //go为1循环等待,go不为1结束循环 ad0store() ; // 存AD0结果 delay1() ; //AD转换间隔 } ad0process() ; // 处理AD040次AD转换结果得到交流信号有效值 if(squ>=standard) { aon() ; // A路通 } else { for(k=0;k<10;k++) { for (i=0 ;i<40;i++) { ad1initial(); //A/D转换初始化 delay0(); //AD采集延时 ADGO=1 ; //启动A/D转换 for(i=1;ADGO=1;i=1) {continue;} //go为1循环等待,go不为1结束循环 ad1store(); // 存AD1结果 delay1(); //AD转换间隔 } ad1process(); // 处理AD040次AD转换结果得到交流信号有效值 if(squ<standard) break; } if (k=10) { bon(); // b路通 } else { aon() ; // A路通 } } }
[1]
|