微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求大神帮我修改一下我的单片机自带AD转换程序,谢谢

求大神帮我修改一下我的单片机自带AD转换程序,谢谢

时间:10-02 整理:3721RD 点击:
#include"reg51.h"
#include"stdio.h"
#include"intrins.h"
//-------------------------------------------------------
void AD_init();
void serial_init();
void delay(unsigned int a);
float AD_work(unsigned char channel);
unsigned int AD_get(unsigned char channel);
//-------------------------------------------------------
void main(){AD_init();    //A/D转换初始化
serial_init();   //串口初始化
while(1)
{   
   unsigned char i;
   for(i=0;i<8;i++) //循环发送P1.0-P1.7的转换数值  
    {   
         TI=1;    //使用printf函数前须先将发送标志位TI置1   
         printf("The P1.%bd voltage is %f\n",i,AD_work(i));   
         TI=0;   
          delay(1000); //延时约1s   
          }
}
}
//---------------------------------------------------------
unsigned int AD_get(unsigned char channel)
          {
          ADC_CONTR=0x88|channel;    //开启AD转换1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG   ADC_START CHS2 CHS1 CHS0
           _nop_();
            _nop_();
                 _nop_();
                  _nop_();//要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器
                  while(!(ADC_CONTR&0x10));    //等待转换完成
                  ADC_CONTR&=0xe7;      //关闭AD转换,ADC_FLAG位由软件清0
                  return(ADC_RES*4+ADC_RESL);   //返回AD转换完成的10位数据(16进制)
                  }
                  //----------------------------------------------------
                  float AD_work(unsigned char channel)
                  {
                  float AD_val;     //定义处理后的数值AD_val为浮点数
                  unsigned char i;
                  for(i=0;i<100;i++)
                  AD_val+=AD_get(channel); //转换100次求平均值(提高精度)
                  AD_val/=100;
                  AD_val=(AD_val*5)/1024; //AD的参考电压是单片机上的5v,所以乘5即为实际电压值
                  return AD_val;
                  }
                  //------------------------------------------------------------------------------
                  void delay(unsigned int a) //延时约1ms
                  {
                  unsigned int i;
                  while (--a!=0)
                  for(i=600;i>0;i--);   //1T单片机i=600,若是12T单片机i=125
                  }
                  //------------------------------------------------------------------------------
                  void serial_init(){
                  TMOD=0x20;
                  TH1=0xfd;
                  TL1=0xfd; //设置9600波特率
                  SCON=0x50; //串口方式1,允许接收
                  TR1=1;
                  }
                  //------------------------------------------------------------------------------
                  void AD_init()
                  {
                  P1ASF=0xff; //P1口全部作为模拟功能AD使用
          ADC_RES=0;   //清零转换结果寄存器高8位
              ADC_RESL=0; //清零转换结果寄存器低2位
               ADC_CONTR=0x80;//开启AD电源
              delay(2);   //等待1ms,让AD电源稳定
               }

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top