/*  Filename     ZMCP3202.C
    Description  MCP3202 12-BIT A/D EXAMPLE PROGRAM
    Hardware     SLAB-51
    Clock        11.0592 Mhz  
    Compiler     Keil PK51 v7.10
    Engineer     Kriangsak B.
    Company      Sila Research Co.,Ltd. 
*/

#include <reg51.h>
#include <absacc.h>
#include <assert.h>
#include <ctype.h>
#include <intrins.h>
#include <math.h>
#include <setjmp.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/********** I/O PORT **********/

sbit     ADCS      = P1^0;
sbit     ADCK      = P1^1;
sbit     ADDO      = P1^2;
sbit     ADDI      = P1^3;

/********** RAM WORKING **********/

unsigned int       ADCBUF[8];

/********** SUB FUNCTION **********/

void dmsec (unsigned int count) {           // mSec Delay
    unsigned int i;                         // for Keil CA51 (Speed x 1)
    while (count) {
        i = 115; while (i>0) i--;
        count--;
    }
}

unsigned int mcp3202r0 (void) {        // read mcp3202 a/d channel 0
    unsigned char i;
    unsigned int x;
    x = 0;
    ADCK = 0;                          // clk low first
    ADCS = 0;                          // chip select
    ADDI = 1; ADCK = 1; ADCK = 0;      // start bit
    ADDI = 1; ADCK = 1; ADCK = 0;      // SGL/DIFF = 1
    ADDI = 0; ADCK = 1; ADCK = 0;      // ODD/SIGN = 0
    ADDI = 1; ADCK = 1; ADCK = 0;      // MSBF = 1
    _nop_ ();
    _nop_ ();
    for (i=0;i<=11;i++) {              // 12 bit data
        ADCK = 1; ADCK = 0;
        x <<= 1;
        x = x | ADDO;
    }
    ADCS = 1;
    return (x);
}

unsigned int mcp3202a0 (void) {        // read a/d (ave buffer)
    unsigned char i;
    unsigned long x;
    ADCBUF[7] = ADCBUF[6];
    ADCBUF[6] = ADCBUF[5];
    ADCBUF[5] = ADCBUF[4];
    ADCBUF[4] = ADCBUF[3];
    ADCBUF[3] = ADCBUF[2];
    ADCBUF[2] = ADCBUF[1];
    ADCBUF[1] = ADCBUF[0];
    ADCBUF[0] = mcp3202r0 ();
    x = 0;
    for (i=0;i<=7;i++) x += ADCBUF[i];
    x = x / 8;
    return (x);
}

/********** MAIN FUNCTION **********/

void start (void) {               // speed x 1
    SCON = 0x52;             	  // set RS232 parameter
    TMOD = 0x20;
    TH1 = 0xfd; PCON |= 0x80;     // 19200
    TR1  = 1;
}

void main (void) {
	unsigned int d;
    float v;

    start ();
    while (1) {
		d = mcp3202a0 ();
		v = d;
		v = v * 5.00 / 4095;
		printf ("Data = %d ... Volt = %1.3f\n",d,v);
		dmsec (250);
    }
}


