微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STC5410-AD_串口for语句求AD均值的困惑,为啥得多除1

STC5410-AD_串口for语句求AD均值的困惑,为啥得多除1

时间:10-02 整理:3721RD 点击:
(1)直接输出AD值是对的。3.1V对应输出9D
(2)AD均值 for(m=0;m<5;m++)        应该自加5次的呀(m=0,1,2,3,4),但是除以5就是不对,3.1V输出C4,大了,要除以6。
也试过m<10,还是C4       
/**********************************************************************************************
项目:5410AD AD转换发送给串口
功能:P1.0 AD采样后将值发送给串口
设计:robin_chen559
日期: 2013.12.18
备注:Fosc=11.0592M
**********************************************************************************************/
#include<STC12C5410AD.H>                        //包含头文件
#include <intrins.h>                                        //挂羊头,没啥用
#define uint unsigned int
#define uchar unsigned char

sbit LED_G = P1^6;                                                //指示LED
uint AD_Res=0;
//函数声明
void Delay_MS(uint delay);                                //延时函数声明
void AD_INIT(void);                                            //AD初始化  
float AD_Result(void);                      //AD结果程序
void  InitUart();                       //串口初始化程序
void  Sent_Data(uchar dat);             //串口发送数据
//毫秒延时程序
void Delay_MS(uint delay)
{
uint dy;
while(delay--)
{
for(dy=0;dy<600;dy++);
}
}
//AD初始化
void AD_INIT(void)
{
P1M0 = 0x01;                    // 0000 0001
P1M1 = 0xff;                                         //        1111 1111  P1^0  11开漏模式,AD使用。其余口推挽       
ADC_CONTR|=0x80;                //ADC_CONTR 1000 0000 开启ADC电源
Delay_MS(5);                    //延时1mS待上电稳定                               
}
//AD转换
float AD_Result(void)
{                                                            
uchar m;
ADC_DATA = 0x00;                                    //清除AD转换高8位结果
ADC_LOW2 = 0x00;                                    //清除AD转换低2位结果
for(m=0;m<5;m++)                                        //AD结果5次自加
{
ADC_CONTR |= 0x08;                             // 启动AD转换
Delay_MS(1);                       // 等待输入电压稳定
while(1)                                                    // 等待AD转换完成
{
  if( (ADC_CONTR&0x10) == 0x10 )    //AD_FLAG 为1,跳出循环
  {
   break ;
  }
}
  AD_Res = (AD_Res + ADC_DATA);         
  ADC_CONTR = 0xe0;                 // 清除转换标志位。关闭电源
  }
  AD_Res = AD_Res/6;                                //求5次AD结果均值
  return (AD_Res) ;                 //返回AD转换结果
}
//串口初始化程序
void InitUart()                     // 初始化,定义串口的波特率
{
     PCON = 0x00;                                        //SMOD =0,串口波特率正常
         TMOD = 0x20;                                        //定时器1,模式2,八位自动重装
     SCON = 0x42;                                        //5a,方式1,串行口10位异步通信
     TH1  = 0xFD;                                        //SMOD =0,fd=0xfd,9600波特率
     TL1  = 0xFD;
     TR1  = 1;                                                 //启动定时器
}
//串口数据传送
void  Sent_Data(uchar dat)
{
while (!TI);
TI=0;
SBUF=  AD_Res ;
}
//主程序
void main()
{
   AD_INIT() ;                                    //AD初始化
   InitUart() ;                                          //串口初始化
   while(1)
   {
           AD_Result();                      //AD处理程序
           Sent_Data();              //串口发送AD结果
           LED_G = 0;
           Delay_MS(300);
           LED_G = 1;
           Delay_MS(300);          
   }  
}
(3)值刚好,直接输出ADRES/除以m+1


  (4)  值会大些,自加m次后,除以m





自加之前没有变量清零,下一次循环自加的时候多加了一次
添加AD_Res=0;,程序结构有问题
for(m=0;m<5;m++)                                        //AD结果5次自加
{
ADC_CONTR |= 0x08;                             // 启动AD转换
Delay_MS(1);                       // 等待输入电压稳定
while(1)                                                    // 等待AD转换完成
{
  if( (ADC_CONTR&0x10) == 0x10 )    //AD_FLAG 为1,跳出循环
  {
   break ;
  }
}
  AD_Res = (AD_Res + ADC_DATA);         
  ADC_CONTR = 0xe0;                 // 清除转换标志位。关闭电源
  }
  AD_Res = AD_Res/6;                                //求5次AD结果均值
  return (AD_Res) ;                 //返回AD转换结果
}

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

网站地图

Top