1基于单片机的数控电压源课程设计毕业设计.docx
《1基于单片机的数控电压源课程设计毕业设计.docx》由会员分享,可在线阅读,更多相关《1基于单片机的数控电压源课程设计毕业设计.docx(27页珍藏版)》请在冰豆网上搜索。
![1基于单片机的数控电压源课程设计毕业设计.docx](https://file1.bdocx.com/fileroot1/2023-4/19/71146e6b-2d3d-49bb-bc0e-39205dc8e24a/71146e6b-2d3d-49bb-bc0e-39205dc8e24a1.gif)
1基于单片机的数控电压源课程设计毕业设计
陕西理工学院
课程设计
课题:
基于单片机直流电压源设计
班级:
电子103
学生学号:
1013014093
学生姓名:
赵颂镭
指导老师:
王文洋
1设计任务及要求
1.设计任务:
设计制作具有一定电压范围和功能的数控电源.
原理如题目所示
(1)基本要求:
a输出电压:
范围0~15V.
步进0.1V
纹波不大于10mv
b输出电流:
500mA
c输出电压由数码显示
d用”+”.”-”键控制输出电压进行增/减调整
2方案比较并确定
根据设计要求,小组成员拟列了2个方案,原理上基本能够实现要求
2.1方案一:
是以型号89C51单片机为控制核心进行设计的,通过按键进行控制,单片机控制数模转换芯片DAC0832,其输出0~7.5V的电压,因为要求电压为0~15V所以必须再经过放大器放大,并通过三端可调正稳压器进行稳压,输出一个较稳定的直流电压,并在数码管上显示出来,并时刻刷新调整电压后的幅值。
a..方框图如下:
b..原理图如下:
2.2方案二:
是以单片机89C51为控制核心,外接按键进行控制,单片机控制8个继电器,且每个继电器串联一个一定阻值的电阻,电阻之间的关系为以2为参数的等比数列,继电器之间为并联形式。
最终电压幅值可经过一个稳压电路后稳定输出。
且最后输出的电压值可通过单片机控制在数码显示管上显示出来,并时刻刷新调整电压后的幅值。
a.方框图如下
b。
原理图如下
2.3两种方案比较
方案一的电源电压切换采用DAC控制速度比较快,切换方便,且可以输出较高频率的几种波形,所需器件较少,元器件较常见而且便宜,缺点是放大器的电压要求比较高,需要0~15V的输出,需要多种电源供电。
方案二采用继电器控制为机械式。
基本原理简单,实现比较方便,电源电压也可以调整到较精确的数值,但是它需要较大的工作电流,原器件价格较贵,而且继电器会产生噪声污染。
比较之后,两种方案各有优缺点,所以可以任意选取一种进行软硬件组装。
直流数控电压源设计
3.系统硬件设计结构框图
本数控直流稳压电源的设计以一稳压电源为基础,以高性能单片机系统为控制核心,以稳压驱动放大电路、短路保护电路为外围的硬件系统,在检测与控制软件的支持下实现对电压输出的数字控制,通过对稳压电源输出的电压进行数据采样与给定数据比较,从而调整和控制稳压电源的工作状态及监测开关电路的输出电流大小。
本数控直流稳压电源实现以下功能:
键盘可以直接设定输出电压值;可快速调整电压;LCD显示电压值等。
3.18051简介
我们采用8051系列的AT89S51作为CPU,AT89S51是一种带4K字节FLASH可编程可擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
3.2主要特性
1)与MCS-51兼容;
2)8位字长的CPU;
3)可在线ISP编程的4KB片内FLASH存储器,用于程序存储,可擦写1000次;
4)256B的片内数据存储器,其中高128字节地址被特殊功能寄存器SFR占用;
5)可编程的32根I/O口线(P0~P3);
6)2个可编程16位定时器;
7)一个数据指针DPTR;
8)1个可编程的全双工串行通信口;
9)具有“空闲”和“掉电”两种低功耗工作方式;
10)可编程的3级程序锁定位;
11)工作电源的电压为5(1±0.2)V;
12)振荡器最高频率为24MHz;
13)编程频率3~24MHz,编程电流1mA,编程电压为5V。
3.3芯片引脚排列与名称
DIP封装形式的AT89S51的芯片引脚排列与名称如图1所示。
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位,并行,图1AT89S51的芯片引脚排列与名称
漏极开路双向I/O口,作为输出时可驱动8个TTL负载。
该口内无上拉电阻,在设计中作为D/A,A/D及液晶显示器的数据口。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4个TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,该口在设计中低四位作为键盘输入口,高四位与RST作为在线编程下载口。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收/输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,可作为输入。
在作为输出时,P2口的管脚被外部拉低,将输出电流。
该口在设计中作为D/A,A/D及液晶显示器的控制口。
P3口:
P3口管脚是带内部上拉电阻的8位双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流,这是由于上拉的缘故。
P3口也可作为AT89S51的一些特殊功能口,如下表1所示:
表1各端口引脚与复用功能表
端口引脚
复用功能
P3.0
TXD(串行输入口)
P3.1
RXD(串行输出口)
P3.2
/INT0(外部中断0)
P3.3
/INT1(外部中断1)
P3.4
T0(记时器0外部输入)
P3.5
T1(记时器1外部输入)
P3.6
/WR(外部数据存储器写选通)
P3.7
/RD(外部数据存储器读选通)
该口在设计中使用其特殊功能作为D/A,A/D读写信号的控制口。
和A/D的中断输入口。
RST:
该引脚为复位信号输入端,高电平有效。
在振荡器稳定工作情况下,该引脚被置成高电平并持续两个机器周期以上是系统复位。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
该引脚在设计中作为锁存器器和A/D的时钟信号。
/PSEN:
外部程序存储器的选通信号。
/EA/VPP:
/EA为访问芯片内部和芯片外部程序存储器的选择信号。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
芯片内振荡器放大器的输入及内部时钟工作电路的输入。
XTAL2:
芯片内振荡器放大器的输出。
4键盘控制器MM74C922
4.1简介
键盘的作用是对单片机输入数据,设计中要求能是电压进行“+”,“-”,及电压值的设定,所以采用键盘为4×4的薄膜矩阵键盘,用MM74C922芯片进行识别按键后送AT89S51的并行口P1,P1.0~P1.3作为键盘输入口。
传统的4×4矩阵键盘识别处理程序的编写相对烦琐。
所以采用MM74C922芯片来将4×4矩阵键盘的键值转换成4位BCD码以简化程序的编写。
4.2主要特性
CMOS工艺技术制造,工作电压3-15V,“二键锁定”功能,编码输出为三态输出,可直接与微处理器数据总线相连,内部振荡器能完成4×4矩阵键盘扫描,亦可用外部振荡器使键盘操作与其他处理同步,通过外接电容避免开关发生前、后沿弹跳所许的延时。
有按键按下时数据有效线变高,同时封锁其他键,片内锁存器将保持键盘矩阵的4位编盘,可由微处理器读出
4.3芯片引脚排列与名称
DIP封装形式的MM74C922的芯片引脚排列与名称如图4所示。
VCC:
供电电压(+5~+15);
GND:
接地;
Y1~Y2:
矩阵键盘行输入,图4MM74C922芯片引脚排列与名称
其内部接有上拉电阻;
X1~X2:
矩阵键盘列输入;
OUT1~OUT2:
矩阵键盘列输出;
OSC:
振荡器输入;
DA:
按键有效输出,当有任意键按下是DA输出高电平;
/OE:
输出有效端,低电平有效。
4.4D/A转换器DAC0832
4.4.1简介
设计要求电压输出范围是0.0V~9.9V,步进0.1V,共有100种状态,因此采用8位的D/A转换器就能满足设计要求。
因此采用常用的DAC0832芯片。
8位字长的D/A转换器DAC0832具有256种状态,能满足设计要求。
DAC0832芯片是具有两个输入数据寄存器的8位DAC,它能直接与AT89S51单片机相连接,
4.4.2主要特性
1)8位分辨率;
2)电流型输出,稳定时间为1uS;
3)可双缓冲输入,单缓冲输入或直接数字输入;
4)单一电源供电(+5~+15V);
5低功耗(20mW;)
4.4.3芯片引脚排列与名称
DIP封装形式的DAC0832的芯片引脚排列与名称如图51所示。
VCC:
电源电压,+5V。
GND:
地线输入端。
图5DAC0832的芯片引脚排列与名称
D0~D7:
8位数字量输入引脚。
单片机由这8根线传送给D/A转换数字量。
D7为最高有效位,D0为最低有效位。
Vref:
参考电压端。
/CS:
片选信号,当/CS为低电平时候,芯片被选中工作。
ILE:
允许数字量输入线。
高电平有效。
/XREF:
传送控制输入线,低电平有效。
/WR1,/WR2:
写命令输入线。
Ffb:
运算放大器反馈线。
Iout1,Iout2:
模拟电流输出线,Iout1+Iout2为一常数。
5.硬件电路设计
5.1MM74C922接口电路
设计中MM74C922的输出口与P1口的低四位相接,DA端通过反向器与P3.2相接。
每当有按键按下时,DA就产生高电平,同时向P1口低四位传送16进制的BCD码,分别对应16个按键。
MM74C922与键盘及AT89S51的接线图见图9
图9MM74C922接口电路
5.2DAC0832接口电路
DAC0832最具特色是输入为双缓冲结构,数字信号在进入D/A转换前,需经过两个独立控制的8位锁存器传送。
其优点是D/A转换的同时,DAC寄存器中保留现有的数据,而在输入寄存器中可送入新的数据。
系统中多个D/A转换器内容可用一公共的选通信号选通输出。
设计中用2个电压控制字代表0.1V当电压控制字从0,2,4,……到198时,可调稳压源输出0.0,0.1,……,9.9。
由于DAC0832是电流输出型,输出的电流随输入的电压控制字线性变化。
若要得到电压,还需要外接一片运放来实现电流到电压的转换。
由于DAC0832输出级没有加集成运放,所以需外加LM324相配适用。
考虑到设计需要,采用了单缓冲双级性的接法,如图10所示:
图10DAC0832接口电路
其计算公式为:
其中Vref为参考电压,D为DAC0832接收到的数据。
5为DAC0832基准电压。
如果图中所示电阻RX,RY,RZ的阻值选取适当,则输出电压范围在电压控制字从0,2,4,……到198变换时根据上式计算可得输出电压为+4.9V~-5V,正好满足后续电路的要求。
其中P2.7为DAC0832的片选控制端。
5.3ADC0809接口电路
由于输出电压范围是0.0V~9.9V超出了ADC0809的测量范围,因此使用电位器将输出电压分压后送至ADC0809的输入端。
ADC0809与AT89S51的接口电路如图11所示
图11ADC0809接口电路
其中P2.6为0809的片选信号,与WR和RD分别通过或非门接到0809的START和OE上,EOC通过非门与AT89S51的INT0相接。
由于0809需要时钟信号,因此可以从AT89S51的ALE端得到6分频的振荡信号,为了使6分频后的信号能满足0809的需求,我们采用的是4M的晶体振荡器。
5.4LCD1602C接口电路
LCD1602C与AT89S51的接口电路如图12所示
图12LCD显示电路
5.5可调稳压源电路
为了获得大的负载电流,可调稳压部分使用了最大输出电流为1A的7805三端集成稳压块。
7805原本是输出固定电压为5V的集成稳压块,但可以外接电路来改变输出电压值。
可调稳压的电路见图13:
设运放理想。
这时,可
认为运放输入电压很小。
即:
图13可调稳压电路
其中Vin为D/A部分输出的双级性电压,5为7805的稳压值。
由上式可见,Vout与Vin之间成线形关系,当Vin变化时,输出电压改变。
由于Vin是DAC0832输出的范围是+4.9V~-5V的电压,因而Vout的变化可以从0.0V~9.9V。
经实验证明:
这种可调稳压输出具有良好的负载特性,输出最大负载电流可达到1A。
电压输出端接上500mA负载与未接负载(空载)之间输出电压仅相差0.04V以内。
由于。
5.6流稳压电路
本设计共用到电源有三种:
即±15V,+5V。
可选用的有开关电源和稳压电源两种,由于开关电源的纹波系数比较大,且设计要求电压纹波不大于10mV。
因此采用常用的稳压电源来作为整个系统的电源。
稳压电源由电源变压器、整流电路、滤波电路和稳压电路组成,如图14所示
图14电源方框及波形图
整流和滤波电路:
整流作用是将交流电压U2变换成脉动电压U3。
滤波电路一般由电容组成,其作用是脉动电压U3中的大部分纹波加以滤除,以得到较平滑的直流电压U4。
再通过稳压电路得到平直的直流电压U5。
电源变压器采用了双17.2V的变压器,输入220V,50Hz交流电,经全桥整流,滤波,稳压后得到±15V和+5V三种输出,+5V部分供单片机及D/A,A/D,显示等部分使用,电流最大约400mA;+15V和-15V部分供运放使用,最大电流不超过50mA。
电路如图15所示:
图15电源部分原理图
图中继电器部分是一个开关电路及短路保护电路。
当系统接到220V交流电后经变压器降压,整流桥整流后接到K1,此时由于U1(7815)没有输入,所以K1没有供电,整个后续系统处于关闭状态,当按下SW_ON键时U1得到输入,产生+15V的输出,同时K1得电吸合,形成自锁状态,同时79L15也得电输出-15V电压。
松开SW_ON键后由于K1处于自锁状态,整个系统处于开启状态。
当按下SW_OFF键时,K1被短路,从而断开电源达到关机的目的。
同样,在任一时刻如果产生短路,则K1也会断开达到短路保护的目的。
+5V部分的供电电流在400mA左右,因此采用了最大输出电流为1A的7805三端稳压集成电路,由于功耗大,负载重,加装了散热片。
而+15V和-15V部分最大电流不超过50mA。
在设计过程中发现中两片7805的均使用了散热片且温度偏高,因此加装了风扇,使用+15V电源,将78L15该为7815后可满足风扇需求。
这样在保证性能的同时也降低了成本。
6.程序设计
6.1主控程序
图16为系统主控程序。
图16系统主控程序框图
6.2D/A子程序
图17为D/A子程序框图。
图17D/A子程序框图
可以看出,D/A子程序的作用是将设定的数字量通过变换送给D/A。
6.3A/D子程序
图18A/D子程序框图
由A/D子程序框图看出,修改精度为一个数字量,由于A/D和D/A的精度限制,修改量只能达到0.05V,但足已满足设计需要。
6.4键盘子程序
图19为键盘子程序框图。
A、程序实现
单片机系统初始化和存储器分配程序
$NOMOD51
;MOVDPTR,#XDATASTART
MOVR7,#LOW(XDATALEN)
IF(LOW(XDATALEN))<>0
MOVR6,#(HIGH(XDATALEN))+1
ELSE
MOVR6,#HIGH(XDATALEN)
ENDIF
CLRA
XDATALOOP:
MOVX@DPTR,A
INCDPTR
DJNZR7,XDATALOOP
DJNZR6,XDATALOOP
ENDIF
IFPPAGEENABLE<>0
MOVPPAGE_SFR,#PPAGE
ENDIF
键盘扫描程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitkey1=P1^0;
sbitkey2=P1^1;
voiddelay(uintz);
ucharkeyscan()//键盘扫描程序
{
uchartemp,num;
num=17;
P1=0xfe;//p1.0口置0
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(20);
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
//delay(10);//延迟去抖
P1=P1&0xf0;
while(P1!
=0xf0);
switch(temp)
{
case0xe0:
num=7;break;//0xf0和0xe0的交处,即p1.0与p1.4的交处
case0xd0:
num=8;break;//p1.0与p1.5的交处,
case0xb0:
num=9;break;
case0x70:
num=15;break;
default:
break;
}
}
elsebreak;
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(20);
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
//delay(10);
P1=P1&0xf0;
while(P1!
=0xf0);
switch(temp)
{
case0xe0:
num=4;break;
case0xd0:
num=5;break;
case0xb0:
num=6;break;
case0x70:
num=14;break;
default:
break;
}
}
elsebreak;
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(20);
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
//delay(10);
P1=P1&0xf0;
while(P1!
=0xf0);
switch(temp)
{
case0xe0:
num=1;break;
case0xd0:
num=2;break;
case0xb0:
num=3;break;
case0x70:
num=13;break;
default:
break;
}
}
elsebreak;
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(20);
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
//delay(10);
P1=P1&0xf0;
while(P1!
=0xf0);
switch(temp)
{
case0xe0:
num=10;break;
case0xd0:
num=0;break;
case0xb0:
num=11;break;
case0x70:
num=12;break;
default:
break;
}
}
elsebreak;
}
returnnum;
}
主程序
#include
#include
#include
#include
#include"keyscan.h"
#defineucharunsignedchar
#defineuintunsignedint
#definedac0832XBYTE[0X7FFF]//P2.7作片选,启动DA转换
#defineint0XBYTE[0X7FF8]//结束AD转换,锁存通道0,读出AD值
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//数组
{temp1=temp1-1;}
if(int0{temp1=temp1+1;}//ADC转换后于输入数字量比较运算程序
display(i);//调用显示函数
}
elseif(keynum==12)//判断按键,如果是加键
{
temp1=temp1+2;//电压数字量加02H
if(weishu==1){volt[1]=volt[0]+10;
volt[0]=0;
weishu=2;}//如果是一位数的话,将这个数放到第二个数码管,同时将小数点输出,第一位变为0,位数加一
if(weishu==2){volt[0]++;}//将第一位LED加1
if(volt[0]==10){volt[1]=volt[1]+1;volt[0]=0;}//如果第一个数码管是点的话,将第一个数码管加一,小数点去掉
if(volt[1]==20){volt[2]=1;volt[1]=10;volt[0]=-1;weishu=3;}
if(weishu==3)
{
if(dot==1)
{
volt[1]++;
if(volt[1]==10)
{
volt[2]++;volt[1]=0;temp1=temp1+2;
}
}
else
{
volt[0]++;
if(volt[0]==10){volt[1]++;volt[0]=0;}
}
}
}//三位时的处理程序
elseif(keynum==13)//判断按键,如果减键
{
temp1=temp1-2;//电压数字量加02H
if(weishu==1)
{volt[1]=volt[0]+9;volt[0]=10;weishu=2;}
if(weishu==2){volt[0]--;}
if(volt[0]<0||volt[0]>9){volt[1]=volt[1]-1;volt[0]=9;}
if(weishu==3)
{
if(dot==1)