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

📄 adc.c

📁 以c8051f120为主控芯片,AD0采集的8路模拟信号经过简单计算处理通过Uart0发送到计算机。可以通过串口助手观察结果。通道0和1以及片上温度传感器采集的数据经过简单计算处理在Lcd上显示。
💻 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 + -