⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 基于c8051f020的adc采样程序.txt

📁 基于c8051f020的ADC采样程序,完全运行成功
💻 TXT
字号:
/*===============================================================*/
/*函数名称: main.c                                              */
/*函数功能: 主函数,调用各模块                                   */
/*基本思想:  单端输入,定时启动,由T2定时,选择AIN0.3为ADC0转化通道                                          */
/*修改记录: 无修改记录                                          */
/*编写日期: 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<c8051f020.h>
#include<intrins.h>
/*==============================================================*/
/*函数声明                         */
/*==============================================================*/  
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; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -