| #include<reg52.h>
 #include<intrins.h>
 #define uint unsigned int
 #define uchar unsigned char
 
 sbit SCL=P1^1;//时钟脉冲
 sbit SDA=P1^2;//双向输入输出数据端
 #define SCL_SET SCL=1
 #define SCL_CLR SCL=0
 #define SDA_SET SDA=1
 #define SDA_CLR SDA=0
 #define AddWr 0x90   //写数据地址
 #define AddRd 0x91   //读数据地址
 #define adCon 0x40   //AD控制字节
 
 
 sbit RS=P2^4;
 sbit RW=P2^5;
 sbit E=P2^6;
 #define setRS RS=1
 #define clrRS RS=0
 #define setRW RW=1
 #define clrRW RW=0
 #define setE E=1
 #define clrE E=0
 
 
 uint time=0;
 uchar ADFlag=0;
 uchar str[8]="Ci n.mv ";
 
 //延时1US
 void delay(uint cnt)
 {
 while(--cnt);
 }
 //延时1MS
 void delayms(uint time)
 {
 uint i;
 for(i=0; i<time; i++)
 delay(120);
 }
 //写数据,P0
 void writeData(uchar Data)
 {
 setRS;
 clrRW;
 delay(1);
 setE;
 delay(1);
 P0=Data;
 delay(5);
 clrE;
 }
 //写命令,P0
 void writeCom(uchar Com)
 {
 clrRS;
 clrRW;
 delay(1);
 setE;
 delay(1);
 P0=Com;
 delay(5);
 clrE;
 }
 //清屏函数
 void clear_scr(void)
 {
 writeCom(0x01);
 delayms(5);
 }
 
 //写一个字符串在(X,Y )位置
 void disStr(uchar x, uchar y, uchar *str)
 {
 if(y==0) writeCom(0x80+x);//第一行
 else writeCom(0xc0+x);//第二行
 while(*str)
 {
 writeData(*str);
 str++;
 }
 }
 //LCD1602初始化
 void lcdInitial()
 {
 writeCom(0x38);//显示模式设置
 delayms(5);
 writeCom(0x08);//显示关闭
 clear_scr();//清屏
 writeCom(0x06); //显示光标移动设置
 delayms(5);
 writeCom(0x0C); //显示开及光标设置
 }
 
 
 void start()
 {
 SDA_SET;
 delay(1);
 SCL_SET;
 delay(5);
 SDA_CLR;
 }
 
 
 void stop()
 {
 SDA_CLR;
 delay(1);
 SCL_SET;
 delay(5);
 SDA_SET;
 }
 
 
 void ack()
 {
 SDA_CLR;
 SCL_SET;
 delay(1);
 SCL_CLR;
 }
 
 
 void noAck()
 {
 SDA_SET;
 SCL_SET;
 delay(1);
 SCL_CLR;
 }
 
 
 void send(uchar Data)
 {
 uchar i=0;
 uchar temp=0;
 
 temp=Data;
 for(i=0; i<8; i++)
 {
 SCL_CLR;
 delay(1);
 if(temp&0x80) SDA_SET;
 else SDA_CLR;
 delay(1);
 SCL_SET;
 delay(1);
 temp<<=1;
 }
 SCL_CLR;
 }
 
 
 uchar recive()
 {
 unsigned char temp=0;
 unsigned char temp1=0;
 unsigned char BitCounter=8;
 
 SDA_SET;
 do
 {
 SCL_CLR;
 _nop_();
 SCL_SET;
 _nop_();
 if(SDA)
 temp=temp|0x01;
 else
 temp=temp&0xfe;
 
 if(BitCounter-1)
 {
 temp1=temp<<1;
 temp=temp1;
 }
 BitCounter--;
 }
 while(BitCounter);
 return(temp);
 }
 
 
 uchar read(uchar ch )
 {
 uchar temp=0;
 
 start();
 send(AddWr);//确认芯片
 ack();
 send(adCon|ch);//确认通道
 ack();
 //读出数据,放进temp
 start();
 send(AddRd);
 ack();
 temp=recive();
 noAck();
 stop();
 return temp;
 }
 
 
 
 void dis(uchar *date)
 {
 
 uchar i=0;
 uchar ch1, ch2, ch3;//ch4;
 
 for(i=0; i<4; i++)
 {
 
 ch1=i+48;
 str[1]=ch1;
 ch2=date[i]/51+48;
 str[3]=ch2;
 
 
 ch3=date[i]%51/10+48;
 
 str[5]=ch3;
 
 disStr(i*8, 0, str);
 
 }
 }
 
 
 void interrupt_init()
 {
 ET0=1;//定时器0溢出中断允许
 TR0=1;//启动定时器0
 TMOD=0X01;
 TH0=0Xd8;
 TL0=0Xf0;
 EA=1;//开总中断
 }
 
 
 
 void main()
 {
 uchar i=0;
 uchar vot[4];
 
 
 interrupt_init();
 lcdInitial();
 
 
 while(1)
 {
 if(ADFlag==1)
 {
 for(i=0; i<4; i++) vot[i]=read(i);
 
 
 
 }
 dis(vot);
 }
 }
 
 void tim0_() interrupt 1 using 1
 {
 TH0=0xd8;  //重新赋值
 TL0=0xf0;
 
 time++;
 if(time==100)
 {  time=0;
 ADFlag=1;
 } //定时置位AD采样标志位
 }
 |