关于C8051F340中ADC的使用问题
时间:10-02
整理:3721RD
点击:
在下最近刚学习C8051F340单片机,对其中的ADC使用有点小疑问,望好心人指点迷津。
在下想问,C8051340中的ADC在启动之后即开始AD转换,但每次转换可有触发方式?例如有些单片机是可以靠定时器的每溢出一次就触发转换一次的,C8051F可以么?还是配置转换速率后,启动ADC之后就自己不停的转换了呢?
不知本人描述的是否清晰,若有觉得本人描述不清楚的,可留言,本人改正。多谢!~
在下想问,C8051340中的ADC在启动之后即开始AD转换,但每次转换可有触发方式?例如有些单片机是可以靠定时器的每溢出一次就触发转换一次的,C8051F可以么?还是配置转换速率后,启动ADC之后就自己不停的转换了呢?
不知本人描述的是否清晰,若有觉得本人描述不清楚的,可留言,本人改正。多谢!~
这个完全可以人为控制。如:AD0EN = 1;意思是ADC开始工作,同理AD0EN = 0;就是停止了。
当然这里还需要注意一下这些标志位,原理与中断等是类似的。
- AD0BUSY = 1; // 开始转换
- while(!AD0INT); // 等待转换完成
- AD0INT = 0; // 清除中断标志
- /************************************************************************************/
- // 引用外部头文件
- /************************************************************************************/
- #include "ADC.h"
- /************************************************************************************/
- // 常量及全局变量定义
- /************************************************************************************/
- #define AIN1 0x04
- #define AIN2 0x05
- #define GND 0x1f
- #define TEMP 0x1E
- #define ADC_CLK 1600000
- #define T_US 20
- #define sysclk 48000000
- /*************************************************************************************/
- //
- // ADC硬件驱动程序函数定义
- //
- /*************************************************************************************/
- /***********************************************************************************
- * Function: ADC_Init;
- *
- * Description: ADC初始化函数;
- *
- * Input: none;
- *
- * Output: none;
- *
- * Return: none;
- *
- * Note: none;
- ************************************************************************************/
- void ADC_Init (void)
- {
- //REF0CN = 0x07;//使用ref电压基准
- AMX0P = TEMP;//选择TempSensor
- AMX0N = GND;//选择GND
- ADC0CF=(sysclk/ADC_CLK)<<3;//ADC转换时钟
- ADC0CN = 0x00;
- }
- /***********************************************************************************
- * Function: ADC_Enable;
- *
- * Description: ADC使能函数, ADC开始工作;
- *
- * Input: none;
- *
- * Output: none;
- *
- * Return: none;
- *
- * Note: none;
- ************************************************************************************/
- void ADC_Enable(void)
- {
- AD0EN = 1;
- }
- /***********************************************************************************
- * Function: ADC_Disable;
- *
- * Description: ADC关闭函数, ADC停止工作;
- *
- * Input: none;
- *
- * Output: none;
- *
- * Return: none;
- *
- * Note: none;
- ************************************************************************************/
- void ADC_Disable(void)
- {
- AD0EN = 0;
- }
- /***********************************************************************************
- * Function: ADC_Read;
- *
- * Description: 读取ADC转换数据函数;
- *
- * Input: none;
- *
- * Output: *p, 通道1采样值; *(p+1),通道1采样值; *(p+2),温度通道采样值;
- *
- * Return: none;
- *
- * Note: none;
- ************************************************************************************/
- void ADC_Read(int *p)
- {
- AD0INT = 0; // 清除中断标志
-
- AMX0P = AIN1; //改变AD通道
- Delay_us(T_US);
- AD0BUSY = 1; //开始转换
- while(!AD0INT); // 等待转换完成
- AD0INT = 0; // 清除中断标志
- *p++ = (unsigned int)ADC0H*256 + ADC0L; // 读取并计算AD值
-
- AMX0P = AIN2; //改变AD通道
- Delay_us(T_US);
- AD0BUSY = 1; //开始转换
- while(!AD0INT); // 等待转换完成
- AD0INT = 0; // 清除中断标志
- *p++ = (unsigned int)ADC0H*256 + ADC0L; // 读取并计算AD值
-
- AMX0P = TEMP; //改变AD通道
- Delay_us(T_US);
- AD0BUSY = 1; //开始转换
- while(!AD0INT); // 等待转换完成
- AD0INT = 0; // 清除中断标志
- *p = (unsigned int)ADC0H*256 + ADC0L; // 读取并计算AD值
- }
- /***********************************************************************************
- * Function: ADC_ISR;
- *
- * Description: 中断服务响应,完成ADC采样数据存储及通道切换;
- *
- * Input: none;
- *
- * Output: none;
- *
- * Return: none;
- *
- * Note: none;
- ************************************************************************************/
- void ADC_ISR (void) interrupt 10 using 3 //执行时间: 8uS
- {
- }
- /***********************************************************************************/
- // 文件结束
- /***********************************************************************************/
真的很抱歉,最近一直忙弄其他事情了,没有及时看到您的回复。
我想请问一下,您粘贴的这段代码是自己写的吗?因为我在学习C8051F系列单片机时很想找到一份程序库,我看到您的程序中也有调用头文件的这个过程,想请问一下您用的头文件程序库可否分享一份,或是指点一下哪里可以找得到?我是初学者,自己写的程序会很不规范,很想借鉴一下。如有冒犯之处,敬请原谅。
真的很抱歉,最近一直忙弄其他事情了,没有及时看到您的回复。
我想请问一下,您粘贴的这段代码是自己写的吗?因为我在学习C8051F系列单片机时很想找到一份程序库,我看到您的程序中也有调用头文件的这个过程,想请问一下您用的头文件程序库可否分享一份,或是指点一下哪里可以找得到?我是初学者,自己写的程序会很不规范,很想借鉴一下。如有冒犯之处,敬请原谅。