[DemoCode下载] N76E616的ADC操作

[复制链接]
1190|6
 楼主| mintspring 发表于 2019-1-20 22:42 | 显示全部楼层 |阅读模式
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2015 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

  6. //***********************************************************************************************************
  7. //  Nuvoton Technoledge Corp.
  8. //  Website: http://www.nuvoton.com
  9. //  E-Mail : MicroC-8bit@nuvoton.com
  10. //  Date   : Sep/1/2015
  11. //***********************************************************************************************************

  12. //***********************************************************************************************************
  13. //  File Function: N76E616 ADC demo code
  14. //***********************************************************************************************************

  15. #include <stdio.h>
  16. #include "N76E616.h"
  17. #include "Version.h"
  18. #include "Typedef.h"
  19. #include "Define.h"
  20. #include "SFR_Macro.h"
  21. #include "Common.h"
  22. #include "Delay.h"

  23. /*
  24. //-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
  25. //
  26. //<e0> System Clock Source Configuration
  27. // <o1> System Clock Source Selection
  28. //      <0=> 2~16MHz    XTAL
  29. //      <1=> 32.768KHz  XTAL
  30. //      <2=> 11.0592MHz Internal
  31. //      <3=> 10KHz      Internal
  32. //      <4=> OSC-In     External
  33. //</e>
  34. //
  35. //<e2> Clock Divider Configuration
  36. //     <o3.0..7>  System Clock Source Devider <1-255:1>
  37. //                     <i> Fsys = (System Clock Source) / (2 * Devider)
  38. //</e>
  39. //
  40. //<h> ADC Option
  41. // <o4.0..3> ADC Pin Selection
  42. //      <0=> AIN0 (P00) <1=> AIN1 (P01) <2=> AIN2 (P02) <3=> AIN3 (P03)
  43. //      <4=> AIN4 (P04) <5=> AIN5 (P05) <6=> AIN6 (P06) <7=> AIN7 (P07)
  44. //      <8=> AIN8 (P26) <9=> AIN9 (P20) <10=> Band-Gap
  45. //
  46. // <o5.0..2> ADC Divider Selection
  47. //      <0=> Fsys/1  <1=> Fsys/2   <2=> Fsys/4   <3=> Fsys/8
  48. //      <4=> Fsys/16 <5=> Fsys/32  <6=> Fsys/64  <7=> Fsys/128
  49. //
  50. //</h>
  51. //
  52. //-------- <<< end of configuration section >>> ------------------------------
  53. */

  54. #define SYS_CLK_EN      0
  55. #define SYS_SEL         2
  56. #define SYS_DIV_EN      0                   //0: Fsys=Fosc, 1: Fsys = Fosc/(2*CKDIV)
  57. #define SYS_DIV         1

  58. #define ADC_PIN         0
  59. #define ADC_DIV         2

  60. bit BIT_TMP;
  61. /******************************************************************************
  62. * FUNCTION_PURPOSE: ADC interrupt Service Routine
  63. ******************************************************************************/
  64. void ADC_ISR (void) interrupt 11
  65. {
  66.     clr_ADCF;                               //clear ADC interrupt flag
  67. }
  68. /******************************************************************************
  69. * FUNCTION_PURPOSE: ADC Pin Select
  70. ******************************************************************************/
  71. void ADC_Pin_Select (void)
  72. {
  73.     #if   ADC_PIN == 0                      //P0.0
  74.           ADCCON0 = 0x00;                   //select ADC pin
  75.           set_P0M1_0;                       //set ADC pin is input only mode
  76.           clr_P0M2_0;
  77.           set_P00DIDS;                      //disable digital connection
  78.     #elif ADC_PIN == 1                      //P0.1
  79.           ADCCON0 = 0x01;                   //select ADC pin
  80.           set_P0M1_1;                       //set ADC pin is input only mode
  81.           clr_P0M2_1;
  82.           set_P01DIDS;                      //disable digital connection
  83.     #elif ADC_PIN == 2                      //P0.2
  84.           ADCCON0 = 0x02;                   //select ADC pin
  85.           set_P0M1_2;                       //set ADC pin is input only mode
  86.           clr_P0M2_2;
  87.           set_P02DIDS;                      //disable digital connection
  88.     #elif ADC_PIN == 3                      //P0.3
  89.           ADCCON0 = 0x03;                   //select ADC pin
  90.           set_P0M1_3;                       //set ADC pin is input only mode
  91.           clr_P0M2_3;
  92.           set_P03DIDS;                      //disable digital connection
  93.     #elif ADC_PIN == 4                      //P0.4
  94.           ADCCON0 = 0x04;                   //select ADC pin
  95.           set_P0M1_4;                       //set ADC pin is input only mode
  96.           clr_P0M2_4;
  97.           set_P04DIDS;                      //disable digital connection
  98.     #elif ADC_PIN == 5                      //P0.5
  99.           ADCCON0 = 0x05;                   //select ADC pin
  100.           set_P0M1_5;                       //set ADC pin is input only mode
  101.           clr_P0M2_5;
  102.           set_P05DIDS;                      //disable digital connection
  103.     #elif ADC_PIN == 6                      //P0.6
  104.           ADCCON0 = 0x06;                   //select ADC pin
  105.           set_P0M1_6;                       //set ADC pin is input only mode
  106.           clr_P0M2_6;
  107.           set_P06DIDS;                      //disable digital connection
  108.     #elif ADC_PIN == 7                      //P0.7
  109.           ADCCON0 = 0x07;                   //select ADC pin
  110.           set_P0M1_7;                       //set ADC pin is input only mode
  111.           clr_P0M2_7;
  112.           set_P07DIDS;                      //disable digital connection
  113.     #elif ADC_PIN == 8                      //P2.6
  114.           ADCCON0 = 0x08;                   //select ADC pin
  115.           set_P2M1_6;                       //set ADC pin is input only mode
  116.           clr_P2M2_6;
  117.           set_P26DIDS;                      //disable digital connection
  118.     #elif ADC_PIN == 9                      //P2.0
  119.           ADCCON0 = 0x09;                   //select ADC pin
  120.           set_P2M1_0;                       //set ADC pin is input only mode
  121.           clr_P2M2_0;
  122.           set_P20DIDS;                      //disable digital connection
  123.     #else
  124.           ADCCON0 |= 0x0F;                  //band-gap 1.25V
  125.     #endif
  126. }
  127. /******************************************************************************
  128. * FUNCTION_PURPOSE: ADC Clock Divider Select
  129. ******************************************************************************/
  130. void ADC_DIV_Select (void)
  131. {
  132.     #if   ADC_DIV == 0
  133.           clr_ADCDIV2;
  134.           clr_ADCDIV1;
  135.           clr_ADCDIV0;
  136.     #elif ADC_DIV == 1
  137.           clr_ADCDIV2;
  138.           clr_ADCDIV1;
  139.           set_ADCDIV0;
  140.     #elif ADC_DIV == 2      //Default
  141.           clr_ADCDIV2;
  142.           set_ADCDIV1;
  143.           clr_ADCDIV0;
  144.     #elif ADC_DIV == 3
  145.           clr_ADCDIV2;
  146.           set_ADCDIV1;
  147.           set_ADCDIV0;
  148.     #elif ADC_DIV == 4
  149.           clr_ADCDIV2;
  150.           clr_ADCDIV1;
  151.           set_ADCDIV0;
  152.     #elif ADC_DIV == 5
  153.           set_ADCDIV2;
  154.           clr_ADCDIV1;
  155.           clr_ADCDIV0;
  156.     #elif ADC_DIV == 6
  157.           set_ADCDIV2;
  158.           clr_ADCDIV1;
  159.           set_ADCDIV0;
  160.     #elif ADC_DIV == 7
  161.           set_ADCDIV2;
  162.           set_ADCDIV1;
  163.           clr_ADCDIV0;
  164.     #elif ADC_DIV == 8
  165.           set_ADCDIV2;
  166.           set_ADCDIV1;
  167.           set_ADCDIV0;
  168.     #endif
  169. }
  170. /******************************************************************************
  171. * FUNCTION_PURPOSE: ADC Initial
  172. ******************************************************************************/
  173. void ADC_Initial (void)
  174. {
  175.     set_ADCEN;
  176.     ADC_Pin_Select();                           //Select ADC Pin
  177.     ADC_DIV_Select();                           //Set ADC Clock Divider
  178. }

  179. /******************************************************************************
  180. The main C function.  Program execution starts
  181. here after stack initialization.
  182. ******************************************************************************/
  183. void main (void)
  184. {
  185.     UINT8 i;
  186.    
  187.     /* Note
  188.        MCU power on system clock is HIRC (11.0592MHz), so Fsys = 11.0592MHz
  189.     */
  190.    
  191.     Set_All_GPIO_Quasi_Mode();

  192.     #if DEBUG_PORT == 0
  193.         InitialUART0_Timer1_Type1(9600);            /* 9600 Baud Rate*/
  194.     #elif DEBUG_PORT == 1
  195.         InitialUART1_Timer3(9600);                  /* 9600 Baud Rate*/
  196.     #endif

  197.     Show_FW_Version_Number_To_PC();

  198.     printf ("\n*===================================================================");
  199.     printf ("\n*  Name: N76E616 ADC Demo Code.");
  200.     printf ("\n*===================================================================\n");
  201.    
  202.     /* Change system closk source */
  203.     #if SYS_CLK_EN == 1
  204.         #if   SYS_SEL == 0
  205.             System_Clock_Select(E_HXTEN);   //Fosc = 2~16MHz XTAL
  206.         #elif SYS_SEL == 1
  207.             System_Clock_Select(E_LXTEN);   //Fosc = 32.768KHz XTAL
  208.         #elif SYS_SEL == 2
  209.             System_Clock_Select(E_HIRCEN);  //Fosc = 11.0592MHz Internal RC
  210.         #elif SYS_SEL == 3
  211.             System_Clock_Select(E_LIRCEN);  //Fosc = 10KHz Internal RC
  212.         #elif SYS_SEL == 4
  213.             System_Clock_Select(E_OSCEN);   //Fosc = OSC-In External OSC
  214.         #endif
  215.     #endif
  216.    
  217.     #if SYS_DIV_EN == 1
  218.         CKDIV = SYS_DIV;                        //Fsys = Fosc / (2* CLKDIV) = Fcpu
  219.     #endif
  220.    
  221.     for(i=0;i<3;i++)
  222.     {
  223.         P02 = 0;
  224.         Timer0_Delay1ms(200);
  225.         P02 = 1;
  226.         Timer0_Delay1ms(200);
  227.     }

  228.     ADC_Initial();
  229.    
  230.     while(1)
  231.     {
  232.         clr_ADCF;
  233.         set_ADCS;                               //Trigger ADC start conversion
  234.         #if 0                                   //Polling
  235.             while(ADCF == 0);
  236.             ADCF = 0;
  237.         #else                                   //Interrupt
  238.             EADC = 1;
  239.             EA = 1;
  240.             set_IDLE;                           //Enter idle mode
  241.         #endif
  242.         printf ("\n*  ADC conver value = %d",(UINT16)ADCRH);
  243.         Timer0_Delay1ms(100);
  244.     }
  245. }




 楼主| mintspring 发表于 2019-1-20 22:43 | 显示全部楼层
内置的ADC模块非常容易使用
 楼主| mintspring 发表于 2019-1-20 22:43 | 显示全部楼层
而且是51内核,基本上会C就能搞。
zhuotuzi 发表于 2019-1-20 23:14 | 显示全部楼层
类似003的操作。
wanduzi 发表于 2019-1-20 23:15 | 显示全部楼层
宏操作。
antusheng 发表于 2019-1-20 23:16 | 显示全部楼层
多个管脚都可以使用
huangcunxiake 发表于 2019-1-21 14:27 | 显示全部楼层
比较容易上手的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

303

主题

4972

帖子

24

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