本系统以直流电压源为核心,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)
|