⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc.c

📁 TQ公司的STK16x开发系统的源码
💻 C
字号:
/* File: ADC.C */

/****************************************************************************
* 
* STK16X.ADC.MAIN
* ===============
*
* Main module for A/D converter demo.
* Converted value of ADC channel 0 is shown both on display and LED bar.
*
* TQ-Systems GmbH
* ----------------                                                         
* Customer: TQ-Components
* Project : STK16XSW
* Tools   : uVision 2.05
*
*
* Rev: Date:     Name:            Modification:
* ----+---------+----------------+------------------------------------------
* 100  22.01.01  A. Lichte        taken over from STK16X.506                
*****************************************************************************/

/****************************************************************************
*
*                            availability summary
*
* available for Starterkit: STK16X STK16XU
* conformed for Starterkit: STK16X STK16XU 
* available for Modul     : TQM164   TQM165   TQM165U  TQM166  TQM167
*                           TQM167UL TQM167U  TQM167LC
*                           
* conformed for Modul     : TQM164   TQM165   TQM165U  TQM166  TQM167
*                           TQM167UL TQM167U  TQM167LC
*****************************************************************************/

/*==========================================================================*
* include files (#INCLUDE):
*===========================================================================*/

/*--------------------------------------------------------------------------*
* standard include files: 
*---------------------------------------------------------------------------*/
#include <stdio.h>              /* standard I/O functions                  */
#include <reg167.h>             /* special function register               */

/*--------------------------------------------------------------------------*
* project specific include files:
*---------------------------------------------------------------------------*/
#include "timer.h"
#include "lcd.h"
#include "led.h"

/*==========================================================================*
* module internal definitions (#DEFINE):
*===========================================================================*/
#define VREF     5.00        /* external reference voltage for ADC        */
#define ADC_RES  1023        /* resolution for ADC                        */

/*==========================================================================*
* module internal type declarations (TYPEDEF):
*===========================================================================*/

/*==========================================================================*
* module internal constants (CONST):
*===========================================================================*/

/*==========================================================================*
* extern available constants (CONST):
*===========================================================================*/

/*==========================================================================*
* modul internal variables:
*===========================================================================*/

/*==========================================================================*
* globale external available variables (EXTERN):
*===========================================================================*/

/*==========================================================================*
* modul internal functions:
*===========================================================================*/

/*--------------------------------------------------------------------------*
* int adc_in(BYTE channel)
*---------------------------------------------------------------------------*
* FT: read an ADC channel
* EP: channel = channel for analog-to-digital-conversion
* RV: result of conversion (10 bit resolution)
* GP: -
*---------------------------------------------------------------------------*/ 
int adc_in(BYTE channel)
{
  ADCON = 0x80+channel;          /* select channel in ADC-control-register */
  while (ADCON&0x100) ;          /* wait for end of conversion             */
  return(1023-(ADDAT&0x3FF));    /* return result of conversion            */
}

/*--------------------------------------------------------------------------*
* void ledbar(BYTE value)
*---------------------------------------------------------------------------*
* FT: LED bar
* EP: value: output-level (0...16)
* RV: -
* GP: -
*---------------------------------------------------------------------------*/ 
void ledbar(BYTE value)
{ BYTE i;

  for (i=1; i<=value; i++)          /* turn LEDs ON */
  {
    led_set((i-1), LED_ON);      
  }
  for (i=value+1; i<=16; i++)
  {
    led_set((i-1), LED_OFF);        /* turn LEDs OFF */
  }
}

/*==========================================================================*
* extern available functions:
*===========================================================================*/

/*--------------------------------------------------------------------------*
* void main(void)
*---------------------------------------------------------------------------*
* FT: read analog input-channel and write value to LCD
*     show value as LED-bar
* EP: -
* RV: -
* GP: -
*---------------------------------------------------------------------------*/ 
void main(void)
{ int           i;
  int           adc_value;             /* digital value of analog input   */
  float         voltage;               /* input voltage                   */
  unsigned char adc_value_text[17];    /* textstring for output on LCD    */
  TIMER_COUNTER t_base;                /* time base for blinking          */
  BOOL          blink_state;

  timer_init(NULL);                    /* init timer modul                */
  led_init();                          /* init LED control                */
  lcd_init();                          /* init LCD                        */

  lcd_center(0, "A/D converter");
  lcd_center(1, "demo");

  /* start-up LED demo: */
  for (i=0; i<=LED_MAX; i++)
  {
    led_set(i, LED_ON);
    timer_delay_10ms(5);
  }
  for (i=0; i<=LED_MAX; i++)
  {
    led_set(i, LED_OFF);
    timer_delay_10ms(5);
  }

  /* wait for poti to be turned: */
  lcd_center(1, "Turn poti!");  
  adc_value = adc_in(0);               /* read analog input channel 0     */
  t_base = timer_get_10ms(TIMER_MIN);
  blink_state = TRUE;
  while((adc_value > adc_in(0) - 10) && (adc_value < adc_in(0) + 10))
  {
    if (timer_get_10ms(t_base) > 50)
    {
      t_base = timer_get_10ms(TIMER_MIN);
      if (blink_state == TRUE)
      {
        lcd_center(1, "");  
        blink_state = FALSE;
      }
      else
      {
        lcd_center(1, "Turn poti!");  
        blink_state = TRUE;
      }
    }
  }
  
  lcd_clr();                           /* clear LCD                       */ 
  lcd_center(0, "Input Voltage:");     /* write textstring to LCD         */

  /* endless main loop: */
  while(1)
  {
    adc_value = adc_in(0);             /* read analog input channel 0     */

    voltage = adc_value*VREF/ADC_RES;  /* calculate voltage               */

    /* convert unsigned int 'adc_value'
       to textstring 'adc_value_textstring' */

    sprintf(adc_value_text, "%4d = %.2f V", adc_value, voltage);

    lcd_center(1, adc_value_text);     /* write value to LCD              */

    ledbar((adc_value+32)/64);         /* show value on LED bar           */
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -