1一设计思路本设计采用AT89C51为主控芯片,外部采用ADC0804作为电压采集芯片,外部电压最高为10V,而ADC0804最高电压为+5V,所以模拟量连接入ADC芯片之前,首先用电阻分压,把待测电压分为原来的一半,这样所检测的电压就用0-10V变成了0-5V,符合ADC芯片的输入要求,在检测电压后,经过单片机处理后,在在原来的电压基础上乘以2则可以恢复以前的待测电压。电压报警电路则由一路继电器和发光二极管,以及喇叭所组成。当ADC芯片所检测的电压超过一定的限制,则使特定的IO口变成低电平,导通PNP三极管,使继电器导通,发光LED和喇叭行成压降。产生报警。由ADC芯片采集的电压值,和由电阻所变换计算出的电流值,在LCD上显示。报警电压由两个按键所设定,当按键一按下则报警值加0.1V,当按键二按下则报警值减掉0.1V。单片机内部随时把采集电压和报警电压进行比较,当采集电压高过报警电压,则启动报警。2二整体电路图、三仿真图形电压,电流显示电路声光报警电路按键设置电路本次设计由于protues中的12864只有不带字库的液晶显示器,操作极为复杂。由于时间问题。软件程序仅仅调试了液晶1602显示器。相信只要有时间12864的显示也一定能够完成。4四软件程序#includereg52.h#includeintrins.h#defineuint8unsignedchar#defineuint16unsignedint#defineint16int#definenops();{_nop_();_nop_();_nop_();_nop_();}//定义空指令sbitRS=P2^0;//定义连接端口sbitRW=P2^1;sbitEN=P2^2;sbitBUSY=P0^7;sbitRD1=P3^7;sbitWR1=P3^6;sbitCS=P3^5;sbitk1=P2^4;sbitk2=P2^5;sbitbaojing=P2^3;voiddelay(uint8x);voiddelay1(uint16n);voidwait(void);voidw_dat(uint8dat);voidw_cmd(uint8cmd);voidInit_LCD1602(void);voidad_kaishi();uint8read_ad();voidw_string(uint8addr_start,uint8*p);voidtimer0_init();voidxianshi();voidkey_init();voidkey();uint8cout,ad1,c1,i2;int16b1;uint16counter,sce;5floata,a1,ad,i1;unsignedcharcodeword1[]={U:};unsignedcharcodeword2[]={I:};voidmain(){Init_LCD1602();timer0_init();key_init();baojing=1;ad=40;while(1){if(2*a1=(ad/10))//报警{baojing=0;}else{baojing=1;}key();}}voidkey(){if(!k1){delay(10);if(!k1){ad++;}}while(!k1);if(!k2){delay(10);if(!k2)6{ad--;}}while(!k2);}voiddelay(uint8x){uint8i,j;for(i=x;i--;i0){for(j=110;j--;j0);}}voiddelay1(uint16n){while(n--);}voidwait(void){P0=0xFF;do{RS=0;RW=1;EN=0;EN=1;}while(BUSY==1);EN=0;}/***写数据*/voidw_dat(uint8dat){wait();EN=0;P0=dat;RS=1;RW=0;EN=1;EN=0;}7/***写命令*/voidw_cmd(uint8cmd){wait();EN=0;P0=cmd;RS=0;RW=0;EN=1;EN=0;}/***初始化1602*/voidInit_LCD1602(void){w_cmd(0x38);//16*2显示,5*7点阵,8位数据接口w_cmd(0x0C);//显示器开、光标开、光标允许闪烁w_cmd(0x06);//文字不动,光标自动右移w_cmd(0x01);//清屏}voidad_kaishi(){CS=0;delay(1);WR1=0;delay(1);WR1=1;CS=1;}uint8read_ad(){uint8ad1;CS=0;delay(1);RD1=0;ad1=P1;delay(10);RD1=1;CS=1;returnad1;}8voidtimer0_init(){TMOD=0X01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;EA=1;ET0=1;}voidw_string(uint8addr_start,uint8*p){w_cmd(addr_start);while(*p!='\0'){w_dat(*p++);}}voidxianshi(){/*c1=a;w_cmd(0x80);w_dat(c1/100+'0');w_dat(c1/10%10+'0');w_dat(c1%10+'0');*/w_string(0x80,word1);w_string(0xc0,word2);b1=a1*100*2;w_cmd(0xc4);w_dat(b1/100+'0');w_dat(0x2e);w_dat(b1/10%10+'0');w_dat(b1%10+'0');w_dat(0x56);w_dat(0x2d);ad1=ad;w_cmd(0x83);w_dat(ad1/10+'0');w_dat(0x2e);w_dat(ad1%10+'0');w_dat(0x56);9i2=i1*1000*2;w_cmd(0xc0+10);w_dat(i2/100+'0');w_dat(i2/10%10+'0');w_dat(i2%10+'0');w_dat(0x6d);w_dat(0x41);}voidkey_init(){k1=1;k2=1;}voidinterrupt_timer1()interrupt1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;sce++;if(sce==5){sce=0;ad_kaishi();a=read_ad();delay(5);a1=(a/255)*5;i1=(a/255)*5/100;xianshi();}}