找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5424|回復(fù): 5
收起左側(cè)

簡易單片機數(shù)控直流穩(wěn)壓電壓源設(shè)計

[復(fù)制鏈接]
ID:510122 發(fā)表于 2019-4-12 00:06 | 顯示全部樓層 |閱讀模式
本系統(tǒng)以直流電壓源為核心,ATC89S52 單片機為主控制器,通過鍵盤來設(shè)置直流電源的輸出電壓,設(shè)置步進等級可達0.1V,輸出電壓范圍為0—9.9V,輸出電流為500mA,并 由數(shù)碼管顯示輸出電壓值。由“+”、“-”兩鍵分別控制輸出電壓步進增減,并且輸出電 壓可預(yù)置在0~9.9V 之間的任意一個值。擴展輸出電壓種類后可輸出三角波、梯形波、鋸齒波、方波等波形。本系統(tǒng)由單片機程控輸出數(shù)字信號,經(jīng)過D/A 轉(zhuǎn)換器(DA0832)輸出模擬電流量,再經(jīng)過運算放大器隔離放大輸出模擬電壓量,控制穩(wěn)壓芯片LM7805 電壓的變化而輸出不同的電壓。實際測試結(jié)果表明本系統(tǒng)輸出電壓值精確度較高。本系統(tǒng)實際應(yīng)用于需要高穩(wěn)定度小功率恒壓源的領(lǐng)域。
1.png

. 基本功能實現(xiàn):
(1) 可輸出電壓:范圍0~+9.9V,步進0.1V,紋波不大于10mV;
(2) 可輸出電壓值由數(shù)碼管顯示;
(3) 由“+”、“-”兩鍵分別控制輸出電壓步進增減;
(4) 為實現(xiàn)上述幾部件工作,自制一穩(wěn)壓直流電源,輸出輸出± 15v,+5v;

2.?dāng)U展功能與創(chuàng)新:
(1)輸出電壓可預(yù)置在0~9.9V之間的任意一個值;
   (2)擴展輸出電壓種類(比如三角波等);
(3)最大輸出電流可達1.5A;
(4)負載電流在0~1.5A間變化時輸出電壓的變化量不超過0.1V;      
(5)設(shè)計并制作一個電子負載,用于測試上述電源的負載調(diào)整率,電子負載恒定電流的可調(diào)范圍為0.1A~1.5A。

0.png 0.png
單片機源程序如下:
#include<reg52.h>
#define uint unsigned int      //無符號字符  8位
#define uchar unsigned char    //無符號整數(shù)  16位
sbit dula=P2^6;        //鎖存器段選
sbit wela=P2^7;        //鎖存器位選
sbit lcdrs=P3^1;        //1602數(shù)據(jù)命令選擇
sbit lcden=P3^0;       //1602使能信號端
sbit key1=P2^3;        //+鍵
sbit key2=P2^2;        //-鍵
sbit key3=P2^1;        //波產(chǎn)生鍵
sbit key0=P2^0;        //功能鍵
sbit wr_da=P2^5;        //DAC選通
uchar num,num0,num1,zsys,xsys,bxsz;
uchar code table_x[]={    //編碼表  無點數(shù)碼管顯示      
0x3f,0x0c,0x76,0x5e,0x4d,0x5b,0x7b,0x0f,0x7f,0x5f};
uchar code table_z[]={    //編碼表 帶點數(shù)碼管顯示
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)      //延時函數(shù)
{  uint x,y;
  for(x=z;x>0;x--)
    for(y=110;y>0;y--);
}
void display_bjys(uchar zsys,uchar xsys)  //預(yù)設(shè)&步進  數(shù)
{    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)  //波形設(shè)置   數(shù)碼管掃描子函數(shù)
{    dula=1;
    P1=table_x[bxsz];
    dula=0;
    P1=0xff;
    wela=1;
    P1=0xf0;
    wela=0;
    delay(1);
}

void keycan_bjys()          //預(yù)設(shè)&步進   按鍵掃描
{  if(key1==0)           //按key1鍵加數(shù)
    {
      delay(5);
      if(key1==0)
        {  num++;
          if(num==100)
            num=0;
        }
      while(!key1);
      delay(5);
      while(!key1);
    }
    if(key2==0)         //按key2鍵減數(shù)
    {  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)         //預(yù)設(shè)功能
        {  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   開機顯示畫面函數(shù)
{     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   步進電壓畫面顯示函數(shù)
{     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   預(yù)設(shè)電壓畫面顯示函數(shù)
{      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   波形設(shè)置畫面顯示函數(shù)
{     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  三角波輸出顯示畫面函數(shù)
{     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   梯形波輸出顯示畫面函數(shù)
{     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  鋸齒波輸出顯示畫面函數(shù)
{     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  方波輸出顯示畫面函數(shù)
{     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()     //初始化子函數(shù)
{  wela=0;
  dula=0;
  num=0;
  num1=0;
  P0=0;
  wr_da=0;
  delay(1);
  wr_da=1;
  delay(1);
  key0=1;
}


全部資料51hei下載地址:
簡易數(shù)控穩(wěn)壓電源.zip (2.36 MB, 下載次數(shù): 71)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:156220 發(fā)表于 2019-4-12 08:43 | 顯示全部樓層
電路圖有沒有
回復(fù)

使用道具 舉報

ID:582891 發(fā)表于 2019-7-14 18:46 | 顯示全部樓層
太贊了
回復(fù)

使用道具 舉報

ID:282095 發(fā)表于 2019-7-15 09:21 | 顯示全部樓層
電源設(shè)計是個好東西
回復(fù)

使用道具 舉報

ID:56665 發(fā)表于 2019-7-15 18:49 | 顯示全部樓層
這個電源用的什么芯片,是開關(guān)電源還是線性電源。
回復(fù)

使用道具 舉報

ID:729886 發(fā)表于 2020-5-7 07:56 | 顯示全部樓層
數(shù)控電源有電路圖就更好了
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表