#include "C8051F020.h"
#include <intrins.h>
#include "adc.h"
#define SYSCLK 24000000 //定义外部时钟为24M
#define VREF0 3.0 // 这里定义为3.11 是因为测试的时候发现当电压达到3.1V时,采集的值已经是4095
#define VREF1 3.0
//float code adva_table[12] = {0 ,0.3 ,0.6 ,0.9 ,1.2 ,1.5 ,1.8 ,2.1 ,2.4 ,2.7 ,3.0 ,3.3};
//float code adca_table[12] = {0.0,392.0,789.0,1186.0,1581.0,1975.0,2372.0,2765.0,3161.0,3551.0,3947.0,4095.0};
/**************************************************************************************************
** 函数名称:ADC0_Init
** 输入参数:void
** 函数输出:void
**
** 功能描述:ADC0初始化,ADC0的数据位数为12
***************************************************************************************************/
void ADC0_Init (void)
{
REF0CN = 0x07; //参考电压选择,ADC0 电压基准取自VREF0 引脚,ADC1 电压基准取自VREF1 引脚。
//内部温度传感器工作。内部电压基准提供从VREF 引脚输出,电压值为2.4V
ADC0CF = (SYSCLK/2500000) << 3; // ADC转换时钟= 2.5MHz
ADC0CF &= ~0x07; // PGA gain = 1。电压增益为1
ADC0CN = 0xc0; //使能ADC0
}
/**************************************************************************************************
** 函数名称:ADC1_Init
** 输入参数:void
** 函数返回值:无
**
** 功能描述:ADC1初始化,ADC1的数据位数为8位
***************************************************************************************************/
void ADC1_Init (void)
{
REF0CN = 0x07; //参考电压选择,ADC0 电压基准取自VREF0 引脚,ADC1 电压基准取自VREF1 引脚。
//内部温度传感器工作。内部电压基准提供从VREF 引脚输出,电压值为2.4V
ADC1CF = (SYSCLK/5000000) << 3; // ADC1转换时钟= 5MHz
ADC1CF |= 0x01; // PGA gain = 1。电压增益为1
ADC1CN = 0x80; //使能ADC1
}
/**************************************************************************************************
** 函数名称:ADC0_Convert
** 功能描述:ADC0转换,函数入口参数表示通道,返回值为0~4095.注意参考电压为3.3V
** 输入参数:ain0_i,表示通道数0---8
** 函数返回值:浮点型的电压值
** 功能说明:程序中对通道的电压值10次采集取平均值。
***************************************************************************************************/
float ADC0_Convert (unsigned char ain0_i)
{
float temp=0;
// float xdata adc0_buff[10];
// unsigned char i;
AMX0SL = ain0_i; // 设置mux到通道0~8,第9通道为内部温度传感器输入
// for(i=0;i<10;i++) //采集10次取平均值
// {
AD0INT = 0; // 清除ADC转换完成标志
AD0BUSY = 1; //启动ADC0
_nop_();
while (!AD0INT); //等待ADC0转换完成 ,这里也可以采用中断的方式读取
// adc0_buff[i] = ADC0H;
// adc0_buff[i] = adc0_buff[i]*256 + ADC0L; //读取ADC0的值
temp= ADC0H*256 + ADC0L;
// }
// for(i=0;i<10;i++) //取平均值
// {
// temp = temp+adc0_buff[i];
// }
// temp = temp/10;
temp = temp/4095.0*VREF0; //将电压数字量转换为实际电压值
return temp; // 返回ADC0的值,数据范围为:0~3.3V
}
/**************************************************************************************************
** 函数名称:ADC1_Convert
** 功能描述:ADC1转换,函数入口参数表示通道,返回值为0~255.注意参考电压为3.3V
** 输入参数:ADC1的通道号
** 返回值:通道号的电压值,浮点型数据。
**
***************************************************************************************************/
float ADC1_Convert (unsigned char ain1_i)
{
float temp=0;
// unsigned char xdata adc1_buff[10];
// unsigned char i;
P1MDIN = 0x00;//P1口设为模拟输入
ADC1CN &= 0xDF; //AD1INT清零
AMX1SL = ain1_i; // 设置mux到通道0~8,第9通道为内部温度传感器输入
//for(i=0;i<10;i++) //采集10次取平均值
//{
ADC1CN |= 0x10; //写AD1BUSY = 1,启动ADC1
_nop_();
while (!(ADC1CN&0x20)); //等待ADC1转换完成 ,这里也可以采用中断的方式读取
ADC1CN &= 0xDF; // AD1INT清零,清除ADC转换完成标志
//adc1_buff[i] = ADC1; //读取ADC1的值
temp = ADC1;
// }
/*for(i=0;i<10;i++) //取平均值
{
temp = temp+adc1_buff[i];
}
temp = temp/10;*/
temp = temp/255.0*VREF1; //将电压数字量转换为实际电压值
P1MDIN = 0xff;//P1口恢复为数字输入
return temp; // 返回ADC0的值,数据范围为:0~3.3V
}
ADC.rar_c8051f020 adc
版权申诉
135 浏览量
2022-09-20
20:47:36
上传
评论
收藏 1KB RAR 举报
JonSco
- 粉丝: 75
- 资源: 1万+
最新资源
- 本地镜像源配置脚本本地镜像源配置脚本
- 与spoon配套使用的jdk
- 基于单片机的便携式粮食水分测试仪的研究
- 测绘基坑支护工程变形监测报告1.pdf
- 基于PHP+swoole实现的微信机器人,依赖vbot和微信网页版的功能,帮助管理微信群/聊天/踢人等+源码+开发文档+运行教程
- com.xunmeng.pinduoduo_Release_cd290ca9_ARM64.apk
- 2788727d-25a0-41b2-b6b4-265d193edb95.doc
- 基于AVR单片机的伺服电机系统研究
- Lab-Electronic Craft Practicum-2-Simulation of a Single Tube Com
- 贪吃蛇基于TypeScript
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