AD采集

基于c8051f020的ADC采样程序
/*===============================================================*/
/*函数名称: main.c */
/*函数功能: 主函数,调用各模块 */
/*基本思想: 单端输入,定时启动,由T2定时,选择AIN0.3为ADC0转化通道 */
/*修改记录: 无修改记录 */
/*编写作者: t483-4-19chenyong */
/*编写日期: 2007-4-06 */
/*===============================================================*/
注意外部输入接AIN0.3.数据精度很不错!!!
#ifndef _COMMON_H_
#define _COMMON_H_
/*==============================================================*/
/*类型定义 */
/*==============================================================*/
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define ADC0START AD0BUSY=1
#define REAL_RATE 488L
#define ADJRATESE 118L
sfr16 ADC0VAL=0xbe;//将ADC0H-ADC0L通过sfr16实现
/*==============================================================*/
/*库函数声明 */
/*==============================================================*/
#include
#include
/*==============================================================*/
/*函数声明 */
/*==============================================================*/
void adc0_mux(uchar type,uchar source);
void adc0_source(uchar source);
void p1anolog_ini(uchar port);
void adc0_ini();
void config();
void t2_ini();
void t2_baud(uint t2reload);
/*==============================================================*/
#endif

#include"common.h"
bit isnewdata;
int kk;
long realvol; //真实测量电压值
float temp;
/*===============================================================*/
/*函数说明:定时器2初始化 */
/*===============================================================*/
void t2_ini()
{
CKCON= 0x20; // T2时钟为系统时钟
T2CON= 0x04; // T2为16bit定时器模式,并启动定时器运行
}
/*===============================================================*/
/*函数说明:因为是用定时器2益处,中断来启动adc转换 */
/*入口参数:
t2reload---------------------------------定时脉冲数目*/
/*===============================================================*/
void t2_baud(uint t2reload)
{ //每隔t2reload个T2时钟,产生一次定时溢出
RCAP2H=(~t2reload+1)/256;//相当于65536-t2reload
RCAP2L=(~t2reload+1)%256;
TH2=RCAP2H;
TH2=RCAP2L;
}
/*===============================================

================*/
/*函数说明:选择ADC输入的模拟通道 */
/*入口参数:
source----------------------为ADC0通道选择(共有9个通道)
type-------------------配置测量方式为差动还是单端输入*/
/*===============================================================*/
void adc0_mux(uchar type,uchar source){
AMX0CF=type; //AIN67IC,AIN45IC,AIN23IC,AIN01IC,0为单端输入。
AMX0SL=source; //选择AD输入通道的,有9个,其中第9通道是内部温度输入
}
void adc0_ini(){
ADC0CF=0x0f; //ADC0时钟为系统时钟2分频,PGA增益为0.5
ADC0CN=0x8c; //AD0TM=0,ADC0为连续跟踪模式,由T2溢出率启动ADC0
//AD0LJST=0,数据存储格式右对齐,即ADC0H存放12bit高四位
REF0CN&=0x0f; //AD0VRS=0,ADC0参考电压为VREFA
REF0CN|=0x07; //TEMPE=1,内部温度传感器工作
/*REFBE=1,内部参考电平工作,电路部分须将VREF参考输出(C8051F40的第12管脚)与 VREF0(C8051F040的16管脚相连,
并最好并联一个4.7uF和0.1uF的旁路电容以电平滤波*/

adc0_mux(0x08,3);//PORT3IC=1,ADC0 6、7通道为差动模式
//AIN0.0-AIN0.3均为单端模式
//选择AIN0.3为ADC0转化通道
EIE2 |= 0x02; //开ADC0中断
t2_ini();
t2_baud(2000); //每隔2000个T2时钟产生一次ADC0采样
TR2=1;
}
/*===============================================================*/
/*函数说明:各端口初始化 */
/*===============================================================*/
void config (void)
{ //看门狗禁止
WDTCN = 0xDE;
WDTCN = 0xAD;
XBR0 = 0x00;
XBR1 = 0x00;
XBR2 = 0x40; //交叉开关使能,使得P0-P3口能输出
P0MDOUT = 0x00; //端口配置,P0-P3,P6-P7口为开漏输出
P1MDOUT = 0x00;
P2MDOUT = 0x00;
P3MDOUT = 0x00;
P74OUT = 0x00;
P1MDIN = 0x00; //P1口配置为模拟输入,数字输入电路和弱拉电路被禁止
OSCXCN = 0x00;
OSCICN = 0x84;
//采用内部晶振,为24.5MHZ8分频
}
void main(){
uchar i;
config();
adc0_ini();//ADC0初始化
EA=1;
i=0;
realvol=0;
while(1){
if(isnewdata){
i++;
if(i>40){//每采样40次,显示刷新一次
i=0; //则可在此设断点查看realvol
// showf(realvol,5,0); //第一行显示真实电压值
// showf(target_val,6,1); //第二行显示物理量值
}
isnewdata=0;
}
}
}
void ADC0_ISR() interrupt 15{
AD0INT=0;
kk=ADC0VAL;
realvol=(long)kk*ADJRATESE;
/*
ADC0转化值乘以单端电平系数,其结果为电平真实值乘以100000
例如ADC0VAL=1024时,realvol=1024*118=120832,即表示真实电压为1.20832v
*/
isnewdata=1;
}

相关主题
相关文档
最新文档