已知文件中有AT89C51,RESPACK-8,LM016L和TLC2543,DC VOLTMETER和POT-HG,使用电路仿真软件Proteus在上面文件的代码的基础上修改一些代码添加一些器件,使其LM016L能够同时读取单口的电压电流和电阻并同时显示。下面是文件内容#include<reg51.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define LCD1602_DATAPINS P0sbit LCD1602_E=P2^2;sbit LCD1602_RW=P2^1;sbit LCD1602_RS=P2^0;ulong volt;//??????sbit CLK=P3^3;//???????sbit DIN=P3^1;//??2543?????sbit DOUT=P3^0;//??2543?????sbit CS=P3^2;//??2543?????void read2543(uchar addr){uint ad=0;uchar i;CLK=0;CS=0;//???,??2543addr<<=4;//???????for(i=0;i<12;i++) //12?????,????????{if(DOUT==1)ad=ad|0x01;//?????ad??DIN=addr&0x80;//2543???????CLK=1;;;;//?????CLK=0;//?????,??????;;;addr<<=1;ad<<=1;//?????????????}CS=1;//?2543ad>>=1;volt=ad;//??????volt=volt*1221;//???????5V,??????12?(2?12??=4096) ??????255,5/4096=1221mV,?????1V????1221mV }/******************************************************************************** ? ? ? : Lcd1602_Delay1ms* ???? : ????,??1ms* ? ? : c* ? ? : ?* ? ? : ?????12MHZ???,12?????????*******************************************************************************/void Lcd1602_Delay1ms(uint c) //?? 0us{ uchar a,b;for (; c>0; c--){ for (b=199;b>0;b--) { for(a=1;a>0;a--); } } }/******************************************************************************** ? ? ? : LcdWriteCom* ???? : ?LCD?????????* ? ? : com* ? ? : ?*******************************************************************************/void LcdWriteCom(uchar com) //????{LCD1602_E = 0; //??LCD1602_RS = 0; //??????LCD1602_RW = 0; //????LCD1602_DATAPINS = com; //????Lcd1602_Delay1ms(1);//??????LCD1602_E = 1; //????Lcd1602_Delay1ms(5); //????LCD1602_E = 0;}/******************************************************************************** ? ? ? : LcdWriteData* ???? : ?LCD?????????* ? ? : dat* ? ? : ?*******************************************************************************/ void LcdWriteData(uchar dat)//????{LCD1602_E = 0;//????LCD1602_RS = 1;//??????LCD1602_RW = 0;//????LCD1602_DATAPINS = dat; //????Lcd1602_Delay1ms(1);LCD1602_E = 1; //????Lcd1602_Delay1ms(5); //????LCD1602_E = 0;}/******************************************************************************** ? ? ? : LcdInit()* ???? : ???LCD?* ? ? : ?* ? ? : ?*******************************************************************************/ void LcdInit() //LCD??????{ LcdWriteCom(0x38); //???LcdWriteCom(0x0c); //????????LcdWriteCom(0x06); //??????1LcdWriteCom(0x01); //??LcdWriteCom(0x80); //????????}//???????????void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){ Y &= 0x1; X &= 0xF; //??X????15,Y????1 if (Y) X |= 0x40; //???????????+0x40; X |= 0x80; // ????? LcdWriteCom(X); //????????,????? LcdWriteData(DData);}//???????????void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData){ unsigned char ListLength; ListLength = 0; Y &= 0x1; X &= 0xF; //??X????15,Y????1 while (DData[ListLength]>=0x20) //????????? { if (X <= 0xF) //X?????0xF { DisplayOneChar(X, Y, DData[ListLength]); //?????? ListLength++; X++; } }}void main(){LcdInit();//DisplayListChar(1,0,"TEST SYSTEM");//DisplayListChar(0,1,"Tem:");read2543(0);while(1){read2543(0);DisplayOneChar(0,0,(char)(volt/1000000%10+'0'));DisplayListChar(1,0,".");DisplayOneChar(2,0,(char)(volt/100000%10+'0'));DisplayOneChar(3,0,(char)(volt/10000%10+'0'));DisplayOneChar(4,0,(char)(volt/1000%10+'0'));DisplayOneChar(5,0,(char)(volt/100%10+'0'));DisplayOneChar(6,0,(char)(volt/10%10+'0'));DisplayOneChar(7,0,(char)(volt%10+'0'));DisplayListChar(8,0,"V");Lcd1602_Delay1ms(50);}}