资源描述
直流数控电压源设计
一.系统硬件设计结构框图
本数控直流稳压电源的设计以一稳压电源为基础,以高性能单片机系统为控制核心,以稳压驱动放大电路、短路保护电路为外围的硬件系统,在检测与控制软件的支持下实现对电压输出的数字控制,通过对稳压电源输出的电压进行数据采样与给定数据比较,从而调整和控制稳压电源的工作状态及监测开关电路的输出电流大小。本数控直流稳压电源实现以下功能:键盘可以直接设定输出电压值;可快速调整电压;LCD显示电压值等。
AT89S51
矩阵
键盘
LCD
显示
D/A转换
DAC0832
A/D转换
ADC0809
可调稳压源
稳压
电源
+5V
+15
-15V
键盘编码
MM74C922
1.1 8051简介
我们采用8051系列的AT89S51作为CPU,AT89S51是一种带4K字节FLASH可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
1.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 ~24 MHz,编程电流1mA,编程电压为5V。
1.3芯片引脚排列与名称
DIP封装形式的AT89S51的芯片引脚排列与名称如图1所示。
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位,并行, 图1 AT89S51的芯片引脚排列与名称
漏极开路双向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:芯片内振荡器放大器的输出。
2 键盘控制器MM74C922
2.1 简介
×用MM74C922芯片进行识别按键后送AT89S51的并行口P1, P1.0~P1.3作为键盘输入口。传统的4×4矩阵键盘识别处理程序的编写相对烦琐。所以采用MM74C922芯片来将4×4矩阵键盘的键值转换成4位BCD码以简化程序的编写。
2.2 主要特性
CMOS工艺技术制造,工作电压3-15V,“二键锁定”功能,编码输出为三态输出,可直接与微处理器数据总线相连,内部振荡器能完成4×4矩阵键盘扫描,亦可用外部振荡器使键盘操作与其他处理同步,通过外接电容避免开关发生前、后沿弹跳所许的延时。有按键按下时数据有效线变高,同时封锁其他键,片内锁存器将保持键盘矩阵的4位编盘,可由微处理器读出
2.3 芯片引脚排列与名称
DIP封装形式的MM74C922的芯片引脚排列与名称如图4所示。
VCC:供电电压(+5~+15);
GND:接地;
Y1~Y2:矩阵键盘行输入, 图4 MM74C922芯片引脚排列与名称
其内部接有上拉电阻;
X1~X2:矩阵键盘列输入;
OUT1~OUT2:矩阵键盘列输出;
OSC:振荡器输入;
DA:按键有效输出,当有任意键按下是DA输出高电平;
/OE:输出有效端,低电平有效。
3 D/A转换器DAC0832
3.3.1简介
设计要求电压输出范围是0.0V~9.9V,步进0.1V,共有100种状态,因此采用8位的D/A转换器就能满足设计要求。因此采用常用的DAC0832芯片。8位字长的D/A转换器DAC0832具有256种状态,能满足设计要求。DAC0832芯片是具有两个输入数据寄存器的8位DAC,它能直接与AT89S51单片机相连接,
3.2 主要特性
1)8位分辨率;
2)电流型输出,稳定时间为1uS;
3)可双缓冲输入,单缓冲输入或直接数字输入;
4)单一电源供电(+5~+15V);
5 低功耗(20mW;)
3.3 芯片引脚排列与名称
DIP封装形式的DAC0832的芯片引脚排列与名称如图51所示。
VCC:电源电压,+5V。
GND:地线输入端。 图5 DAC0832的芯片引脚排列与名称
D0~D7:8位数字量输入引脚。单片机由这8根线传送给D/A转换数字量。D7为最高有效位,D0为最低有效位。
Vref:参考电压端。
/CS:片选信号,当/CS为低电平时候,芯片被选中工作。
ILE:允许数字量输入线。高电平有效。
/XREF:传送控制输入线,低电平有效。
/WR1,/WR2:写命令输入线。
Ffb:运算放大器反馈线。
Iout1,Iout2:模拟电流输出线,Iout1+Iout2为一常数。
二.硬件电路设计
1.A/D转换器ADC0809
1.1 简介
ADC0809是美国国家半导体公司生产的8位ADC,它是采用逐次逼近的方法完成A/D转换的。ADC0809的内部结构框图如图 所示。ADC0809由单一+5V电源供电,片内有带锁存功能的8路模拟多路开关,,可对8路0~5V的输入模拟电压信号分时进行转换,完成一次转换约需100us;输出具有TTL三台锁存缓冲器,可以直接接到单片机数据总线上。通过适当的外接电路,ADC0809可对0~5V的双级性模拟信号进行转换。
1.2主要特性
1)8路8位A/D转换器,即分辨率8位。
2)具有转换起停控制端。
3)转换时间为100μs
4)单+5V电源供电
5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
6)工作温度范围为-40~+85摄氏度
7)低功耗,约15mW。
1.3 芯片引脚排列与名称
DIP封装形式的ADC0809的芯片引脚排列与名称如图6所示
各引脚功能说明如下:
VCC:电源电压,+5V。
GND:地线输入端。
D0~D7:8位数字量输出引脚。A/D转换结
果由这8根线传送给单片机。D7为最高有效位, 图6 0809引脚图排列与名称
D0为最低有效位。
IN0~IN7:8路模拟量输入引脚。
Vref(+):参考电压正端。。
Vref(-):参考电压负端。
START:启动信号输入端,START为正脉冲,其上升沿清除ADC0808的内部的各寄存器,其下降沿启动A/D开始转换。
ALE:地址锁存启动信号,在ALE的上升沿,将A、B、C上的通道地址锁存到内部的地址锁存器。START和ALE两信号用于启动A/D转换。
EOC:转换完成信号,当EOC上升为高电平时,表明内部A/D转换已完成。
OE:允许输出信号。当OE=1时,即为高电平,允许输出锁存器输出数据。
CLK:时钟输入信号,0809的时钟频率范围在10~1200kHz,典型值为640kHz。
A、B、C:3位地址输入线,经过译码后可选通IN0~IN78个通道中的一个通道进行转换。A、B、C的输入与选通的通道的关系如表2所示:
表2
被选通的通道
C B A
被选通的通道
C B A
IN0
0 0 0
IN4
1 0 0
IN1
0 0 1
IN5
1 0 1
IN2
0 1 0
IN6
1 1 0
IN3
0 1 1
IN7
1 1 1
2 显示器
设计要求能显示当前电压值,因此可采用采用
2.1 简介
2.2 引脚排列与名称引脚排列与名称如图7所示。
图7 引脚排列与名称
3.1 MM74C922接口电路
设计中MM74C922的输出口与P1口的低四位相接,DA端通过反向器与P3.2相接。每当有按键按下时,DA就产生高电平,同时向P1口低四位传送16进制的BCD码,分别对应16个按键。
MM74C922与键盘及AT89S51的接线图见图9
图9 MM74C922接口电路
3.2 DAC0832接口电路
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所示:
图10 DAC0832接口电路
其计算公式为:
其中Vref为参考电压,D为DAC0832接收到的数据。5为DAC0832基准电压。
如果图中所示电阻RX,RY,RZ的阻值选取适当,则输出电压范围在电压控制字从0,2,4,……到198变换时根据上式计算可得输出电压为+4.9V~-5V,正好满足后续电路的要求。其中P2.7为DAC0832的片选控制端。
3.3 ADC0809接口电路
由于输出电压范围是0.0V~9.9V超出了ADC0809的测量范围,因此使用电位器将输出电压分压后送至ADC0809的输入端。
ADC0809与AT89S51的接口电路如图11所示
图11 ADC0809接口电路
其中P2.6为0809的片选信号,与WR和RD分别通过或非门接到0809的START和OE上,EOC通过非门与AT89S51的INT0相接。由于0809需要时钟信号,因此可以从AT89S51的ALE端得到6分频的振荡信号,为了使6分频后的信号能满足0809的需求,我们采用的是4M的晶体振荡器。
3.4 LCD1602C接口电路
LCD1602C与AT89S51的接口电路如图12所示
图12 LCD显示电路
3.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以内。由于。
3.6流稳压电路
不大于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后可满足风扇需求。这样在保证性能的同时也降低了成本。
三.程序设计
1主控程序
图16为系统主控程序。
开始
系统初始化
D/A子程序
键盘处理
子程序
A/D子程序
有键按下?
显示子程序
是
否
图16 系统主控程序框图
2 D/A子程序
图17为D/A子程序框图。开始
将显示值转换成对应的数字量
数字量送D/A
返回
1
图17 D/A子程序框图
可以看出,D/A子程序的作用是将设定的数字量通过变换送给D/A。
3 A/D子程序
开始
返回
将输出电压转换成数字量
与送D/A数字量相比较是否相等?
将送D/A数字量减01H
相等
不等
大于送D/A数字量?
是
否
将送D/A数字量加01H
1
图18 A/D子程序框图
由A/D子程序框图看出,修改精度为一个数字量,由于A/D和D/A的精度限制,修改量只能达到0.05V,但足已满足设计需要。
4 键盘子程序
图19为键盘子程序框图。
开始
判断按键
+
-
设 置
其 它
步进,步减
子程序
设 置
子程序
返回
图19 键盘子程序框图框图
4.1 步进步减子程序
开始
D/A数字量加02H
为“+”?
1
否
是
D/A数字量加02H
返回
是否为
9.9V
否
是否为
0.0V
否
保持不变
为“-”?
是
是
是
图20 步进,步减子程序框图
由步进,步减子程序框图可以看出,如果每次把D/A的数字量加01H,可以使步进量和步减量由0.1V变为0.05V。如果采用更高位的D/A转换器。可以使步进量和步减量进一步的减小,以满足更高的要求。
4.2 设置子程序
开始
返回
数字键?
显示
〈PLEASE SET〉
VOLTAGE V
判断按键
显示
〈PLEASE SET 〉
VOLTAGE X V
否
判断按键
是
显示
〈PLEASE SET 〉
VOLTAGE X. V
是
取消键?
显示
〈 SET CANCLE 〉
VOLTAGE A.B V
(A.B为设置前电压值)
是
否
判断按键
“。”键?
否
取消键?
是
2
2
否
3
数字键?
否
取消键?
是
否
3
判断按键
显示
〈PLEASE SET 〉
VOLTAGE X.Y V
是
4
确认键?
否
取消键?
否
是
4
显示
〈SET COMPLATE 〉
VOLTAGE X.Y V
是
图21 设置子程序框图
五. 由设置子程序可以看出,进入设置子程序后就屏蔽了“+”,“-”和设置键。然后逐步判断按键,执行相应程序。设计总结
六.附件
A、程 序 实 现
单片机系统初始化和存储器分配程序
$NOMOD51
;------------------------------------------------------------------------------
; This file is part of the C51 Compiler package //这个文件是c51 链接的数据
;------------------------------------------------------------------------------
; STARTUP.A51: This code is executed after processor reset. 这个代码在程序重启之后执行
;
; To translate this file use A51 with the following invocation:
;
; A51 STARTUP.A51
;
; To link the modified STARTUP.OBJ file to your application use the following
; BL51 invocation:
;
; BL51 <your object file list>, STARTUP.OBJ <controls>
;
;------------------------------------------------------------------------------
;
; User-defined Power-On Initialization of Memory
;
; With the following EQU statements the initialization of memory
; at processor reset can be defined:
;
; ; the absolute start-address of IDATA memory is always 0
IDATALEN EQU 80H ; the length of IDATA memory in bytes. IDATA存储的字节长度
;
XDATASTART EQU 0H ; the absolute start-address of XDATA memory XDATA 存储的实际起始地址
XDATALEN EQU 0H ; the length of XDATA memory in bytes.
;
PDATASTART EQU 0H ; the absolute start-address of PDATA memory
PDATALEN EQU 0H ; the length of PDATA memory in bytes.
;
; Notes: The IDATA space overlaps physically the DATA and BIT areas of the
; 8051 CPU. At minimum the memory space occupied from the C51
; run-time routines must be set to zero.
;------------------------------------------------------------------------------
;
; Reentrant Stack Initilization
;
; The following EQU statements define the stack pointer for reentrant
; functions and initialized it:
;
; Stack Space for reentrant functions in the SMALL model.
IBPSTACK EQU 0 ; set to 1 if small reentrant is used.
IBPSTACKTOP EQU 0FFH+1 ; set top of stack to highest location+1.
;
; Stack Space for reentrant functions in the LARGE model.
XBPSTACK EQU 0 ; set to 1 if large reentrant is used.
XBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1.
;
; Stack Space for reentrant functions in the COMPACT model.
PBPSTACK EQU 0 ; set to 1 if compact reentrant is used.
PBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1.
;
;------------------------------------------------------------------------------
;
; Page Definition for Using the Compact Model with 64 KByte xdata RAM
;
; The following EQU statements define the xdata page used for pdata
; variables. The EQU PPAGE must conform with the PPAGE control used
; in the linker invocation.
;
PPAGEENABLE EQU 0 ; set to 1 if pdata object are used.
;
PPAGE EQU 0 ; define PPAGE number.
;
PPAGE_SFR DATA 0A0H ; SFR that supplies uppermost address byte
; (most 8051 variants use P2 as uppermost address byte)
;
;------------------------------------------------------------------------------
; Standard SFR Symbols
ACC DATA 0E0H
B DATA 0F0H
SP DATA 81H
DPL DATA 82H
DPH DATA 83H
NAME C_STARTUP
C_C51STARTUP SEGMENT CODE
STACK SEGMENT IDATA
RSEG STACK
DS 1
EXTRN CODE (?C_START)
PUBLIC C_STARTUP
CSEG AT 0
?C_STARTUP: LJMP STARTUP1
RSEG C_C51STARTUP
STARTUP1:
IF IDATALEN <> 0
MOV R0,#IDATALEN - 1
CLR A
IDATALOOP: MOV @R0,A
DJNZ R0,IDATALOOP
ENDIF
IF XDATALEN <> 0
MOV DPTR,#XDATASTART
MOV R7,#LOW (XDATALEN)
IF (LOW (XDATALEN)) <> 0
MOV R6,#(HIGH (XDATALEN)) +1
ELSE
MOV R6,#HIGH (XDATALEN)
ENDIF
CLR A
XDATALOOP: MOVX @DPTR,A
INC DPTR
DJNZ R7,XDATALOOP
DJNZ R6,XDATALOOP
ENDIF
IF PPAGEENABLE <> 0
MOV PPAGE_SFR,#PPAGE
ENDIF
IF PDATALEN <> 0
MOV R0,#LOW (PDATASTART)
MOV R7,#LOW (PDATALEN)
CLR A
PDATALOOP: MOVX @R0,A
INC R0
DJNZ R7,PDATALOOP
ENDIF
IF IBPSTACK <> 0
EXTRN DATA (?C_IBP)
MOV C_IBP,#LOW IBPSTACKTOP
ENDIF
IF XBPSTACK <> 0
EXTRN DATA (?C_XBP)
MOV C_XBP,#HIGH XBPSTACKTOP
MOV C_XBP+1,#LOW XBPSTACKTOP
ENDIF
IF PBPSTACK <> 0
EXTRN DATA (C_PBP)
MOV C_PBP,#LOW PBPSTACKTOP
ENDIF
MOV SP,#STACK-1
; This code is required if you use L51_BANK.A51 with Banking Mode 4
; EXTRN CODE (B_SWITCH0)
; CALL B_SWITCH0 ; init bank mechanism to code bank 0
LJMP C_START
END
键盘扫描程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P1^0;
sbit key2=P1^1;
void delay(uint z);
uchar keyscan() // 键盘扫描程序
{
uchar temp,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)
{
case 0xe0:num=7;break; //0xf0和0xe0的交处,即p1.0与p1.4的交处
case 0xd0:num=8;break; // p1.0与p1.5的交处,
case 0xb0:num=9;break;
case 0x70:num=15;break;
default:break;
}
}
else break;
}
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)
{
case 0xe0:num=4;break;
case 0xd0:num=5;break;
case 0xb0:num=6;break;
case 0x70:num=14;break;
default:break;
}
}
else break;
}
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)
{
case 0xe0:num=1;break;
case 0xd0:num=2;break;
case 0xb0:num=3;break;
case 0x70:num=13;break;
default:break;
}
}
else break;
}
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;
whi
展开阅读全文