[DemoCode下载] M051 ADC模数转换程序

[复制链接]
1477|5
 楼主| Thethree 发表于 2016-2-14 09:56 | 显示全部楼层 |阅读模式
  1. /******************************************************************
  2. *注   意:硬件上的AVDD一定要接上基准电压
  3. ******************************************************************/
  4. #include "SmartM_M0.h"
  5. #define DEBUGMSG              printf
  6. #define ADC_CLOCK_DIVIDER     0x00040000
  7. #define ADC_CLK_Source        0x00000000
  8. #define AREF_VOLTAGE          4480
  9.      
  10. STATIC VOID AdcInit(VOID)
  11. {
  12. if(ADC_CLK_Source==0x00000004)
  13.     {
  14.         PLLCON |= PLL_SEL;
  15.         PLL_Enable();
  16.         /* 等待PLL稳定 */
  17.   while((CLKSTATUS & PLL_STB) == 0);
  18. }
  19.     /* 复位ADC */   
  20.     set_ADC_RST;
  21.     clr_ADC_RST;
  22. /* ADC时钟使能 */      
  23.     set_ADEN_CLK;
  24.     if (ADC_CLK_Source==0x00000000 )
  25.     {
  26.         ADCClkSource_ex12MHZ;
  27.     }
  28.     else if(ADC_CLK_Source==0x00000004 )
  29.     {
  30.         ADCClkSource_PLL;
  31.     }
  32.     else if(ADC_CLK_Source==0x00000008 )
  33.     {
  34.         ADCClkSource_int22MHZ;
  35.     }
  36.     /* 设置ADC分频器 */
  37.     CLKDIV=ADC_CLOCK_DIVIDER;

  38.     /* ADC使能 */
  39.     set_ADEN;
  40.     set_CALEN;   
  41. while(!(ADCALR&CALDONE));
  42.     /* 单次转换模式 */
  43.     setAD_SIG;            
  44.     clr_DIFFEN;
  45. /* 设置ADC通道 */
  46.     set_CHEN0;
  47.     /* 使能P1.0为模拟输入引脚 */
  48.     set_ADC0_channel;
  49. /* 禁止P1.0数字输入通道 */
  50. P1_OFFD |= OFFD0;
  51.     /* 设置P1.0引脚为输入模式Configure P1.0 as input mode */
  52.     P10_InputOnly;
  53.     /* 清除ADC中断标志位 */
  54.     set_ADF;      
  55. }
  56. /****************************************
  57. *函数名称:main
  58. *输    入:无
  59. *输    出:无
  60. *功    能:函数主体
  61. ******************************************/
  62. INT32 main(VOID)
  63. {
  64.      UINT32 unVoltageValue;
  65.                            
  66.   PROTECT_REG          //ISP下载时保护FLASH存储器
  67.   (
  68.    PWRCON |= XTL12M_EN;       //默认时钟源为外部晶振
  69.    while((CLKSTATUS & XTL12M_STB) == 0);    //等待12MHz时钟稳定
  70.   
  71.    CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;//设置外部晶振为系统时钟
  72.   )
  73.   UartInit(12000000,9600);       //波特率设置为9600bps
  74.   AdcInit();
  75.   while(1)
  76.   {
  77.      set_ADST;            //启动ADC
  78.   while(ADSR&ADF==0);        //等待ADC结束
  79.   set_ADF;          //清空ADC结束标志位
  80.   unVoltageValue = AREF_VOLTAGE*(ADDR0&0xFFF)/4096;//将ADC值转换为电压值
  81.   DEBUGMSG("Voltage %d mv \r\n",unVoltageValue);
  82.   Delayms(500);
  83.   }
  84. }


dentsgot 发表于 2016-2-14 17:52 | 显示全部楼层
M051有几个adc通道啊?
ccw1986 发表于 2016-2-16 20:59 | 显示全部楼层
M051的adc也是12位的,很不错
huangcunxiake 发表于 2016-2-17 08:37 | 显示全部楼层
TI MPS430的部分还是10位呢,12位够用了。当年学习51的时候还要买外置的8位的ADC就觉得可以了
secretuniverse 发表于 2016-2-27 20:57 | 显示全部楼层
做一般的数据采集有12位就足够了
Tennasi 发表于 2016-2-28 22:44 | 显示全部楼层
新唐的adc是12位的,非常方便,能够用于一般的工业控制了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

236

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部