找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机直流电子负载程序+EBpro上位机工程

[复制链接]
跳转到指定楼层
楼主
直流简易电子负载

ADC+负载+按键 +485+串口_最终版程序

单片机源程序如下:
  1. #include        "config.h"
  2. #include        "adc.h"
  3. #include        "delay.h"
  4. #include        "soft_uart.h"
  5. #include  "lcd.h"
  6. #include  "PWM.h"
  7. #include  "intrins.h"
  8. #include  "usart.h"
  9. /*************        按键******************************************************/
  10. sbit k1=P3^6;         //定义P3.3口是k1
  11. sbit k2=P3^5;         //定义P3.3口是k1
  12. sbit k3=P3^4;         //定义P3.3口是k1
  13. sbit k4=P3^3;         //定义P3.3口是k1
  14. sbit fan=P3^2;         //定义P3.3口是k1

  15. int results=0;
  16. int DUTY,ierr=0,resulti=0;
  17. int num=0;
  18. int resultv=0;
  19. int cusor=0;
  20. int send_mode=0,receive_mode=0;


  21. void modbushandle1(void);
  22. void modbushandle2(void);
  23. void modbushandle3(void);
  24. void modbushandle4(void);
  25. void modbushandle5(void);
  26. void modbushandle6(void);
  27. void Uart3s(void);
  28. extern u8 ch;
  29. extern int modflag;
  30. extern u8 mtx[100],mrx[100];
  31. extern u16 send_I_V_P[50];   //4 发送电流电压功率值
  32. extern u16 bitsend[50];     //2 读过压保护状态
  33. extern u16 bitworkflag[50]; //1 5 启停标志位
  34. extern u16 set_current[50];   //3 6设定电流值

  35. unsigned int set_dis[4]={0,0,0,0};
  36. unsigned int a[9];//={0,0}
  37. unsigned int i;//,resultsvol,resultscur, u2summean,i2summean,u2sum,i2sum,u2num;
  38. extern unsigned char  receiver_buf;
  39. void display();      //显示程序声明
  40. void keyscan();

  41. void voltage_test()
  42. {
  43.    if(resultv>5500)
  44.          {          
  45.                   bitworkflag[0]=0;
  46.             DUTY=0;
  47.                   bitsend[0]=1;
  48.          }
  49. }

  50. void main()
  51. {
  52.                 P2M1=0X00;
  53.           P2M0=0XFF;
  54.           P0M1=0X00;
  55.           P0M0=0XFF;
  56.           P3M1=0X00;
  57.           P3M0=0XFF;
  58.                 P4M1=0X00;
  59.           P4M0=0XFF;
  60.           P5M1=0X00;
  61.           P5M0=0XFF;
  62.           P6M1=0X00;
  63.           P6M0=0XFF;
  64.                 P7M1=0X00;
  65.           P7M0=0XFF;       
  66.           P0M0=0xfe;
  67.        
  68.           PWMInit();
  69.                 LcdInit();
  70.                 delay_ms(5);
  71.           ADC_config();
  72.           fan=0;//风扇
  73.                 DUTY=0;
  74.     UartInit();
  75.                 ch=1;
  76.                
  77.                 send_I_V_P[0]=7; //4
  78.                 send_I_V_P[1]=15;
  79.                 send_I_V_P[2]=200;
  80.            bitworkflag[0]=0;  // 1 5
  81.                 set_current[0]=1000;// 3 6
  82.                 bitsend[0]=0;
  83.   while(1)
  84.         {                  
  85.                 display();       
  86.                 keyscan();
  87.                 voltage_test();

  88.                 if(crcok==1)  
  89.                  {
  90. //                         DisplayOneChar(0,0,bitworkflag[0]+0x30);
  91.      crcok = 0;
  92.                  if(mrx[0]==6)
  93.                  {
  94.                          switch (mrx[1])
  95.                          {
  96.                                         case 1:modbushandle1(); //读取启停标志
  97.                                                 break;
  98.                                        
  99.                                         case 2:modbushandle2(); //读取过流保护的标志位
  100.                                                 break;
  101.                                        
  102.                                         case 3:modbushandle3(); //读取设定电流值
  103.                                                 break;
  104.                                        
  105.                                         case 4:modbushandle4(); //读电流电压功率
  106.                                                 break;
  107.                        
  108.                                         case 5:modbushandle5();  //启动
  109.                                                 break;
  110.                                        
  111.                                         case 6:modbushandle6(); //设定电流值
  112.                                                 break;
  113.                          }  
  114.       }
  115.                 }
  116.                 switch (bitworkflag[0])       
  117.                         {
  118.                                 case 0:
  119.                                         PWM2output(0);
  120.                                   fan=0;
  121.                                         DisplayListChar(14,0,"OF");
  122.                                 break;
  123.                                 case 1:
  124.                                   fan=1;
  125.                                         PWM2output(DUTY);
  126.                                         DisplayListChar(14,0,"ON");  
  127.                           break;
  128.                         }               
  129.                 for(i=0;i<2;i++)
  130.                 {
  131.                    results = Get_ADC10bitResult(i);        //参数0~7,查询方式做一次ADC, 返回值就是结果, == 1024 为错误               

  132.                          if(i==1)
  133.                           {
  134.                                   results=results*9.77;//9.98 放大2倍
  135.                                    resulti=results;
  136.                                   send_I_V_P[0]=        resulti;
  137.                           }
  138.                                 else
  139.                                 {
  140.                                          if(resulti>1050&resulti<1970)
  141.                                                                  results=results*9.96;//9.98 放大2倍
  142.                                          else if(resulti>=1970&resulti<2450)
  143.                                                                  results=results*9.98;//9.98 放大2倍
  144.                                          else if(resulti>=2450&resulti<3200)
  145.                                                                  results=results*10.14;//9.98 放大2倍
  146.                                          else
  147.                                                  results=results*9.68;//9.705 放大2倍
  148.                        
  149.                                         resultv=results;
  150.                                   send_I_V_P[1]=resultv;
  151.                     }
  152.              a[0+i*4]=results/1000 + '0';
  153.              a[1+i*4]=results%1000/100 + '0';
  154.              a[2+i*4]=results%100/10 + '0';
  155.              a[3+i*4]=results%10 + '0';                
  156.                          DisplayOneChar(0+i*7,1,a[0+i*4]);
  157.                    DisplayListChar(1+i*7,1,".");
  158.                    DisplayOneChar(2+i*7,1,a[1+i*4]);
  159.                    DisplayOneChar(3+i*7,1,a[2+i*4]);
  160.                    DisplayOneChar(4+i*7,1,a[3+i*4]);  
  161.                          delay_ms(250);
  162.                  }
  163.      ierr = set_current[0]-resulti;
  164.                  if(ierr>300)ierr=300;
  165.                  if(ierr<-300)ierr=-300;                 
  166.                  DUTY+=(ierr)/30;
  167.         }
  168. }

  169. void display()
  170. {   
  171.                    DisplayListChar(5,1,"v");       
  172.                    DisplayListChar(13,1,"A");
  173.          /***********显示设定电流值**********/
  174.                    set_dis[0]=set_current[0]/1000 + '0';
  175.              set_dis[1]=set_current[0]%1000/100 + '0';
  176.              set_dis[2]=set_current[0]%100/10 + '0';
  177.              set_dis[3]=set_current[0]%10 + '0';
  178.          
  179.                    DisplayOneChar(2,0,set_dis[0]);
  180.                    DisplayListChar(3,0,".");
  181.                    DisplayOneChar(4,0,set_dis[1]);
  182.                          DisplayListChar(5,0,"A");
  183.           /***********显示光标**********/
  184.                          if(cusor==1)
  185.                          {
  186.                                 DisplayListChar(2,0," ");
  187.                                 delay_ms(100);  
  188.                     DisplayOneChar(2,0,set_dis[0]);
  189.                                 delay_ms(100);   
  190.                    }
  191.                         else if(cusor==2)
  192.                          {
  193.                                 DisplayListChar(4,0," ");
  194.                                 delay_ms(100);
  195.                                 DisplayOneChar(4,0,set_dis[1]);
  196.                                 delay_ms(100);
  197.                          }       
  198. }       

  199.   void keyscan()
  200. {
  201. //*******************************k1普通显示******************************************//          
  202.         if(k1==0)                  //检测按键K1是否按下
  203.         {       
  204.                 delay_ms(2);   //消除抖动 一般大约10ms
  205.                 if(k1==0)         //再次判断按键是否按下
  206.                 {
  207.                         if(cusor==1)
  208.                         {
  209.                                 set_current[0]+=1000;
  210.                                 if(set_current[0]>=4000)
  211.                                         set_current[0]=0;
  212.                         }
  213.                         else if(cusor==2)
  214.                         {
  215.                                 set_current[0]+=100;
  216.                                 if(set_current[0]>=4000)
  217.                                         set_current[0]=10;
  218.                         }
  219.                 }
  220.                 while(!k1);         //检测按键是否松开
  221.         }
  222. //******************************k2**写*****************************************//       
  223.         if(k2==0)
  224.         {
  225.                 delay_ms(2);  //消抖处理
  226.                 if(k2==0)
  227.                 {       
  228.                         if(cusor==1)
  229.                         {
  230.                                 set_current[0]-=1000;
  231.                                 if(set_current[0]<=0)
  232.                                         set_current[0]=4000;
  233.                         }
  234.                         else if(cusor==2)
  235.                         {
  236.                                 set_current[0]-=100;
  237.                                 if(set_current[0]<=0)
  238.                                         set_current[0]=4000;
  239.                         }

  240.                 }
  241.                 while(!k2);
  242.         }
  243. //***************************k3*读**********************************************//       
  244.         if(k3==0)
  245.         {
  246.                 delay_ms(2);  //消抖处理
  247.                 if(k3==0)
  248.                 {         
  249.                         cusor++;
  250.                         if(cusor>=3)
  251.                                 cusor=0;               
  252.                 }  
  253.                 while(!k3);
  254.         }               
  255. //***************************k4*启动**********************************************//
  256.                 if(k4==0)
  257.         {
  258.                 delay_ms(2);  //消抖处理
  259.                 if(k4==0)
  260.                 {         
  261.                         bitworkflag[0]++;
  262.                         if(bitworkflag[0]>=2)
  263.                                 bitworkflag[0]=0;
  264.                 }  
  265.                 while(!k4);
  266.         }       
  267. }
复制代码

所有资料51hei提供下载:
电子负载固件以及上位机.rar (1.42 MB, 下载次数: 48)


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

使用道具 举报

沙发
ID:1 发表于 2019-6-7 05:35 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

板凳
ID:55591 发表于 2019-7-12 06:49 | 只看该作者
看着不错 不错
回复

使用道具 举报

地板
ID:56665 发表于 2019-7-12 19:30 | 只看该作者
有程序没有原理图不知道怎么回事。
回复

使用道具 举报

5#
ID:140370 发表于 2019-8-2 13:12 | 只看该作者
感谢分享,MODBUS始终静不下心来仔细看一一看。
回复

使用道具 举报

6#
ID:244512 发表于 2019-10-22 17:56 | 只看该作者
能分享原理图?
回复

使用道具 举报

7#
ID:827343 发表于 2020-10-9 17:39 | 只看该作者
电子负载怎么校正
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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