#include "reg52.h" #include "absacc.h" #include "math.h" #include "stdio.h" #include "intrins.h" #include "ad7896h.h" #include "ds18b20h.h" #include "timer.h" #include "24c16.h" #include "keyh.h" #include "dac.h" uchar IDATA c_SumValue[2]; uchar IDATA VlotageSum[2]; void delay10(uint x); void I_init(void); /* void delay(uint x,uint y) { uint i,j; for(i=0;i<=x;i++) { for(j=0;j<=y;j++) { _nop_(); _nop_(); } } } */ void wait(void) { byte i=50; for(i=0;i<8;i++); } void delay10(uint x) { uint i=0; for(i=0;i<x;i++) _nop_(); } void I_init(void) { SCL = HIGH ; SDA=HIGH ; wait(); } void I_start(void) { SCL = HIGH ; wait(); SDA=LOW; wait(); SCL=LOW; wait(); } void I_stop(void) { SDA=LOW; wait(); SCL = HIGH ; wait(); SDA=HIGH ; wait(); SCL=LOW; wait(); } void I_send(byte a) { byte i; for(i=0;i<8;i++) { if(a & 0x80) SDA=HIGH; else SDA=LOW; a=(a<<1); SCL = HIGH ; wait(); SCL=LOW; wait(); } SDA=HIGH; wait(); SCL = HIGH ; wait(); SCL=LOW; wait(); } byte I_receive(void) { byte a=0; byte i; for(i=0;i<8;i++) { a = a*2; SCL = HIGH ; wait(); if(SDA) a |= 1; SCL=LOW; wait(); } SDA=HIGH; wait(); return(a); } void I_addres_wri(byte ds,byte x,byte a) { I_start(); I_send(ds); I_send(x); I_send(a); I_stop(); delay10(0x500); } byte I_addres_red(byte ds,byte x) { byte a; I_start(); I_send(ds); I_send(x); I_start(); I_send(ds+1); a=I_receive(); I_stop(); return(a); } void wri_n(uchar z,uchar * x,uchar y,byte ds) /*z:24c64addr,x,rom or ram or xdata addrds:写进24c16的分区, 第1区256b,ds=0xa0;第2区256b,ds=0xa2 第3区256b,ds=0xa4;第4区256b,ds=0xa6 第5区256b,ds=0xa8;第6区256b,ds=0xaa 第7区256b,ds=0xac;第8区256b,ds=0xae*/ { uchar i; uchar a; for(i=0;i<y;i++) { a=*(x+i); I_addres_wri(ds,z+i,a); } } rea_n(uchar z,uchar * x,uchar y,byte ds) /*z:24c64addr,x,rom or ram or xdata addr*/ { uchar i; for(i=0;i<y;i++) { *(x+i)=I_addres_red(ds,z+i); } }
void read_wri16(void) { c_SumValue[0]=VariablePi&0xff; c_SumValue[1]=(VariablePi&0xff00)>>8; wri_n(0,c_SumValue,2,0xa2); rea_n(0,VlotageSum,2,0Xa2); VariableVl=VlotageSum[1]*256+VlotageSum[0]; //VariableVl=VariableVl&0xfff; } 我的主函数读写上面的子程序read_wri16();不知为啥读数不正确? |