/*****************************************************************************//*                                                                           *//*                        Demo für ON-Chip-A/D-Wandler                       *//*                        ============================                       *//*                                                                           *//*    Name:	        adc_1.c                                                  *//*    Funktion:	    Demo-Betrieb für ON-Chip-A/D-Wandler                     *//*    Autor:        v.Bg. / Gr.                                              *//*    Stand:        07.02.01                                                 *//*                                                                           *//*                                                                           *//*****************************************************************************//*** Allgemeine Festlegungen für den Compiler ***/#pragma DEBUG OBJECTEXTEND CODE/*** Einbinden von Include-Dateien ***/#include <ADuC812.h>                   // Register-Definitionen für ADuC812#include <stdio.h>                     // Standard I/O Funktionen/*****************************************************************************//*** Selbstgeschriebene Funktionen *******************************************//*****************************************************************************//*** Initialisierung der ser. Schnittstelle auf:   ***************************//**   9600 Bd, 8 Datenbits, keine Parität          ***************************/void ser_init(void)   {		SCON=0x52;		TMOD |=0x20;		TH1=0xfd;		TR1=1;		TI=1;   }/*****************************************************************************//*** Wartezeit: Vielfaches von 10ms ******************************************/void wait_10ms(unsigned char Multiplikator)   {  unsigned char a;  unsigned int	i;  for(a=0;a<Multiplikator;a++)   {	     for(i=0;i<20000;i++);   }  }/*****************************************************************************//*** Einlesen eines A/D-Wandler-Kanals ***************************************/unsigned int adc_in (unsigned int knr){   unsigned int mw;      // Kanal einstellen   	switch (knr)	    	{               case '0':   CS3=0; CS2=0; CS1=0; CS0=0;                           break;               case '1':   CS3=0; CS2=0; CS1=0; CS0=1;                           break;               case '2':   CS3=0; CS2=0; CS1=1; CS0=0;                           break;               case '3':   CS3=0; CS2=0; CS1=1; CS0=1;                           break;  	               case '4':   CS3=0; CS2=1; CS1=0; CS0=0;                           break;               case '5':   CS3=0; CS2=1; CS1=0; CS0=1;                           break;                 case '6':   CS3=0; CS2=1; CS1=1; CS0=0;                           break;               case '7':   CS3=0; CS2=1; CS1=1; CS0=1;                           break;               case '8':   CS3=1; CS2=0; CS1=0; CS0=0;                           break;           }           // Start der Wandlung: Single Conversion           SCONV=1;                      // Warten auf ´NOT Busy´ ==> BUSY-Bit = 0, dann fertig           while (ADCCON3!=0);           // Ergebnis einlesen und auswerten           mw=(ADCDATAH & 0x0f)*256+ADCDATAL;     // Meßwert bestimmen                      // Rückgabewert           return(mw);}/*****************************************************************************//*****************************************************************************//*****************************************************************************//*****************************************************************************//* Start des Hauptprogramms                                                  *//*****************************************************************************/void main(void){	// Variablen für main	unsigned int c,mw;   // Initialisierung der ser. Schnittstelle    ser_init();   // Titel-Meldung   printf("\x1b\x48\x1b\x4a");         // Bildschirm löschen   printf("ADC-Demo-1:\n\n\n");   // Einstellung des ADC´s:   /*  ADCCON1:    - ADC - Normal Mode                   - ADC-Clock-Divider: 2                   - ADC-Track-and-Hold-Time: 2                   - T2-Conversion-Bit: disable                   - External Trigger: disable                   ===>                            */   ADCCON1=0x54;      // Kanal-Auswahl	printf("  Bitte Kanal angeben (0 ... 8): ");	c=_getkey();            // Kanal-Nr. im ASCII-Code einlesen !	printf("\n\n");	// Endlos-Schleife	while(1)	    {           // Erst eine 'Blind-Wandlung': Single Conversion           mw=adc_in(c);                                 // Start der Haupt-Wandlung: Single Conversion           mw=adc_in(c);                      // Ergebnis ausgeben           printf("  Kanal-Nr.: %i  Messwert (dez):  %i    Messwert (hex):  %x\n\n",c-48,mw,mw);           // Warten: ca. 1 sec.           wait_10ms(10);       }	  // Ende des Hauptprogramms}