找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4132|回复: 1
收起左侧

51单片机数控稳压电源设计报告与仿真程序

[复制链接]
ID:189104 发表于 2017-7-22 15:07 | 显示全部楼层 |阅读模式
基于51的数控直流稳压电源的设计资料全套 分享给大家
0.png

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

数控稳压电源设计报告

班级:电信10-1班   学号:3100718116              姓名:罗远锋

此次数控稳压电源设计我主要通过51单片机控制输出来控制电源的电压和显示。主流程图如下。
1.001.jpg
主要输出部分
1.002.jpg
1.003.jpg
加减置数部分,通过对4X4矩阵键盘的设置,可任意置数,加减, 自动步进,输出波形。
1.004.jpg
1.005.jpg
预置数部分 通过拨码开关来预置。
1.006.jpg
显示部分 通过单片机对两位数码管进行动态扫描
1.007.jpg
1.008.jpg
1.009.jpg
1.010.jpg
1.011.jpg
1.012.jpg



单片机源程序如下:
  1. #include<regx51.h>
  2. #include<math.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar aa,bb,cc,dd,jj,ii,jjj,iii,key,j;
  6. uchar time1=0;
  7. sbit led1=P2^0;
  8. sbit led2=P2^1;
  9. sbit ce=P2^4;
  10. #define timer0_count 0xfc18//定时器初值,设置time0 1/1000秒中断一次
  11. const seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管的显示
  12. const seg_point[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//有小数点的数码管显示
  13. uchar scan1;//用来分别显示2个数码管
  14. uchar scan2;
  15. uchar counter[2]={0xf1,0xf2};
  16. uchar vout=0; //j_片选,vout_电压输出

  17. static void timer0_initialize(void)//timer0的初始化
  18. //定时器的初始化程序
  19. {
  20.         EA=0;        //中断控制器IE--停止接受中断  
  21.                 TR0=0;        //停止计时
  22.                 TMOD=0x01;     //设置工作方式为1
  23.                 TL0=(timer0_count & 0x00ff);
  24.             TH0=(timer0_count>>8);  //设置time0 初值        
  25.                 PT0=1;    //设置timer0高优先级
  26.                 ET0=1;          //允许timer0中断
  27.                 TR0=1;           //开始计时
  28.                 EA=1;           //开所有中断
  29. }

  30. void delay(uint t) //tms的延时
  31. {   
  32.         uchar i;
  33.         uint j;
  34.     for(j=0;j<t;j++)
  35.                 for(i=0;i<40;i++);
  36. }
  37. void shuc(void)
  38. {         
  39.          uchar nn;
  40.          vout=2*(scan2*10+scan1);//输出的数字量
  41.         P1=vout;
  42.         for(nn=0;nn<250;nn++)
  43.                 ;
  44.                 nn=0;//输出是存在D/A转换时间差所以要延时

  45. }  
  46. void shaom(void)
  47. {
  48.          P3=0x0f;//扫描是否有按键按下
  49.      if((P3&0x0f)!=0x0f)
  50.      dd=0;
  51.          else
  52.          dd=1;
  53. }
  54. void zdbj(void) //自动步进
  55. {
  56.         uchar rr;
  57.         jj=scan2;
  58.         ii=scan1;
  59.         shaom();
  60.         for(;jj<10;jj++)
  61.     {
  62.             for(;ii<10;ii++)
  63.                 {
  64.                          if(dd)
  65.                                  {
  66.                                          scan1=ii;
  67.                                          scan2=jj;
  68.                                         shuc();
  69.                                          for(rr=0;rr<250;rr++)
  70.                                         {
  71.                                                 shaom();
  72.                                                 if(dd)        
  73.                                                  delay(70);
  74.                                                 else
  75.                                                 break;
  76.                                         }
  77.                                          if(jj==9&&ii==9)
  78.                                          {
  79.                                                  ii=0;
  80.                                                  jj=0;
  81.                                          }
  82.         
  83.                                  }
  84.                         else
  85.                          {
  86.                                  jj=10;
  87.                                  ii=10;
  88.                          }
  89.                 }
  90.                 ii=0;
  91.     }
  92.         jj=0;
  93.         shaom();
  94.         for(;dd==0;)
  95.         shaom();

  96. }

  97. void sjb(void)        //三角波
  98. {
  99.         uchar max;
  100.         max=vout;
  101.         shaom();
  102.         for(;dd;)
  103.          {
  104.                    for(iii=0;iii<=max;iii=iii+2)
  105.                    {
  106.                           P1=iii;
  107.                         shaom();
  108.                          delay(10);
  109.                            if(dd==0)
  110.                  break;
  111.                 }
  112.                 if(dd==0)
  113.             break;
  114.                 for(;iii>0;iii=iii-2)
  115.                 {
  116.                         P1=iii;
  117.                         shaom();
  118.                         delay(5);
  119.                         if(dd==0)
  120.                         break;
  121.                 }
  122.                 if(dd==0)
  123.             break;
  124.           }
  125.            P1=max;
  126.          shaom();
  127.          for(;dd==0;)
  128.         shaom();
  129. }
  130. unsigned char keyscan(void)  //键盘扫描函数,使用行列反转扫描法
  131. {
  132.          unsigned char cord_h,cord_l;//行列值中间变量
  133.         P3=0x0f;          //行线输出全为0
  134.          cord_h=P3&0x0f;     //读入列线值
  135.          if(cord_h!=0x0f)    //先检测有无按键按下
  136.          {
  137.                   delay(70);        //去抖
  138.                   if((P3&0x0f)!=0x0f)
  139.                   {
  140.                     cord_h=P3&0x0f;  //读入列线值
  141.                     P3=cord_h|0xf0;  //输出当前列线值
  142.                     cord_l=P3&0xf0;  //读入行线值                                                                                                   ;;
  143.                         while((P3&0xf0)!=0xf0);//等待松开并输出
  144.                          {
  145.                                  time1=time1+1;
  146.                             return(cord_h+cord_l);//键盘最后组合码值
  147.                          }
  148.                   }
  149.          }return(0);     //返回该值
  150. }
  151. void timer0_isr(void) interrupt 1   //timer0中断
  152. //用于LED数码管的动态显示
  153. {
  154.         
  155.          TR0=0;    //停止时钟0
  156.         P2=counter[j];
  157.         switch(j)
  158.         {
  159.                  case 0:P0=seg[scan1];break;                                                                                 
  160.                  case 1:P0=seg_point[scan2];break;
  161.                          default:break;        //j为其他情况是跳出循环
  162.         }
  163.         j++;
  164.         if(j==2)
  165.         j=0;
  166.     TL0=(timer0_count & 0x00ff);
  167.         TH0=(timer0_count>>8);  //设置time0 初值
  168.         TR0=1;         //开时钟                                         
  169. }
  170.                                              
  171. void main(void)
  172. {                 
  173.         ce=0;
  174.         delay(5);   
  175.         scan1=(P3/2)%10;
  176.         scan2=P3/20;
  177.         ce=1;
  178.         delay(5);
  179.         shuc();

  180.         timer0_initialize();        //定时器初始化用于LED显示
  181.     do
  182.    {     
  183.             key=keyscan();
  184.                 if(time1==1)
  185.                 switch( key)
  186.         {        
  187.                         
  188.                         case 0xee:aa=1;break;//1 按下相应的键显示相对应的码值
  189.                  case 0xed:aa=2;break;
  190.                  case 0xeb:aa=3;break;
  191.                  case 0xe7:aa=4;break;//4
  192.                  case 0xde:aa=5;break;//5
  193.                        case 0xdd:aa=6;break;//5
  194.                           case 0xdb:aa=7;break;//6
  195.                             case 0xd7:aa=8;break;//7
  196.                           case 0xbe:aa=9;break;//8
  197.                           case 0xbd:aa=0;break;//9
  198.                      case 0xbb:time1--;break;//确认
  199.                            case 0xb7: //三角波
  200.                         {
  201.                         time1=0;
  202.                         sjb();
  203.                         }
  204.                         break;
  205.                            case 0x7e:                //加
  206.                     {
  207.                                 time1=0;
  208.                              scan1++;
  209.                         if(scan1==10)
  210.                                 {
  211.                                         scan1=0;
  212.                                     scan2++;
  213.                                         if(scan2==10)
  214.                                         scan2=0;
  215.                                 }
  216.                                 shuc();
  217.                         }break;//c
  218.                           case 0x7d:                //减
  219.                     {
  220.                                 time1=0;
  221.                         scan1--;                                    
  222.                                 if(scan1==-1)
  223.                                 {         
  224.                                         scan1=9;
  225.                                         scan2--;
  226.                                         if(scan2==-1)
  227.                                         scan2=9;
  228.                                 }
  229.                                 shuc();
  230.                         }break;
  231.                               case 0x7b:                //自动步进
  232.                         {
  233.                                 time1=0;
  234.                     zdbj();
  235.                         }break;//e
  236.                           case 0x77: time1--;break;        
  237.                   }
  238.                                                            
  239.                 if(time1==2)
  240.                 switch( key)
  241.                  {        
  242.                
  243.                         case 0xee:bb=1;break;//0 按下相应的键显示相对应的码值
  244.                          case 0xed:bb=2;break;//1
  245.                           case 0xeb:bb=3;break;//2
  246.                      case 0xe7:bb=4;break;//3
  247.                      case 0xde:bb=5;break;//4
  248.                      case 0xdd:bb=6;break;//5
  249.                      case 0xdb:bb=7;break;//6
  250.                           case 0xd7:bb=8;break;//7
  251.                           case 0xbe:bb=9;break;//8
  252.                           case 0xbd:bb=0;break;//9
  253.                           case 0xbb:                //确认
  254.                         {
  255.                              scan2=0;
  256.                              scan1=aa;
  257.                                    time1=0;
  258.                                  shuc();
  259.                         }break;
  260.                           case 0xb7://三角波
  261.                         {
  262.                         time1=0;
  263.                         sjb();
  264.                         }
  265.                         break;
  266.                           case 0x7e:                //加
  267.                         {
  268.                                 time1=0;
  269.                         scan1++;
  270.                         if(scan1==10)
  271.                                 {
  272.                                         scan1=0;
  273.                                     scan2++;
  274.                                         if(scan2==10)
  275.                                         scan2=0;
  276.                                 }
  277.                                 shuc();
  278.                         }break;//c
  279.                      case 0x7d:                //减   
  280.                         {
  281.                                 time1=0;
  282.                               scan1--;                                    
  283.                                 if(scan1==-1)
  284.                                 {                  
  285.                                         scan1=9;
  286.                                         scan2--;
  287.                                         if(scan2==-1)
  288.                                          scan2=9;
  289.                                 }
  290.                                 shuc();
  291.                         }break;
  292.                           case 0x7b:                //自动步进
  293.                     {
  294.                                 time1=0;
  295.             zdbj();
  296.                         }break;//e
  297.                           case 0x77: time1--;break;
  298.                  }
  299.                 ;
  300.                 if(time1>2)
  301.                  switch( key)
  302.                  {        
  303.                
  304.                           case 0xee:time1--;break;//0 按下相应的键显示相对应的码值
  305.                           case 0xed:time1--;break;//1
  306.                           case 0xeb:time1--;break;//2
  307.                           case 0xe7:time1--;break;//3
  308.                           case 0xde:time1--;break;//4
  309.                           case 0xdd:time1--;break;//5
  310.                           case 0xdb:time1--;break;//6
  311.                           case 0xd7:time1--;break;//7
  312.                           case 0xbe:time1--;break;//8
  313.                           case 0xbd:time1--;break;//9
  314.                           case 0xbb:                //确认                 
  315.                         {   
  316.                                 time1=0;
  317.                             scan2=aa;
  318.                                   scan1=bb;
  319.                                   time1=0;
  320.                                 shuc();
  321.                         }break;
  322.                           case 0xb7://三角波
  323. ……………………

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

所有资料51hei提供下载:
proteus数控稳压电源.zip (489.83 KB, 下载次数: 106)
回复

使用道具 举报

ID:299955 发表于 2018-4-3 15:39 来自手机 | 显示全部楼层
值得学习谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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