|
這是我上次用到的直流電子負(fù)載proteus圖,并附上程序,僅供參考。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (16.33 KB, 下載次數(shù): 68)
下載附件
2018-4-28 23:44 上傳
0.png (18.83 KB, 下載次數(shù): 63)
下載附件
2018-4-28 23:44 上傳
Y9]NRL9MQJX}R~ZKQ)MGXZL.png (58.15 KB, 下載次數(shù): 68)
下載附件
附件里面的文件
2018-4-28 21:22 上傳
單片機(jī)源程序如下:
- #include "STC12S5A60S2.h" //調(diào)用STC單片機(jī)頭文件
- #include <intrins.H>
- #include <stdio.h>
- #include "Delay.h" //延時(shí)函數(shù)頭文件
- #include "ADC.h" //模數(shù)轉(zhuǎn)換頭文件
- #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輸出電流檢測(cè)
- int DA=1; //5oh 負(fù)載電阻 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);//設(shè)置鍵
-
- 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; //定時(shí)器工作在方式1 定時(shí)模式
- TH0=0X3C; //初值 50ms
- TL0=0XB0;
- ET0=1; //開啟定時(shí)器使能標(biāo)志
- TR0=1; //運(yùn)行定時(shí)器0
- EA=1; //開總中斷
- }
- void main()
- {
- CE=0; //使能輸出
- P1M1=0X03;
- P1M0=0X00; //初始化單片機(jī)P1口,設(shè)置P10 P11 為AD輸入口
- InitLcd(); //初始化液晶
- DisplayString("SI=0000mA ",0x00);
- DisplayString("I =0000mA V=0.00V",0x40); //液晶初始界面
- InitTimer(); //初始化定時(shí)器 50ms
- InitADC(); //初始化單片機(jī)AD
- TLC5615(DA); //初始DA輸出
- while(1)
- {
- KeyScan(); //按鍵掃描
- if(SecFlag==1) //1秒鐘時(shí)間到
- {
- SecFlag=0;
- if(SetFlag==0)
- {
- ADVal0=ADC(0);//電池1檢測(cè)
- 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);//負(fù)載檢測(cè) 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)
- {
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
新建文件夾.zip
(25.95 KB, 下載次數(shù): 201)
2018-4-28 21:21 上傳
點(diǎn)擊文件名下載附件
這是硬件和軟件
|
|