微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 简单的C8051单片机AD转换程序?

简单的C8051单片机AD转换程序?

时间:10-02 整理:3721RD 点击:
程序代码对内部的温度传感器进行采样转换,不知道程序逻辑上哪里出错了?为什么在中断里isnewdata的值不会发生变化?求助!

  1. //-----------------------------------------------------------------------------
  2. // Includes
  3. //-----------------------------------------------------------------------------

  4. #include <C8051F020.h>                 // SFR declarations
  5. #include <stdio.h>                     

  6. //-----------------------------------------------------------------------------
  7. // 16-bit SFR Definitions for 'F02x
  8. //-----------------------------------------------------------------------------

  9. sfr16 ADC0     = 0xbe;                 // ADC0 data

  10. //-----------------------------------------------------------------------------
  11. // Global Constants
  12. //-----------------------------------------------------------------------------

  13. #define SYSCLK       22118400          // External crystal oscillator frequency
  14. #define SAR_CLK      2500000           // Desired SAR clock speed

  15. //-----------------------------------------------------------------------------
  16. // Global Variables
  17. //-----------------------------------------------------------------------------
  18. bit isnewdata;
  19. xdata float t[20];//存放温度检测数据,为20个数据
  20. //-----------------------------------------------------------------------------
  21. // Function Prototypes
  22. //-----------------------------------------------------------------------------

  23. void OSCILLATOR_Init (void);           
  24. void PORT_Init (void);
  25. void ADC0_Init (void);
  26. void TIMER3_Init (int counts);
  27. void ADC0_ISR (void);
  28. void delay1ms (unsigned int time);



  29. //-----------------------------------------------------------------------------
  30. // main() Routine
  31. //-----------------------------------------------------------------------------

  32. void main (void)
  33. {
  34.    unsigned int i,kk;
  35.    float temp;
  36.   
  37.    WDTCN = 0xde;                       // Disable watchdog timer
  38.    WDTCN = 0xad;


  39.    OSCILLATOR_Init ();                 // Initialize oscillator
  40.    PORT_Init ();                       // Initialize crossbar and GPIO
  41.    ADC0_Init ();                       // Init ADC

  42.    AD0EN = 1;                          // Enable ADC   (ADC0CN.7)
  43.    AD0BUSY = 1;
  44.    EA = 1;                             // Enable global interrupts

  45.    while (1)
  46.    {
  47.       if(isnewdata)
  48.           {         
  49.                 kk=ADC0;
  50.                         temp=(float)kk/4096.0;
  51.                     temp*=2.43;
  52.                         temp-=0.776;
  53.                         temp/=0.00286;//将测量值转化成真实温度值
  54.                         isnewdata=0;
  55.                         t[i]=temp;//将温度检测值存入长度为20的数组中
  56.                         i++;
  57.                         if(i>19)
  58.                                 i=0;//在此设断点,观察程序运行结果
  59.                         delay1ms(100);
  60.                         AD0BUSY = 1;
  61.                 }

  62.    }
  63. }

  64. //-----------------------------------------------------------------------------
  65. // Initialization Subroutines
  66. //-----------------------------------------------------------------------------

  67. //-----------------------------------------------------------------------------
  68. // OSCILLATOR_Init

  69. //-----------------------------------------------------------------------------
  70. void OSCILLATOR_Init (void)
  71. {
  72.    int i;                              

  73.    OSCXCN = 0x67;                    

  74.    for (i=0; i < 256; i++) ;           

  75.    while (!(OSCXCN & 0x80)) ;         

  76.    OSCICN = 0x88;           
  77. }

  78. //-----------------------------------------------------------------------------
  79. // PORT_Init
  80. //-----------------------------------------------------------------------------
  81. //-----------------------------------------------------------------------------
  82. void PORT_Init (void)
  83. {
  84.    XBR2    |= 0x40;                    // Enable crossbar,  weak pull-ups
  85. }

  86. void delay1ms(unsigned int time)
  87. {                                     //延迟1ms
  88.         unsigned int i;
  89.         unsigned int j;
  90.         for (i=0;i<time;i++){
  91.                 for(j=0;j<300;j++);
  92.         }
  93. }       
  94. //-----------------------------------------------------------------------------
  95. // ADC0_Init
  96. //-----------------------------------------------------------------------------
  97. //-----------------------------------------------------------------------------
  98. void ADC0_Init (void)
  99. {

  100.    ADC0CN = 0x00;                     
  101.    AMX0SL = 0x0F;                  
  102.    ADC0CF = (SYSCLK/SAR_CLK) << 3;     
  103.    ADC0CF &= 0xF8;                                     
  104.    EIE2 |= 0x02;                  

  105. }

  106. //-----------------------------------------------------------------------------
  107. // Interrupt Service Routines
  108. //-----------------------------------------------------------------------------

  109. //-----------------------------------------------------------------------------
  110. // ADC0_ISR
  111. //-----------------------------------------------------------------------------
  112. //-----------------------------------------------------------------------------
  113. void ADC0_ISR (void) interrupt 15
  114. {

  115.    AD0INT = 0;
  116.    isnewdata = 1;


  117. }

  118. //-----------------------------------------------------------------------------
  119. // End Of File
  120. //-----------------------------------------------------------------------------

复制代码

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

网站地图

Top