找回密码
 立即注册

QQ登录

只需一步,快速开始

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

简易单片机数控直流稳压电压源设计

[复制链接]
跳转到指定楼层
楼主
本系统以直流电压源为核心,ATC89S52 单片机为主控制器,通过键盘来设置直流电源的输出电压,设置步进等级可达0.1V,输出电压范围为0—9.9V,输出电流为500mA,并 由数码管显示输出电压值。由“+”、“-”两键分别控制输出电压步进增减,并且输出电 压可预置在0~9.9V 之间的任意一个值。扩展输出电压种类后可输出三角波、梯形波、锯齿波、方波等波形。本系统由单片机程控输出数字信号,经过D/A 转换器(DA0832)输出模拟电流量,再经过运算放大器隔离放大输出模拟电压量,控制稳压芯片LM7805 电压的变化而输出不同的电压。实际测试结果表明本系统输出电压值精确度较高。本系统实际应用于需要高稳定度小功率恒压源的领域。


. 基本功能实现:
(1) 可输出电压:范围0~+9.9V,步进0.1V,纹波不大于10mV;
(2) 可输出电压值由数码管显示;
(3) 由“+”、“-”两键分别控制输出电压步进增减;
(4) 为实现上述几部件工作,自制一稳压直流电源,输出输出± 15v,+5v;

2.扩展功能与创新:
(1)输出电压可预置在0~9.9V之间的任意一个值;
   (2)扩展输出电压种类(比如三角波等);
(3)最大输出电流可达1.5A;
(4)负载电流在0~1.5A间变化时输出电压的变化量不超过0.1V;      
(5)设计并制作一个电子负载,用于测试上述电源的负载调整率,电子负载恒定电流的可调范围为0.1A~1.5A。


单片机源程序如下:
#include<reg52.h>
#define uint unsigned int      //无符号字符  8位
#define uchar unsigned char    //无符号整数  16位
sbit dula=P2^6;        //锁存器段选
sbit wela=P2^7;        //锁存器位选
sbit lcdrs=P3^1;        //1602数据命令选择
sbit lcden=P3^0;       //1602使能信号端
sbit key1=P2^3;        //+键
sbit key2=P2^2;        //-键
sbit key3=P2^1;        //波产生键
sbit key0=P2^0;        //功能键
sbit wr_da=P2^5;        //DAC选通
uchar num,num0,num1,zsys,xsys,bxsz;
uchar code table_x[]={    //编码表  无点数码管显示      
0x3f,0x0c,0x76,0x5e,0x4d,0x5b,0x7b,0x0f,0x7f,0x5f};
uchar code table_z[]={    //编码表 带点数码管显示
0xbf,0x8c,0xf6,0xde,0xcd,0xdb,0xfb,0x8f,0xff,0xdf};

void delay(uint z);  

void display_bjys(uchar zsys,uchar xsys);
void display_bxsz(uchar bxsz);
void trigle();
void trap();
void saw();
void square();
void keycan_bjys();
void keycan_bxsz();
void write_com(uchar com);
void write_date(uchar date);
void init_kjhm();
void init_bjhm();
void init_yshm();
void init_bxxzhm();
void init_trigle();
void init_trap();
void init_saw();
void init_square();
void init();
void main()
{  init_kjhm();
  init();          //初始化子程序
  while(1)
    {     dula=1;
      P1=0x3f;
      dula=0;
      wela=1;
      P1=0xf0;
      wela=0;
      if(key1==0||key2==0)
        {    if(key0==0)
            init_bjhm();
          if(key0!=0)
            init_yshm();
          while(1)
            {  keycan_bjys();
              if(key3==0)
                {  dula=1;
                  P1=0xff;
                  dula=0;
                  wela=1;
                  P1=0xff;
                  wela=0;}
              if(key3==0)
                break;
            }
        }      
         if(key3==0)
        {  init_bxxzhm();
          while(1)
            {  keycan_bxsz();
              if(key1==0||key2==0)
                {  dula=1;
                  P1=0xff;
                  dula=0;
                  wela=1;
                  P1=0xff;
                  wela=0;
                }
              if(key1==0||key2==0)
                break;
            }
        }     
    }   
}
void delay(uint z)      //延时函数
{  uint x,y;
  for(x=z;x>0;x--)
    for(y=110;y>0;y--);
}
void display_bjys(uchar zsys,uchar xsys)  //预设&步进  数
{    dula=1;
    P1=table_z[zsys];
    dula=0;
    P1=0xff;
    wela=1;
    P1=0xfe;
    wela=0;
    delay(1);
    dula=1;
    P1=table_x[xsys];
    dula=0;
    P1=0xff;
    wela=1;
    P1=0xfd;
    wela=0;
    delay(1);

}
void display_bxsz(uchar bxsz)  //波形设置   数码管扫描子函数
{    dula=1;
    P1=table_x[bxsz];
    dula=0;
    P1=0xff;
    wela=1;
    P1=0xf0;
    wela=0;
    delay(1);
}

