找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6423|回复: 9
收起左侧

简易单片机数控直流电源仿真设计 带源码

[复制链接]
ID:212598 发表于 2017-6-19 15:02 | 显示全部楼层 |阅读模式
1 设计任务
设计出一个基于51单片机的有一定输出电压范围和功能的数控电源。
0.png
2 设计要求
(1)输出电压:范围0~+9.9V,步进0.1V,纹波不大于10mV;
(2)输出电压值由LCD显示;
(3)由“+”、“-”两键分别控制输出电压步进增减;
(4)输出电压可预置在0~9.9V之间的任意一个值;
5)自制键盘设置电压值。
0.png 0.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<math.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int


  5. sbit rs=P2^4;
  6. sbit rw=P2^5;
  7. sbit ea=P2^6;

  8. uchar num,i,key,j=0;
  9. float a2;
  10. uchar keyscan(void);


  11. uchar code table[6]="Please";
  12. uchar code table1[16]=" enter letter...";
  13. uchar code table2[16]="0123456789abcde.";
  14. float  table3[6];
  15. uchar code table4[8]="volt(v):";
  16. uchar code table5[6]="error!";
  17. uchar  table6[6];

  18. void delay(uint z)
  19. {
  20. uint x,y;
  21. for(x=z;x>0;x--)
  22.   for(y=110;y>0;y--);
  23. }

  24. void write_com(uchar com)
  25. {
  26. rs=0;           
  27. rw=0;         
  28. P0=com;
  29. delay(5);
  30. ea=1;               
  31. delay(5);
  32. ea=0;
  33. }
  34. void write_date(uchar date)
  35. {
  36. rs=1;               
  37. rw=0;
  38. P0=date;
  39. delay(5);
  40. ea=1;
  41. delay(5);
  42. ea=0;
  43. }
  44. void disvol()
  45. {
  46.                 write_com(0x80+0x40);                 
  47.                 for(num=0;num<8;num++)         
  48.                    {
  49.                     write_date(table4[num]);
  50.                     delay(10);
  51.                    }               
  52. }
  53.   
  54. void init()
  55. {
  56. delay(5);
  57. write_com(0x38);
  58. write_com(0x0c);
  59. write_com(0x06);
  60. write_com(0x01);
  61. write_com(0x80);
  62. for(num=0;num<6;num++)
  63.   {
  64.    write_date(table[num]);         
  65.    delay(20);
  66.   }
  67. write_com(0x80+0x40);   
  68. for(num=0;num<0x10;num++)         
  69.   {
  70.     write_date(table1[num]);   
  71.     delay(20);
  72.    }
  73. }

  74. void diserr()
  75. {
  76.            write_com(0x80+0x40);        
  77.            for(num=0;num<6;num++)
  78.            {
  79.             write_date(table5[num]);        
  80.                 delay(20);
  81.            }
  82.            delay(2000);        
  83. }

  84. void he_zhi()
  85. {
  86. uint a1,a3,c11,c12;
  87. float b1,b2,b3,b4,c1,c2,h;
  88. if(table3[0]!='.')           
  89. {
  90.          if(!table3[1])
  91.          {
  92.                  if(j==1)
  93.                 {
  94.                          table3[1]='.';
  95.                 }
  96.          }

  97.          if(!table3[2])
  98.          {
  99.                  if(j==2)
  100.                 {
  101.                         table3[2]='.';
  102.                 }
  103.          }

  104. if(table3[1]=='.')
  105.          {         
  106.                  b1=table3[0];
  107.                  b2=table3[2]/10;
  108.                  b3=table3[3]/100;
  109.                  h=b1+b2+b3;
  110.                  a2=h*256/10;
  111.                  a3=a2;
  112.                  a1=a3+1;
  113.                  c1=a2-a3;
  114.                  c2=a1-a2;
  115.                  c11=1000*c1;
  116.                  c12=1000*c2;
  117.                  if(c11>c12)
  118.                  {
  119.                  P1=a1;
  120.                  }
  121.                  else
  122.                  {
  123.                   P1=a3;
  124.                  }
  125.                
  126.                  if(j==1)
  127.                  {
  128.                          write_com(0x80+0x49);        
  129.                  }                                          
  130.                  if(j==3)
  131.                  {
  132.                          write_com(0x80+0x4b);
  133.                  }
  134.                  if(j==4)
  135.                  {
  136.                          write_com(0x80+0x4c);
  137.                  }
  138.                   
  139.          }

  140. else if(table3[2]=='.')
  141.          {         
  142.                   b1=table3[0]*10;
  143.                   b2=table3[1];
  144.                   b3=table3[3]/10;
  145.                   b4=table3[4]/100;
  146.                   h=b1+b2+b3+b4;
  147.                   if(h<=10)
  148.           {
  149.                                  a2=h*256/10;
  150.                                  a3=a2;
  151.                                  a1=a3+1;
  152.                                  c1=a2-a3;
  153.                                  c2=a1-a2;
  154.                                  c11=1000*c1;
  155.                                  c12=1000*c2;
  156.                                  if(c11>c12)
  157.                                  {
  158.                                          P1=a1;
  159.                                  }
  160.                                  else                 
  161.                                  {
  162.                                          if(a3==256)  
  163.                                          {
  164.                                              P1=255;
  165.                                          }
  166.                                          else                  
  167.                                          {
  168.                                                     P1=a3;
  169.                                          }
  170.                                  }                                 
  171.                  if(j==2)
  172.                  {
  173.                          write_com(0x80+0x4a);        
  174.                  }

  175.         }
  176.                         
  177.                         
  178.                         
  179.                          else
  180.                           {
  181.                                           write_com(0x01);
  182.                                         diserr();               
  183.                           }        
  184.         }
  185.         else
  186.                 {
  187.                         write_com(0x01);
  188.                         diserr();        
  189.                 }
  190. }

  191.         if(table3[0]=='.')
  192.         {
  193.            write_com(0x01);
  194.            diserr();               
  195.         }
  196.         
  197. }




  198. void qingchu(uchar p)
  199. {        
  200.         uchar z;
  201.         for(z=0;z<=5;z++)
  202.         {
  203.         table3[z]=p;
  204.         }
  205. }



  206. void main()
  207. {
  208. init();

  209. delay(4500);
  210. write_com(0x01);
  211. write_com(0x80+0x40);
  212. write_com(0x0f);
  213. disvol();
  214. i=0x80+0x48;

  215. while(1)
  216. {
  217. key=keyscan();                          
  218. delay(100);
  219. switch(key)
  220. {         
  221.   case 0xee:write_com(i);
  222.            write_date(table2[0]);table3[j]=0;j++;         //  table2[16]="0123456789abcde."
  223.                         i++;
  224.                         break;//0
  225.   case 0xde:write_com(i);
  226.             write_date(table2[1]);table3[j]=1;j++;
  227.                         i++;
  228.                         break;//1
  229.   case 0xbe:write_com(i);
  230.             write_date(table2[2]);table3[j]=2;j++;
  231.                         i++;break;//2
  232.   case 0x7e:write_com(i);
  233.             write_date(table2[3]);table3[j]=3;j++;
  234.                         i++;break;//3
  235.   case 0xed:write_com(i);
  236.             write_date(table2[4]);table3[j]=4;j++;
  237.                         i++;break;//4
  238.   case 0xdd:write_com(i);
  239.             write_date(table2[5]);table3[j]=5;j++;
  240.                         i++;break;//5
  241.   case 0xbd:write_com(i);
  242.             write_date(table2[6]);table3[j]=6;j++;
  243.                         i++;break;//6
  244.   case 0x7d:write_com(i);
  245.             write_date(table2[7]);table3[j]=7;j++;
  246.                         i++;break;//7
  247.   case 0xeb:write_com(i);
  248.             write_date(table2[8]);table3[j]=8;j++;
  249.                         i++;break;//8
  250.   case 0xdb:write_com(i);
  251.             write_date(table2[9]);table3[j]=9;j++;
  252.                         i++;break;//9
  253.   case 0xe7:write_com(i);
  254.             write_date(table2[15]);table3[j]='.';j++;
  255.                         i++;break;

  256.   case 0xbb:write_com(i);
  257.                          table3[j]=table3[j]+0.1 ;
  258. ……………………

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

所有资料51hei提供下载:
电子综合实验1.zip (119.26 KB, 下载次数: 192)
回复

使用道具 举报

ID:222497 发表于 2017-7-26 11:10 | 显示全部楼层
很给力!
回复

使用道具 举报

ID:242547 发表于 2018-3-19 22:02 | 显示全部楼层
怎么运行时发生错误啊
回复

使用道具 举报

ID:242547 发表于 2018-3-19 22:09 | 显示全部楼层
楼主怎么仿真出错啊
回复

使用道具 举报

ID:92810 发表于 2018-11-4 23:01 | 显示全部楼层
学习一波,谢谢楼主分享的好东西了
回复

使用道具 举报

ID:92810 发表于 2018-11-4 23:02 | 显示全部楼层
谢谢分享了
回复

使用道具 举报

ID:92810 发表于 2018-11-4 23:07 | 显示全部楼层
不行啊
回复

使用道具 举报

ID:691056 发表于 2020-2-8 12:01 | 显示全部楼层
仿真出错了
回复

使用道具 举报

ID:929468 发表于 2021-5-30 14:10 | 显示全部楼层
为什么压缩包里打不开程序
回复

使用道具 举报

ID:319039 发表于 2023-12-9 18:33 | 显示全部楼层
不好用,就做了设置显示,没有做电源控制
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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