📄 aad.#2
字号:
//************************************************************
// AD采样程序
//
// (1)使用C8051F005芯片
// (2)外部晶振11.0592MHZ ,使用内部2.4V基准电压
// (2)单端输入方式,两通道输入ANIO、ANI1,向ADBUSY置1启动AD转换
// (3)对采样10次在求平均值以减小误差
// (4)经过处理与实际值相差0~3MV
// 注:测量参考电压和输入电压为同一表
//*************************************************************
#include <c8051f000.h>
#include <stdio.h>
sfr16 ADC0 = 0xbe;
sfr16 ADC0GT = 0xc4;
sfr16 ADC0LT = 0xc6;
#define SYSCLK 18432000 //系统时钟 频率
#define SAMPLE_RATE 50000
#define VREF 2.4 //参考电压值
void ADC0_Init (void); //AD转换初始化设置函数
void Timer3_Init (int counts); //定时3初始化设置函数
void ADC0_ISR (void); //AD转换中断函数
void delay (int t); //延时程序
void SYSCLK_Init (void); //系统时钟函数
void WDT_CLOSE(void); //关闭看门狗
int result; //数据存储
float value; //存储测量值
char flag; //标志
//***********************************************************
//关闭看们狗
//***********************************************************
void WDT_CLOSE(void)
{ EA=0;
WDTCN = 0xde;
WDTCN = 0xad;
EA=1;
}
//***********************************************************
//系统时钟设置
//晶振振荡方式,F>6.7mhz
//选用外部时钟
//允许时钟复位
//************************************************************
void SYSCLK_Init (void)
{ int i;
OSCXCN = 0x67;
for (i=0; i < 256; i++) ;
while (!(OSCXCN & 0x80)) ; //等待外部准备
OSCICN = 0x88;
}
//**********************************************************
//AD初始化设置
//AIN0 独立输入
//使用内部参考电压, PGA= 2,使用4系统时钟
//转换数据右对齐
//**********************************************************
void ADC0_Init (void)
{
ADC0CN = 0x44; //右对齐
REF0CN = 0x03; //使用内部参考电压
AMX0SL = 0x00; //AIN0 独立输入
AMX0CF = 0x00;
ADC0CF = 0x20; // 4系统时钟 PGA 1
EIE2 |= 0x02; // 中断开
}
//**********************************************
//AD转换程序
//**********************************************
void ADC0_ISR (void) interrupt 15
{
TMR3CN &=0x20; //关定时器3 清除标准位
ADCINT = 0x00; //清除中断标准位
delay (10); //延时等待AD转换稳定
result = ADC0; //数据转存
TMR3CN |= 0x04; //定时器3开
flag = 1;
}
//***********************************************
//延时子程序
//***********************************************
void delay (int t)
{ int i,j;
for (i=0;i<t;i++)
for(j=0;j<10;j++) ;
}
//******************************************
//MAIN
//******************************************
void main (void)
{ int i=0;
float voltage=0;
WDT_CLOSE(); //关闭看门狗
SYSCLK_Init ( ); //系统时钟设置
Timer3_Init (SYSCLK/SAMPLE_RATE); //定时器3初始化设置
ADC0_Init (); //AD初始化
ADCEN = 1; //AD转换允许打开
EA = 1;
flag = 0;
while (1) //循环
{
while (flag == 1)
{ flag = 0;
value = VREF*((float)result/4096.0)/2; //单次测量值
i++;
voltage+=value;
}
while(i==100) //测量100次的值求平均值
{ i=0;
voltage=(float)voltage/100;
value=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -