📄 adc.c
字号:
/************************************************************************************
* Copyright (c) 2004,西安铭朗电子科技有限责任公司
* All rights reserved.
*
* 文件名称: Adc0.C
* 文件标识: none
* 适用器件: C8051F120
*
* 摘 要: 本文件是AD子程序;使用外部22.1184MHz晶振
*
* 当前版本:1.1
* 作 者:刘大伟
* 完成日期:2007年2月9日
*
* 历史版本:1.0
* 作 者:卢 阳
* 完成日期:2004年11月14日
*
* 历史版本:0.9
* 原作者 : 李林利
* 完成日期:2004年1月1日
*************************************************************************************/
/************************************************************************************/
// 引用外部头文件
#include "c8051f120.h"
#include "ADC.h"
#include <stdio.h>
/************************************************************************************/
/***********************************************************************************
* 函数名称:ADC0_Init;
*
* 函数功能描述:设置ADC0使用定时器Timer3溢出作为转换源,转换完成后产生中断,使用左对齐输出模式
*
* 输入参数:unsigned int类型指针,是ADC0使用时存放返回数据数组的指针;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void ADC0_Init (void)
{
char data SFRPAGE_SAVE = SFRPAGE;// Save Current SFR page
SFRPAGE = ADC0_PAGE; // set SFR page 0
ADC0CN = 0x44; // 定时器3溢出启动AD转换,数据右对齐
REF0CN = 0x07; // 打开温度传感器, on-chip VREF
AMX0SL=0x00; // ADC0使用"0"通道
AMX0CF=0x00; // ADC0全部为单端输入
ADC0CF=(SYSCLK/SAR0_Clk)<<3; // ADC转换时钟= 2.5MHz
ADC0CF&=0xf8; // PGA gain = 1
EIE2|=0x02; // 打开ADC0中断
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函数名称:Timer3_Init;
*
* 函数功能描述:lcd_init;
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Timer3_Init (unsigned int counts)
{
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = TMR3_PAGE; // set SFR page 1
EIE2 &= ~0x01; // 禁止定时器Timer3中断
TMR3CN &= ~0x04; // 停止Timer3; 清除TF3;
TMR3CF = 0x08;
RCAP3H = (65536-counts)/256;
RCAP3L = (65536-counts)%256;
TMR3CN |= 0x04; // 开启Timer3
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函数名称:ADC0_enable
*
* 函数功能描述:ADC0开关,1:打开;0:关闭
*
* 输入参数:1:打开;0:关闭
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void ADC0_enable(unsigned char flag)
{
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = ADC0_PAGE; // set SFR page 0
if(flag)
{
AD0EN=1; // 打开ADC
ENABLE_INTERRUPTS; // 开启全局中断
}
else
AD0EN=0; // 关闭ADC
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函数名称:ADC0_ISR;
*
* 函数功能描述:中断服务响应;ADC0 采样,存储在主程序定义的全局数组中,选择下个通道转换
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void ADC0_ISR (void) interrupt 15
{
static unsigned char channel = 8; // ADC mux 通道 (0-8)
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = ADC0_PAGE; // set SFR page 0
AD0INT=0; // 清除ADC转换完成标志
ADC0_result[channel]=ADC_Value(0); // 读ADC值
channel++; // 改变通道
if (channel == 9)
channel = 0;
AMX0SL = channel; // 设置mux到下个通道
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函数名称:ADC_Value;
*
* 函数功能描述:ADC0,ADC1转换完成后数据寄存器数据转换成unsigned int型
*
* 输入参数:unsigned char类型,"0"为选择转换ADC0数据格式,非"0"为选择转换ADC1数据格式;
*
* 返回数据:unsigned int类型,当前AD转换完成后的unsigned int类型数据量;
*
* 注意: none;
************************************************************************************/
unsigned int ADC_Value (unsigned char Flag)
{
unsigned int data temp,temp0,temp1;
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
if(Flag) // ADC1
{
SFRPAGE = ADC2_PAGE; // set SFR page 2
temp0 = ADC2;
}
else // ADC0
{
SFRPAGE = ADC0_PAGE; // set SFR page 0
temp0 = ADC0L;
temp1 = ADC0H;
}
temp=temp1*256+temp0;
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
return temp; // 取回ADC转换数据
}
/***********************************************************************************
* 函数名称:ADC_Value_Return;
*
* 函数功能描述:主程序通过此函数取得ADC0目标通道数据
*
* 输入参数:unsigned char类型,ADC0通道号;
*
* 返回数据:unsigned int类型,ADC0通道对应的数据;
*
* 注意: ADC0共有9个通道(包括温度通道),注意范围,超出范围返回0XFFFF;
************************************************************************************/
unsigned int ADC_Valud_Return (unsigned char channel)
{
if (channel<9) //通道范围有效
return ADC0_result[channel]; //取回通道对应数据
else //通道范围出错
return 0xffff; //返回错误信息
}
/***********************************************************************************/
// 文件结束
/***********************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -