/* * ADC.C * read 40-bit data from PIC16C715 4-channel 8-bit resolution ADC * and 7-bit input port_B * P3.5 SCLK * P3.4 SDA * c:\mc\cc51 %1 -ilp h=c:\mc m=s s=c52robot.asm < need new startup file * * Copyright (c) 2000 by Wichit Sirichote */ #include "c:\mc\8051io.h" /* include i/o header file */ #include "c:\mc\8051reg.h" #include "c:\mc\8051bit.h" extern register char cputick; unsigned register char i,j,temp,x; unsigned register char buffer[5]; #define SCLK P3.5 #define SDA P3.4 #define LED P1.3 // for testing main() { while(1) { disable(); // read_40bit(); // swap two versions which one is faster read_ADC(); see_sensor(); // printf("\n%u %u %u %u %08b",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4]); } } pause(int j) { int i; for (i = 0; i < j; i++) ; } read_40bit(){ // read ADC and input port from 715 converter disable(); setbit(LED) clrbit(SCLK) // start bit pause(10); for(j=0;j<5;j++) /* outer loop 5-byte */ { for(i=0;i<8;i++) /* inner loop 8-bit */ { clrbit(SCLK) pause(3); setbit(SCLK) /* produce rising edge pulse */ pause(3); asm { setb SDA mov A,temp mov C,SDA // read data put to carry flag rrc A /* shift carry flag into A, save to temp */ mov temp,A } } buffer[j] = temp; /* save temp to BUFFER[j] */ } clrbit(LED) // enable(); } read_ADC() //use rrc instruction shifting SDA in 40-bit register { disable(); setbit(LED) clrbit(SCLK) // start bit pause(10); for(i=0;i<40;i++) /* loop 40-bit */ { clrbit(SCLK) pause(3); setbit(SCLK) /* produce rising edge pulse */ pause(3); asm{ // 40-bit SIPO register using buffer[5] setb SDA mov C,SDA mov A,buffer+4 rrc A mov buffer+4,A mov A,buffer+3 rrc A mov buffer+3,A mov A,buffer+2 rrc A mov buffer+2,A mov A,buffer+1 rrc A mov buffer+1,A mov A,buffer rrc A mov buffer,A } } clrbit(LED) // enable(); } see_sensor() { // putch(13); printf("%03u\n",buffer[0]); // if(buffer[1]>=80) x= (buffer[0])/3; x+=10; for(i=0;i