/*****************************************************************************//*                                                                           *//*                     Betrieb des ON-Chip-Temperatur-Sensors                *//*                     ======================================                *//*                                                                           *//*    Name:	       Temp812.c                                                 *//*    Funktion:	   Betrieb des ON-Chip-Temperatur-Sensors                    *//*    Autor:       v.Bg. / Gr.                                               *//*    Stand:       19.09.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++);   }  }/*****************************************************************************//*****************************************************************************//*****************************************************************************//* Start des Hauptprogramms                                                  *//*****************************************************************************/void main(void){	// Variablen für main   unsigned char c;   unsigned int temp;   unsigned int kanal;   float t,m,b;							// Parameter für die Geradengleichung   // Demo-Werte: 600mV bei 25 Grad C und -3mV/Grad C   m=-0.2041;   b=225.6;      // Initialisieurng der ser. Schnittstelle    ser_init();   // Eingabe der Geraden-Parameter m und b   printf("\x1b\x48\x1b\x4a");         				// Bildschirm löschen   printf("Eingabe der Parameterwerte fuer die Temperatur-Geradengleichung\n");   printf("===============================================================\n\n");   printf("  Bitte die Werte fuer m und b eingeben:\n\n");   printf("  Standardwerte gem. Datenblatt (600mV bei 25 Grad und -3mV/Grad):\n\n");   printf("     Bei 2,5V interner Referenzspannung:\n");   printf("       m= -0.2041     b= 225.6\n\n");   printf("     Bei 5,0V externer Referenzspannung:\n");   printf("       m= -0.4000     b= 221.8\n\n\n");    printf("       m = "); scanf("%f",&m);   printf("       b = "); scanf("%f",&b); printf("\n\n");   printf("Start durch Druck auf eine Taste .... ");   c=_getkey();   // Titel-Meldung   printf("\x1b\x48\x1b\x4a");         				// Bildschirm löschen   printf("ADuC812-Umgebungstemperatur:\n");   printf("============================\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;      /*  ADCCON1:    - Kanal-Nr:  8 !! */   CS3=1;  CS2=0;  CS1=0;  CS0=0;   // Endlos-Schleife   while(1)	    {           // Erst eine 'Blind-Wandlung': Single Conversion           SCONV=1;                      // Warten auf ´NOT Busy´ ==> BUSY-Bit = 0, dann fertig           while (ADCCON3!=0);           // Start der Haupt-Wandlung: Single Conversion           SCONV=1;                      // Warten auf ´NOT Busy´ ==> BUSY-Bit = 0, dann fertig           while (ADCCON3!=0);           // Ergebnis einlesen und auswerten           kanal=ADCDATAH & 0xf0;      // Kanal-Nr. bestimmen           kanal=kanal >> 4;           temp=(ADCDATAH & 0x0f)*256+ADCDATAL;     // Temperaturwert bestimmen                      // Digitales Ergebnis ausgeben           printf("  Kanal-Nr.: %u  Temp.-Wert (dez):  %u    Temp.-Wert (hex):  %x\n",kanal,temp,temp);		   // Berechnung der Geradengleichung		   t=m*temp + b;		   printf("  Temperatur: %4.1f  Grad Celsius\n\n",t);           // Warten: ca. 1 sec.          wait_10ms(10);       }// Ende des Hauptprogramms}