void keycan_bjys()          //预设&步进   按键扫描
{  if(key1==0)           //按key1键加数
    {
      delay(5);
      if(key1==0)
        {  num++;
          if(num==100)
            num=0;
        }
      while(!key1);
      delay(5);
      while(!key1);
    }
    if(key2==0)         //按key2键减数
    {  delay(5);
      if(key2==0)
        {  num--;
          if(num==-1)
            num=99;
        }
      while(!key2);
      delay(5);
      while(!key2);
    }
    zsys=num/10;
    xsys=num%10;
    display_bjys(zsys,xsys);     
     
  if(key0==0)         //预设功能
        {  P0=num;   
      wr_da=0;
      delay(1);
    }
}
void keycan_bxsz()          //波形  按键扫描
{
  if(key3==0)         

    {  delay(5);
      if(key3==0)
        {  num1++;//num1自加   选择波形
          if(num1==5)
          num1=1;   
          bxsz=num1;
          display_bxsz(bxsz);   
          while(!key3);
          delay(5);
          while(!key3);
        }     
      if(key0==0)//功能键按下  确定波形输出
        {  if(num1==1)
            {  init_trigle();
              while(1)
                {  trigle();
                  if(key0!=0)
                    break;
   
                }
              }
          if(num1==2)
            {  init_trap();
              while(1)
                {  trap();   
                  if(key0!=0)
                    break;
   
                }      
            }
          if(num1==3)
            {  init_saw();
              while(1)
                {  saw();
                  if(key0!=0)
                    break;
   
                }     
            }
          if(num1==4)
            {  init_square();
              while(1)
                {  square();
                  if(key0!=0)
                    break;
   
                }     
            }
        }
    }
}

void init_kjhm()                  //初始化 1   开机显示画面函数
{     dula=0;
wela=0;
        lcden=0;
        write_com(0x38);
  write_com(0x0e);
  write_com(0x06);
  write_com(0x01);
  write_com(0x80);

  
  write_com(0x80+0x40);

  }

void init_bjhm()          //初始化2   步进电压画面显示函数
{     dula=0;
  wela=0;
         lcden=0;
         write_com(0x38);
  write_com(0x0e);
  write_com(0x06);
  write_com(0x01);
  write_com(0x80);

  write_com(0x80+0x40);

}
void init_yshm()          //初始化3   预设电压画面显示函数
{      dula=0;
  wela=0;
     lcden=0;
     write_com(0x38);
  write_com(0x0e);
  write_com(0x06);
  write_com(0x01);
  write_com(0x80);

  write_com(0x80+0x40);

}
void init_bxxzhm()    //初始化4   波形设置画面显示函数
{     dula=0;
  wela=0;
     lcden=0;
     write_com(0x38);
  write_com(0x0e);
  write_com(0x06);
  write_com(0x01);
  write_com(0x80);

  write_com(0x80+0x40);
  write_date(':');
      delay(50);
}
void init_trigle()       //初始化5  三角波输出显示画面函数
{     dula=0;
  wela=0;
     lcden=0;
     write_com(0x38);
  write_com(0x0e);
  write_com(0x06);
  write_com(0x01);
  write_com(0x80);

  write_com(0x80+0x40);

}
void init_trap()      //初始化6   梯形波输出显示画面函数
{     dula=0;
  wela=0;
     lcden=0;
     write_com(0x38);
  write_com(0x0e);
  write_com(0x06);
  write_com(0x01);
  write_com(0x80);


  write_date(':');
  write_com(0x80+0x40);
  
      delay(50);
    }

void init_saw()          //初始化7  锯齿波输出显示画面函数
{     dula=0;
  wela=0;
     lcden=0;
     write_com(0x38);
  write_com(0x0e);
  write_com(0x06);
  write_com(0x01);
  write_com(0x80);

  write_com(0x80+0x40);

}
void init_square()       //初始化8  方波输出显示画面函数
{     dula=0;
  wela=0;
     lcden=0;
     write_com(0x38);
  write_com(0x0e);
  write_com(0x06);
  write_com(0x01);
  write_com(0x80);
  
  write_com(0x80+0x40);

}
void init()     //初始化子函数
{  wela=0;
  dula=0;
  num=0;
  num1=0;
  P0=0;
  wr_da=0;
  delay(1);
  wr_da=1;
  delay(1);
  key0=1;
}


全部资料51hei下载地址:
简易数控稳压电源.zip (2.36 MB, 下载次数: 71)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:156220 发表于 2019-4-12 08:43 | 只看该作者
电路图有没有
回复

使用道具 举报

板凳
ID:582891 发表于 2019-7-14 18:46 | 只看该作者
太赞了
回复

使用道具 举报

地板
ID:282095 发表于 2019-7-15 09:21 | 只看该作者
电源设计是个好东西
回复

使用道具 举报

5#
ID:56665 发表于 2019-7-15 18:49 | 只看该作者
这个电源用的什么芯片,是开关电源还是线性电源。
回复

使用道具 举报

6#
ID:729886 发表于 2020-5-7 07:56 | 只看该作者
数控电源有电路图就更好了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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