微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于C8051F340中ADC的使用问题

关于C8051F340中ADC的使用问题

时间:10-02 整理:3721RD 点击:
    在下最近刚学习C8051F340单片机,对其中的ADC使用有点小疑问,望好心人指点迷津。
    在下想问,C8051340中的ADC在启动之后即开始AD转换,但每次转换可有触发方式?例如有些单片机是可以靠定时器的每溢出一次就触发转换一次的,C8051F可以么?还是配置转换速率后,启动ADC之后就自己不停的转换了呢?
    不知本人描述的是否清晰,若有觉得本人描述不清楚的,可留言,本人改正。多谢!~

这个完全可以人为控制。如:AD0EN = 1;意思是ADC开始工作,同理AD0EN = 0;就是停止了。
当然这里还需要注意一下这些标志位,原理与中断等是类似的。

  1. AD0BUSY = 1;                         // 开始转换
  2. while(!AD0INT);                // 等待转换完成
  3. AD0INT = 0;                     // 清除中断标志


  4. /************************************************************************************/
  5. // 引用外部头文件
  6. /************************************************************************************/
  7. #include "ADC.h"

  8. /************************************************************************************/
  9. // 常量及全局变量定义
  10. /************************************************************************************/
  11. #define AIN1 0x04
  12. #define AIN2 0x05
  13. #define GND         0x1f
  14. #define TEMP 0x1E
  15. #define ADC_CLK 1600000
  16. #define T_US 20

  17. #define sysclk 48000000

  18. /*************************************************************************************/
  19. //
  20. //                                                 ADC硬件驱动程序函数定义
  21. //
  22. /*************************************************************************************/
  23. /***********************************************************************************
  24. * Function: ADC_Init;
  25. *
  26. * Description: ADC初始化函数;
  27. *              
  28. * Input:  none;
  29. *
  30. * Output: none;
  31. *
  32. * Return: none;
  33. *
  34. * Note:   none;
  35. ************************************************************************************/
  36. void ADC_Init (void)
  37. {
  38.         //REF0CN = 0x07;//使用ref电压基准
  39.         AMX0P = TEMP;//选择TempSensor
  40.         AMX0N = GND;//选择GND
  41.         ADC0CF=(sysclk/ADC_CLK)<<3;//ADC转换时钟
  42.         ADC0CN = 0x00;
  43. }

  44. /***********************************************************************************
  45. * Function: ADC_Enable;
  46. *
  47. * Description: ADC使能函数, ADC开始工作;
  48. *              
  49. * Input:  none;
  50. *
  51. * Output: none;
  52. *
  53. * Return: none;
  54. *
  55. * Note:   none;
  56. ************************************************************************************/
  57. void ADC_Enable(void)
  58. {
  59.         AD0EN = 1;
  60. }

  61. /***********************************************************************************
  62. * Function: ADC_Disable;
  63. *
  64. * Description: ADC关闭函数, ADC停止工作;
  65. *              
  66. * Input:  none;
  67. *
  68. * Output: none;
  69. *
  70. * Return: none;
  71. *
  72. * Note:   none;
  73. ************************************************************************************/
  74. void ADC_Disable(void)
  75. {
  76.         AD0EN = 0;
  77. }

  78. /***********************************************************************************
  79. * Function: ADC_Read;
  80. *
  81. * Description: 读取ADC转换数据函数;
  82. *              
  83. * Input:  none;
  84. *
  85. * Output: *p, 通道1采样值; *(p+1),通道1采样值; *(p+2),温度通道采样值;
  86. *
  87. * Return: none;
  88. *
  89. * Note:   none;
  90. ************************************************************************************/
  91. void ADC_Read(int *p)
  92. {
  93.         AD0INT = 0;     // 清除中断标志
  94.                
  95.                 AMX0P = AIN1;        //改变AD通道
  96.                 Delay_us(T_US);
  97.                 AD0BUSY = 1;        //开始转换
  98.             while(!AD0INT); // 等待转换完成
  99.                 AD0INT = 0;     // 清除中断标志
  100.                 *p++ = (unsigned int)ADC0H*256 + ADC0L; // 读取并计算AD值
  101.                                  
  102.                 AMX0P = AIN2;        //改变AD通道
  103.                 Delay_us(T_US);
  104.                 AD0BUSY = 1;        //开始转换
  105.             while(!AD0INT); // 等待转换完成
  106.                 AD0INT = 0;     // 清除中断标志
  107.                 *p++ = (unsigned int)ADC0H*256 + ADC0L; // 读取并计算AD值
  108.                
  109.                 AMX0P = TEMP;        //改变AD通道
  110.                 Delay_us(T_US);
  111.                 AD0BUSY = 1;        //开始转换
  112.             while(!AD0INT); // 等待转换完成
  113.                 AD0INT = 0;     // 清除中断标志
  114.                 *p = (unsigned int)ADC0H*256 + ADC0L; // 读取并计算AD值
  115. }

  116. /***********************************************************************************
  117. * Function: ADC_ISR;
  118. *
  119. * Description: 中断服务响应,完成ADC采样数据存储及通道切换;
  120. *              
  121. * Input:  none;
  122. *
  123. * Output: none;
  124. *
  125. * Return: none;
  126. *
  127. * Note:   none;
  128. ************************************************************************************/
  129. void ADC_ISR (void) interrupt 10 using 3 //执行时间: 8uS
  130. {



  131. }

  132. /***********************************************************************************/
  133. // 文件结束
  134. /***********************************************************************************/

复制代码

真的很抱歉,最近一直忙弄其他事情了,没有及时看到您的回复。
我想请问一下,您粘贴的这段代码是自己写的吗?因为我在学习C8051F系列单片机时很想找到一份程序库,我看到您的程序中也有调用头文件的这个过程,想请问一下您用的头文件程序库可否分享一份,或是指点一下哪里可以找得到?我是初学者,自己写的程序会很不规范,很想借鉴一下。如有冒犯之处,敬请原谅。

真的很抱歉,最近一直忙弄其他事情了,没有及时看到您的回复。
我想请问一下,您粘贴的这段代码是自己写的吗?因为我在学习C8051F系列单片机时很想找到一份程序库,我看到您的程序中也有调用头文件的这个过程,想请问一下您用的头文件程序库可否分享一份,或是指点一下哪里可以找得到?我是初学者,自己写的程序会很不规范,很想借鉴一下。如有冒犯之处,敬请原谅。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top