这是我上次用到的直流电子负载proteus图,并附上程序,仅供参考。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include "STC12S5A60S2.h" //调用STC单片机头文件
- #include <intrins.H>
- #include <stdio.h>
- #include "Delay.h" //延时函数头文件
- #include "ADC.h" //模数转换头文件
- #include "Lcd1602.h"
- #include "TLC5615.h"
- sbit CE=P2^3;
- sbit KEY1=P1^4;
- sbit KEY2=P1^5;
- sbit KEY3=P1^6;
- sbit KEY4=P1^7;
- sbit BEEP=P3^7;
- uint ADVal0,ADVal1; //AD0电池电压 AD1输出电流检测
- int DA=1; //5oh 负载电阻 X 200mA =1V
- bit LoadFlag=0;
- bit CEFlag=0;
- bit SecFlag=0;
- float fAD0=0;//,fAD1=0;
- uint AD1=0;
- uchar arrAD0[5];
- uchar arrAD1[5];
- //float fSI=0;
- uint SI=0;
- uchar arrfSI[5];
- bit Flag=0;
- bit OkFlag=0;
- bit SetFlag=0;
- uint SetNum=0;
- int Qian=0, Bai=0, Shi=0 ,Ge=0;
- uchar Cnt=0;
- void KeyScan()
- {
- if(KEY1==0)
- {
- DelayMS(2);
- if(KEY1==0)
- {
- while(!KEY1);//设置键
-
- SetFlag=~SetFlag;
- if(SetFlag==1)
- {
- WriteCommand(0x0f);
- WriteCommand(0x80+3);
- OkFlag=0;
- SetNum=1;
- }
- else
- {
- WriteCommand(0x0c);
- WriteCommand(0x80+3);
- }
-
- }
- }
- if(KEY2==0) //右移
- {
- DelayMS(2);
- if(KEY2==0)
- {
- while(!KEY2);
- SetNum++;
- switch(SetNum)
- {
- case 1:
- WriteCommand(0x80+3);
- break;
- case 2:
- WriteCommand(0x80+4);
- break;
- case 3:
- WriteCommand(0x80+5);
- break;
- case 4:
- SetNum=0;
- WriteCommand(0x80+6);
- break;
- }
-
- }
- }
- if(KEY3==0) //+
- {
- DelayMS(2);
- if(KEY3==0)
- {
- while(!KEY3);
- switch(SetNum)
- {
- case 1:
- Qian++;
- if(Qian>9) Qian=0;
- WriteData(Qian+0x30);
- WriteCommand(0x80+3);
- break;
- case 2:
- Bai++;
- if(Bai>9) Bai=0;
- WriteData(Bai+0x30);
- WriteCommand(0x80+4);
- break;
- case 3:
- Shi++;
- if(Shi>9) Shi=0;
- WriteData(Shi+0x30);
- WriteCommand(0x80+5);
- break;
- case 4:
- Ge++;
- if(Ge>9) Ge=0;
- WriteData(Ge+0x30);
- WriteCommand(0x80+6);
- break;
- }
-
- }
- }
- if(KEY4==0) //-
- {
- DelayMS(2);
- if(KEY4==0)
- {
- while(!KEY4);
- switch(SetNum)
- {
- case 1:
- Qian--;
- if(Qian<0) Qian=9;
- WriteData(Qian+0x30);
- WriteCommand(0x80+3);
- break;
- case 2:
- Bai--;
- if(Bai<0) Bai=9;
- WriteData(Bai+0x30);
- WriteCommand(0x80+4);
- break;
- case 3:
- Shi--;
- if(Shi<0) Shi=9;
- WriteData(Shi+0x30);
- WriteCommand(0x80+5);
- break;
- case 4:
- Ge--;
- if(Ge<0) Ge=9;
- WriteData(Ge+0x30);
- WriteCommand(0x80+6);
- break;
- }
-
- }
- }
- }
- void InitTimer()
- {
- TMOD=0X01; //定时器工作在方式1 定时模式
- TH0=0X3C; //初值 50ms
- TL0=0XB0;
- ET0=1; //开启定时器使能标志
- TR0=1; //运行定时器0
- EA=1; //开总中断
- }
- void main()
- {
- CE=0; //使能输出
- P1M1=0X03;
- P1M0=0X00; //初始化单片机P1口,设置P10 P11 为AD输入口
- InitLcd(); //初始化液晶
- DisplayString("SI=0000mA ",0x00);
- DisplayString("I =0000mA V=0.00V",0x40); //液晶初始界面
- InitTimer(); //初始化定时器 50ms
- InitADC(); //初始化单片机AD
- TLC5615(DA); //初始DA输出
- while(1)
- {
- KeyScan(); //按键扫描
- if(SecFlag==1) //1秒钟时间到
- {
- SecFlag=0;
- if(SetFlag==0)
- {
- ADVal0=ADC(0);//电池1检测
- fAD0=ADVal0*0.004883*6; //20K 与100K分压
- sprintf(arrAD0,"%4f",fAD0);
- arrAD0[4]='\0';
- GotoXY(11,1);
- Print(arrAD0);
- if(fAD0<1)
- {
- GotoXY(2,1);
- Print("0000\0");
- DA=1;
- TLC5615(DA);
- }
-
- SI=Qian*1000+Bai*100+Shi*10+Ge;
- if(SI>1000)
- {
- SI=1000;
- GotoXY(3,0);
- Print("1000\0");
- Qian=1;
- Bai=0;
- Shi=0;
- Ge=0;
- }
- if(OkFlag==0)
- {
-
- ADVal1=ADC(1);//负载检测 0.5R
- AD1=ADVal1*9; //0.009766
- sprintf(arrAD1,"%04d",AD1);
- arrAD1[4]='\0';
- GotoXY(2,1);
- Print(arrAD1);
- Flag=0;
- if(SI>5)
- {
- if(AD1<(SI-5))
- {
- DA++;
- Flag=1;
- }
- if(AD1>(SI+5))
- {
- DA--;
- if(DA<1)
- {
- DA=1;
- }
- Flag=1;
- }
- if(Flag==0)
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
新建文件夹.zip
(25.95 KB, 下载次数: 201)
|