基于单片机的数控电压源课程设计毕业设计.doc
基于单片机的数控电压源课程设计一系统硬件设计结构框图本数控直流稳压电源的设计以一稳压电源为基础,以高性能单片机系统为控制核心,以稳压驱动放大电路、短路保护电路为外围的硬件系统,在检测与控制软件的支持下实现对电压输出的数字控制,通过对稳压电源输出的电压进行数据采样与给定数据比较,从而调整和控制稳压电源的工作状态及监测开关电路的输出电流大小。本数控直流稳压电源实现以下功能:键盘可以直接设定输出电压值;可快速调整电压;LCD显示电压值等。AT89S51矩阵键盘LCD显示D/A转换DAC0832A/D转换ADC0809可调稳压源稳压电源+5V+15-15V键盘编码MM74C9221.1 8051简介我们采用8051系列的AT89S51作为CPU,AT89S51是一种带4K字节FLASH可编程可擦除只读存储器(FPEROMFlash Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。12 主要特性1)与MCS-51兼容 ;2)8位字长的CPU;3)可在线ISP编程的4KB片内FLASH存储器,用于程序存储,可擦写1000次;4) 256B的片内数据存储器,其中高128字节地址被特殊功能寄存器SFR占用;5)可编程的32根I/O口线(P0P3);6)2个可编程16位定时器;7)一个数据指针DPTR;8)1个可编程的全双工串行通信口;9)具有“空闲”和“掉电”两种低功耗工作方式;10)可编程的3级程序锁定位;11)工作电源的电压为5(1±0.2)V;12)振荡器最高频率为24MHz;13)编程频率3 24 MHz,编程电流1mA,编程电压为5V。13芯片引脚排列与名称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.0TXD(串行输入口)P3.1RXD(串行输出口)P3.2/INT0(外部中断0)P3.3/INT1(外部中断1)P3.4T0(记时器0外部输入)P3.5T1(记时器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 键盘控制器MM74C92221 简介键盘的作用是对单片机输入数据,设计中要求能是电压进行“+”,“-”,及电压值的设定,所以采用键盘为4×4的薄膜矩阵键盘,用MM74C922芯片进行识别按键后送AT89S51的并行口P1, P1.0P1.3作为键盘输入口。传统的4×4矩阵键盘识别处理程序的编写相对烦琐。所以采用MM74C922芯片来将4×4矩阵键盘的键值转换成4位BCD码以简化程序的编写。22 主要特性CMOS工艺技术制造,工作电压3-15V,“二键锁定”功能,编码输出为三态输出,可直接与微处理器数据总线相连,内部振荡器能完成4×4矩阵键盘扫描,亦可用外部振荡器使键盘操作与其他处理同步,通过外接电容避免开关发生前、后沿弹跳所许的延时。有按键按下时数据有效线变高,同时封锁其他键,片内锁存器将保持键盘矩阵的4位编盘,可由微处理器读出23 芯片引脚排列与名称 DIP封装形式的MM74C922的芯片引脚排列与名称如图4所示。VCC:供电电压(+5+15);GND:接地; Y1Y2:矩阵键盘行输入, 图4 MM74C922芯片引脚排列与名称其内部接有上拉电阻; X1X2:矩阵键盘列输入; OUT1OUT2:矩阵键盘列输出;OSC:振荡器输入;DA:按键有效输出,当有任意键按下是DA输出高电平; /OE:输出有效端,低电平有效。3 D/A转换器DAC0832331简介设计要求电压输出范围是0.0V9.9V,步进0.1V,共有100种状态,因此采用8位的D/A转换器就能满足设计要求。因此采用常用的DAC0832芯片。8位字长的D/A转换器DAC0832具有256种状态,能满足设计要求。DAC0832芯片是具有两个输入数据寄存器的8位DAC,它能直接与AT89S51单片机相连接,32 主要特性1)8位分辨率;2)电流型输出,稳定时间为1uS;3)可双缓冲输入,单缓冲输入或直接数字输入;4)单一电源供电(+5+15V);5 低功耗(20mW;)33 芯片引脚排列与名称DIP封装形式的DAC0832的芯片引脚排列与名称如图51所示。VCC:电源电压,+5V。GND:地线输入端。 图5 DAC0832的芯片引脚排列与名称D0D7:8位数字量输入引脚。单片机由这8根线传送给D/A转换数字量。D7为最高有效位,D0为最低有效位。Vref:参考电压端。/CS:片选信号,当/CS为低电平时候,芯片被选中工作。ILE:允许数字量输入线。高电平有效。/XREF:传送控制输入线,低电平有效。/WR1,/WR2:写命令输入线。Ffb:运算放大器反馈线。Iout1,Iout2:模拟电流输出线,Iout1+Iout2为一常数。二硬件电路设计1.A/D转换器ADC080911 简介ADC0809是美国国家半导体公司生产的8位ADC,它是采用逐次逼近的方法完成A/D转换的。ADC0809的内部结构框图如图 所示。ADC0809由单一+5V电源供电,片内有带锁存功能的8路模拟多路开关,可对8路05V的输入模拟电压信号分时进行转换,完成一次转换约需100us;输出具有TTL三台锁存缓冲器,可以直接接到单片机数据总线上。通过适当的外接电路,ADC0809可对05V的双级性模拟信号进行转换。12主要特性1)8路8位AD转换器,即分辨率8位。 2)具有转换起停控制端。 3)转换时间为100s4)单5V电源供电 5)模拟输入电压范围05V,不需零点和满刻度校准。 6)工作温度范围为-4085摄氏度 7)低功耗,约15mW。13 芯片引脚排列与名称DIP封装形式的ADC0809的芯片引脚排列与名称如图6所示各引脚功能说明如下:VCC:电源电压,+5V。GND:地线输入端。D0D7:8位数字量输出引脚。A/D转换结果由这8根线传送给单片机。D7为最高有效位, 图6 0809引脚图排列与名称D0为最低有效位。IN0IN7: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的时钟频率范围在101200kHz,典型值为640kHz。A、B、C:3位地址输入线,经过译码后可选通IN0IN78个通道中的一个通道进行转换。A、B、C的输入与选通的通道的关系如表2所示:表2被选通的通道C B A被选通的通道C B AIN00 0 0IN41 0 0IN10 0 1IN51 0 1IN20 1 0IN61 1 0IN30 1 1IN71 1 12 显示器设计要求能显示当前电压值,因此可采用液晶显示或者数码管显示两种方法。考虑到数码管显示过于单调,因此采用采用液晶显示。液晶显示模块具有体积小、功耗低、显示内容丰富等特点,现在点阵型液晶显示模块已经是单片机应用设计中常用的信息显示器件了。21 简介本设计中采用了1602C型点阵式液晶显示模块。LCD技术和半导体技术的结合使该显示模块具有高可靠性和低功耗的特点。1602C型点阵式液晶显示模块内部有字符产生存储器和数据存储器。该显示模块可直接与AT89s51单片机相接,所有的显示功能由控制器用指令实现。由单一的+5V的电源供电,数据传送方式有4位和8位两种选择。内有显示92个ASCII字符和92个特殊字符的字库。22 引脚排列与名称1602C引脚排列与名称如图7所示。GND:电源地;VCC:电源正极,4.55.5V,通常使用5V电压;VO:LCD对比度调节端,电压调节范围为05V;RS:写入数据或者指令选择端。要写入指令时,使RS为低电平;要写入数据时,使RS为高电平; R/W:读写控制端。R/W为高电平时,读取数据;R/W为低电平时,写入数据; E:LCD模块使能信号控制端。写数据时, 图7 1602C引脚排列与名称需要下降沿触发;。DB0DB7:8位数据总线,三态双向。如果I/O口资源紧张的话,该模块也可以只使用4位数据线DB4DB7接口传送数据。A: LED背光正极。需要背光时,A串接一个限流电阻接VDD,K接地,实测该模块的背光电流为50mA左右;K: LED背光地端31 MM74C922接口电路设计中MM74C922的输出口与P1口的低四位相接,DA端通过反向器与P32相接。每当有按键按下时,DA就产生高电平,同时向P1口低四位传送16进制的BCD码,分别对应16个按键。MM74C922与键盘及AT89S51的接线图见图9图9 MM74C922接口电路32 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的片选控制端。33 ADC0809接口电路由于输出电压范围是0.0V9.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的晶体振荡器。34 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.0V9.9V。经实验证明:这种可调稳压输出具有良好的负载特性,输出最大负载电流可达到1A。电压输出端接上500mA负载与未接负载(空载)之间输出电压仅相差0.04V以内。由于。3.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后可满足风扇需求。这样在保证性能的同时也降低了成本。三程序设计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数字量加01H1图18 A/D子程序框图由A/D子程序框图看出,修改精度为一个数字量,由于A/D和D/A的精度限制,修改量只能达到0.05V,但足已满足设计需要。4 键盘子程序图19为键盘子程序框图。开始判断按键+-设 置其 它步进,步减子程序设 置子程序返回图19 键盘子程序框图框图41 步进步减子程序开始D/A数字量加02H为“+”?1否是D/A数字量加02H返回是否为9.9V否是否为0.0V否保持不变为“-”?是是是图20 步进,步减子程序框图 由步进,步减子程序框图可以看出,如果每次把D/A的数字量加01H,可以使步进量和步减量由0.1V变为0.05V。如果采用更高位的D/A转换器。可以使步进量和步减量进一步的减小,以满足更高的要求。42 设置子程序开始返回数字键?显示PLEASE SETVOLTAGE V判断按键显示PLEASE SET VOLTAGE X V否判断按键是显示PLEASE SET VOLTAGE X. V是取消键?显示 SET CANCLE VOLTAGE A.B V(AB为设置前电压值)是否判断按键“。”键?否取消键?是22否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 0IDATALEN 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 memoryPDATALEN 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 0E0HB DATA 0F0HSP DATA 81HDPL DATA 82HDPH DATA 83H NAME C_STARTUPC_C51STARTUP SEGMENT CODESTACK SEGMENT IDATA RSEG STACK DS 1 EXTRN CODE (?C_START) PUBLIC C_STARTUP CSEG AT 0?C_STARTUP: LJMP STARTUP1 RSEG C_C51STARTUPSTARTUP1:IF IDATALEN <> 0 MOV R0,#IDATALEN - 1 CLR AIDATALOOP: MOV R0,A DJNZ R0,IDATALOOPENDIFIF 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 AXDATALOOP: MOVX DPTR,A INC DPTR DJNZ R7,XDATALOOP DJNZ R6,XDATALOOPENDIFIF PPAGEENABLE <> 0 MOV PPAGE_SFR,#PPAGEENDIFIF PDATALEN <> 0 MOV R0,#LOW (PDATASTART) MOV R7,#LOW (PDATALEN) CLR APDATALOOP: MOVX R0,A INC R0 DJNZ R7,PDATALOOPENDIFIF IBPSTACK <> 0EXTRN DATA (?C_IBP) MOV C_IBP,#LOW IBPSTACKTOPENDIFIF XBPSTACK <> 0EXTRN DATA (?C_XBP) MOV C_XBP,#HIGH XBPSTACKTOP MOV C_XBP+1,#LOW XBPSTACKTOPENDIFIF PBPSTACK <> 0EXTRN DATA (C_PBP) MOV C_PBP,#LOW PBPSTACKTOPENDIF 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 intsbit key1=P10;sbit key2=P11;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;