积分规则 网站地图 帮助中心    
嵌入式软件 单 片 机 DSP 存储器 传感控制 光电显示
嵌入式硬件 CPLD/FPGA SOPC AD/DA 接口电路 模拟设计
I C设计 通信产品 汽车电子 电源产品 消费电子 数控系统
工业控制 军工/航天 安防产品 医疗电子 计算机外设 测试测量
供应 I C
求购 公司库

  IC 求购 销售 公司 论文 DATASHEET 参考设计 论坛
当前位置: 电子技术 >> 单片机 >> 相关文章
  相关分类: 相关文章 | 应用论文 | 新产品 | 下载 |
基于PIC16F72的两路交流信号AD转换
 
作者:未知   来源:单片机学习网    点击数:278   更新时间:2008-9-1
您可以添加到网摘 让更多人关注此文章:

    

//这是一个两路交流信号的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]



相关文章
· 基于PIC16F877A的简易数字频率计[280]
· 几种警笛声音的PIC程序[394]
· PIC在家庭消毒柜的应用[87]
· 基于PIC16F639的可低频唤醒的TPMS发射系统设计[128]
· 基于PIC18F258的全自动热敏电阻测试仪的开发与研制[202]
热门评论排行
·VHDL设计中电路简化问题的
·ARM嵌入式系统基础教程(N
·江苏嵌入式Linux教育培训
·ARM处理器应用开发4步骤
·锐极LINUX驱动培训班定于

文章评论
    没有任何评论
*只显示最新10条评论。评论内容只代表网友观点,与本站立场无关。更多评论
发表评论
  * 请先[登陆]再进行评论,谢谢。
评分: 1分 2分 3分 4分 5分
内容: *
发帖须知:
一.所发文章必须遵守《互联网电子公告服务管理规定》;
二.严禁发布供求代理信息,公司介绍,产品信息等广告宣传信息;
三.严禁恶意重复发帖;
四.严禁对个人,实体,民族,国家等进行漫骂,污蔑,诽谤。
 
热点新闻 [更多]
 
新兴半导体技术催生绿色节能的大学校园
电子系统创新促进汽车走向环保与节能
意法CEO携新品巡游中国 
未来3年新余需要8万光伏产业人才
看好中国未来发展:瑞萨提升在华芯片产
中国LED发展神速将成为未来照明产业
剖析联发科技2009年五大产品策略
突破四大障碍 蓝牙立体声耳
瑞萨向德国企业出售当地半导体前工序工
产业紧缩 PCB业或将提前
 
热门下载 [更多]
 
[ PCB设计] Protel99教程下载
[ ] 手把手学单片机20个例
[ ] 单片机做的智能台灯
[ ] 单片机入门书
[ ] linux系统移植开发文档
[ ] IC卡的读写程序
[ ] 8051单片机C语言彻底应用
[ 常用软件] 555定时器电路设计软件V1.2
[ 常用软件] 51定时器计算软件
[ ] ARM处理器应用开发4步骤
 
论坛新帖 [更多]
 
[转]教你如何进行电磁兼容设计...
[转]汽车和专业音响原厂设计原...
诺基亚,三星手机原厂图纸和PC...
电子元器件可靠性和失效分析经典...
[建议]FPGA设计技巧与实例...
Xilinx FPGA设计快速...
基于CPLD的各种设计实例和分...
教你如何学会MSP430单片机...
凌阳单片机教程(共8章)非常详...
[建议]学习PIC系列单片机的...

 
赞助商 [更多]
 

ICP许可证号:[粤 05056597]
联系电话:010-82517432 82517615 传真: 010-82517615

版权所有 Copyright © 2006 嵌入式技术网