(1)直接输出AD值是对的。3.1V对应输出9D
(2)AD均值 for(m=0;m<5;m++) 应该自加5次的呀(m=0,1,2,3,4),但是除以5就是不对,3.1V输出C4(3.8V),大了,要除以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)自加m,除以m+1或直接输出高八位AD结果
(4)自加m次,除以m,AD值偏大
|
|