找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6419|回复: 13
打印 上一主题 下一主题
收起左侧

单片机做的直流电子负载proteus仿真与源码

  [复制链接]
跳转到指定楼层
楼主
这是我上次用到的直流电子负载proteus图,并附上程序,仅供参考。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include "STC12S5A60S2.h"  //调用STC单片机头文件
  2. #include <intrins.H>
  3. #include <stdio.h>
  4. #include "Delay.h"         //延时函数头文件
  5. #include "ADC.h"         //模数转换头文件
  6. #include "Lcd1602.h"
  7. #include "TLC5615.h"

  8. sbit CE=P2^3;
  9. sbit KEY1=P1^4;
  10. sbit KEY2=P1^5;
  11. sbit KEY3=P1^6;
  12. sbit KEY4=P1^7;
  13. sbit BEEP=P3^7;
  14. uint ADVal0,ADVal1; //AD0电池电压        AD1输出电流检测
  15. int DA=1;          //5oh 负载电阻 X 200mA =1V

  16. bit LoadFlag=0;
  17. bit CEFlag=0;
  18. bit SecFlag=0;
  19. float fAD0=0;//,fAD1=0;
  20. uint AD1=0;

  21. uchar  arrAD0[5];
  22. uchar  arrAD1[5];

  23. //float fSI=0;
  24. uint SI=0;
  25. uchar arrfSI[5];
  26. bit Flag=0;
  27. bit OkFlag=0;
  28. bit SetFlag=0;
  29. uint SetNum=0;
  30. int Qian=0, Bai=0, Shi=0 ,Ge=0;
  31. uchar Cnt=0;

  32. void KeyScan()
  33. {
  34.         if(KEY1==0)          
  35.         {
  36.                 DelayMS(2);
  37.                 if(KEY1==0)
  38.                 {
  39.                          while(!KEY1);//设置键
  40.                          
  41.                          SetFlag=~SetFlag;
  42.                         if(SetFlag==1)
  43.                         {
  44.                                  WriteCommand(0x0f);
  45.                                  WriteCommand(0x80+3);
  46.                                  OkFlag=0;
  47.                                  SetNum=1;
  48.                          }
  49.                          else
  50.                          {
  51.                                   WriteCommand(0x0c);
  52.                                  WriteCommand(0x80+3);
  53.                          }
  54.                
  55.                 }
  56.         }
  57.         if(KEY2==0)         //右移
  58.         {
  59.                 DelayMS(2);
  60.                 if(KEY2==0)
  61.                 {
  62.                         while(!KEY2);
  63.                          SetNum++;
  64.                          switch(SetNum)
  65.                          {
  66.                                  case 1:
  67.                                          WriteCommand(0x80+3);
  68.                                 break;
  69.                                 case 2:
  70.                                         WriteCommand(0x80+4);
  71.                                 break;
  72.                                 case 3:
  73.                                         WriteCommand(0x80+5);
  74.                                 break;
  75.                                 case 4:
  76.                                         SetNum=0;
  77.                                         WriteCommand(0x80+6);
  78.                                 break;
  79.                          }
  80.        
  81.                 }
  82.         }
  83.         if(KEY3==0)         //+
  84.         {
  85.                 DelayMS(2);
  86.                 if(KEY3==0)
  87.                 {
  88.                    while(!KEY3);
  89.                     switch(SetNum)
  90.                          {
  91.                                  case 1:
  92.                                          Qian++;
  93.                                         if(Qian>9) Qian=0;
  94.                                         WriteData(Qian+0x30);
  95.                                         WriteCommand(0x80+3);
  96.                                 break;
  97.                                 case 2:
  98.                                         Bai++;
  99.                                         if(Bai>9) Bai=0;
  100.                                         WriteData(Bai+0x30);
  101.                                         WriteCommand(0x80+4);
  102.                                 break;
  103.                                 case 3:
  104.                                         Shi++;
  105.                                         if(Shi>9) Shi=0;
  106.                                         WriteData(Shi+0x30);
  107.                                         WriteCommand(0x80+5);
  108.                                 break;
  109.                                 case 4:
  110.                                         Ge++;
  111.                                         if(Ge>9) Ge=0;
  112.                                         WriteData(Ge+0x30);
  113.                                         WriteCommand(0x80+6);
  114.                                 break;
  115.                          }
  116.        
  117.                 }
  118.         }
  119.         if(KEY4==0)         //-
  120.         {
  121.                 DelayMS(2);
  122.                 if(KEY4==0)
  123.                 {
  124.                    while(!KEY4);
  125.                    switch(SetNum)
  126.                          {
  127.                                  case 1:
  128.                                          Qian--;
  129.                                         if(Qian<0) Qian=9;
  130.                                         WriteData(Qian+0x30);
  131.                                         WriteCommand(0x80+3);
  132.                                 break;
  133.                                 case 2:
  134.                                         Bai--;
  135.                                         if(Bai<0) Bai=9;
  136.                                         WriteData(Bai+0x30);
  137.                                         WriteCommand(0x80+4);
  138.                                 break;
  139.                                 case 3:
  140.                                         Shi--;
  141.                                         if(Shi<0) Shi=9;
  142.                                         WriteData(Shi+0x30);
  143.                                         WriteCommand(0x80+5);
  144.                                 break;
  145.                                 case 4:
  146.                                         Ge--;
  147.                                         if(Ge<0) Ge=9;
  148.                                         WriteData(Ge+0x30);
  149.                                         WriteCommand(0x80+6);
  150.                                 break;
  151.                          }
  152.                
  153.                 }
  154.         }
  155. }
  156. void InitTimer()
  157. {
  158.         TMOD=0X01; //定时器工作在方式1 定时模式
  159.         TH0=0X3C;  //初值 50ms
  160.         TL0=0XB0;
  161.         ET0=1;           //开启定时器使能标志
  162.         TR0=1;           //运行定时器0
  163.         EA=1;           //开总中断
  164. }

  165. void main()
  166. {
  167.         CE=0;              //使能输出
  168.         P1M1=0X03;
  169.         P1M0=0X00;        //初始化单片机P1口,设置P10 P11 为AD输入口
  170.         InitLcd();        //初始化液晶  
  171.         DisplayString("SI=0000mA        ",0x00);
  172.         DisplayString("I =0000mA V=0.00V",0x40);        //液晶初始界面
  173.         InitTimer(); //初始化定时器 50ms
  174.         InitADC();         //初始化单片机AD
  175.         TLC5615(DA); //初始DA输出
  176.         while(1)
  177.         {
  178.                 KeyScan();        //按键扫描
  179.                 if(SecFlag==1)          //1秒钟时间到
  180.                 {
  181.                         SecFlag=0;

  182.                         if(SetFlag==0)
  183.                         {
  184.                                 ADVal0=ADC(0);//电池1检测
  185.                                 fAD0=ADVal0*0.004883*6;           //20K 与100K分压
  186.                                 sprintf(arrAD0,"%4f",fAD0);
  187.                                 arrAD0[4]='\0';
  188.                                 GotoXY(11,1);
  189.                                 Print(arrAD0);
  190.                                 if(fAD0<1)
  191.                                 {
  192.                                         GotoXY(2,1);
  193.                                         Print("0000\0");
  194.                                         DA=1;
  195.                                         TLC5615(DA);
  196.                                 }
  197.                        
  198.                                 SI=Qian*1000+Bai*100+Shi*10+Ge;
  199.                                 if(SI>1000)
  200.                                 {
  201.                                    SI=1000;
  202.                                    GotoXY(3,0);
  203.                                    Print("1000\0");
  204.                                    Qian=1;
  205.                                    Bai=0;
  206.                                    Shi=0;
  207.                                    Ge=0;
  208.                                 }
  209.                                 if(OkFlag==0)
  210.                                 {       
  211.                                        
  212.                                         ADVal1=ADC(1);//负载检测 0.5R
  213.                                         AD1=ADVal1*9;        //0.009766         
  214.                                         sprintf(arrAD1,"%04d",AD1);
  215.                                         arrAD1[4]='\0';
  216.                                         GotoXY(2,1);
  217.                                         Print(arrAD1);

  218.                                         Flag=0;
  219.                                         if(SI>5)
  220.                                         {
  221.                                                 if(AD1<(SI-5))
  222.                                                 {
  223.                                                         DA++;
  224.                                                         Flag=1;
  225.                                                 }
  226.                                                 if(AD1>(SI+5))
  227.                                                 {
  228.                                                         DA--;
  229.                                                         if(DA<1)
  230.                                                         {
  231.                                                                 DA=1;
  232.                                                         }
  233.                                                         Flag=1;
  234.                                                 }
  235.                                                 if(Flag==0)
  236.                                                 {
  237. ……………………

  238. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
新建文件夹.zip (25.95 KB, 下载次数: 189)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:73710 发表于 2018-4-29 07:50 来自手机 | 只看该作者
感谢楼主分享
回复

使用道具 举报

板凳
ID:366558 发表于 2018-7-6 21:45 | 只看该作者
我为了这个特意注册了一个账号
回复

使用道具 举报

地板
ID:366558 发表于 2018-7-6 21:46 | 只看该作者
谢谢楼主的分享,辛苦了
回复

使用道具 举报

5#
ID:366558 发表于 2018-7-7 23:39 | 只看该作者
想知道整个工程文件,楼主愿意分享嘛?
回复

使用道具 举报

6#
ID:256945 发表于 2019-2-25 09:35 | 只看该作者
有整个工程文件吗,楼主
回复

使用道具 举报

7#
ID:596446 发表于 2020-3-14 17:10 | 只看该作者
乱码?
回复

使用道具 举报

8#
ID:738231 发表于 2020-4-28 09:05 | 只看该作者
楼主,这个电子负载的能实现的参数范围是多少呢,求指教
回复

使用道具 举报

9#
ID:742301 发表于 2020-5-19 00:37 来自手机 | 只看该作者
楼主,求整个工程文件
回复

使用道具 举报

10#
ID:742301 发表于 2020-5-19 02:05 来自手机 | 只看该作者
qweasd2684 发表于 2018-7-6 21:46
谢谢楼主的分享,辛苦了

你们有工程文件吗

回复

使用道具 举报

11#
ID:766752 发表于 2020-6-1 17:45 | 只看该作者
很有用 已经学习
回复

使用道具 举报

12#
ID:628703 发表于 2020-6-2 16:17 | 只看该作者
感谢楼主分享,好东西!
回复

使用道具 举报

13#
ID:235332 发表于 2021-5-30 11:07 | 只看该作者
代码不完整,楼主能否再发下
回复

使用道具 举报

14#
ID:1048397 发表于 2022-10-25 15:42 | 只看该作者
好简洁的程序,多谢楼主分享,收藏了慢慢读。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表