基于单片机的数控直流稳压电源设计
1.1选题的背景稳压电源是各种类家用电器所不能缺少的关键能量动力,对其安全和实用价值均有高度的需求。由于使用机器人来实现系统设置对直流稳压电源并执行控制系统,不但能够提高稳压电源的性能,并且操控方式简单灵活,成本相对低廉,并且使用完善的控制器软件,扩充其功能,还可以在不增加硬件费用的前提下增加开关电源的性价比。因此我们主要使用51单片机系统设计数控可调的直流稳压电源,并利用系统开发来实现对数控直流
摘 要
直流稳压电源已被应用于教育、科研、工业等方面。自动测试系统中电源的精度将影响测试结果的质量。数控
直流稳压源,是能用数字来调节电源输出的能力,而且能使输入输出的直流电为最稳定、准确的直流电压源,而数控开
关电源则是根据常规开关电源的技术缺陷开发的,数字化后可以降低制造流程中的不确定因素和人参与的环节数,更
高效地处理电源模块中的安全性、智能化和生产一致性等工程问题。而采用单片机的数控直流稳压电源,主要由51单
片机、控制电路、显示电路、电压放大等基本模块所构成。其实现方法为,输入的220V市电压电流经电源变压器降压
后进入整流电路成为单向的脉动流量,此流量再经过滤波集成电路后消除了交换成分,并保留整流电压中的直流电压
输入成分,然后再进入稳定集成电路以保证输出电流的稳定性,最后将输出电流经过其一分支流入采样电路,再经过A
/D变换后输入单片机以实现显示。
本设计以AT89C51为主控芯片,由按键模块和液晶显示模块等部分相结合来设计方案完成对该课题的研究。本系
统能够实现输出电压可调功能,通过按键实现输出电压调大和调小,通过AD芯片实时采集输出电压,然后根据差值调整
DA芯片从而减小电压输出误差。系统通过液晶屏将系统设定的输出电压和实际输出的电压显示在屏幕上,并且系统可
通过按键模块对输出电压调节就行。最后利用Proteus软件对系统进行仿真与调试,实现输出0~15V的直流电压可调,
并将输出电压误差控制在5%以内。
关键词:高精度电源,51单片机,A/D转换,Proteus软件
第一章 前言
1.1选题的背景
稳压电源是各种类家用电器所不能缺少的关键能量动力,对其安全和实用价值均有高度的需求。由于使用机器人
来实现系统设置对直流稳压电源并执行控制系统,不但能够提高稳压电源的性能,并且操控方式简单灵活,成本相对低
廉,并且使用完善的控制器软件,扩充其功能,还可以在不增加硬件费用的前提下增加开关电源的性价比。因此我们主
要使用51单片机系统设计数控可调的直流稳压电源,并利用系统开发来实现对数控直流稳压电源的智能、数字化和模
组,其智能特性主要体现在使用控制系统的可编程模块,能对系统实行智能管理;数字化主要体现在控制系统输出电流
采用了LCD液晶显示,同时也可以使用按钮对输出电流进行连续的步进数字化调节模块化则主要体现在控制系统由各
个关键模块所构成,提高了控制系统的安全性。
1.2选题的意义
直流稳压电源是电子系统中是不可缺少的电源,已将被广泛应用于教学、科研等方面。 目前市场上常见的稳压
器有模拟型稳压电源和数字式稳压电源两种类型。模拟稳压电源具有体积小、成本低、可靠性高等优点;但其输出
特性易受负载变化影响。数控直流稳压源指的是能用数字来调节电源输出压力的大小,并能使输出的直流电压为稳
定、准确的直流电压源,而数控供电则是根据传统供电的不足而设置的,因此数字化可以减少制造流程中的不准确定
因素和人所涉及的环节数,更高效的应对传统电源模块的诸如安全性、智能化和高产品致性等工程难点问题,从而大
大提高了生产工作效率和生产的可维护性,具有广泛的市场前景。
通过这次毕业设计,我将把理论和实际相结合,可以让我的学习能力、分析能力、理论和实际相结合的能力得
到全面的锻炼,对以后的工作和生活都是一种很好的磨砺。
1.3课题主要任务
1.初步方案设计
通过对与本设计有关的大量文献的阅读和收集,对课题有了较深的认识,并结合当前通用的设计思路和设计方
法来确定设计的思维方法。最后决定使用AT89C51单片机为系统的主要核心控制芯片,结合 LCD液晶显示模块共同来
设计方案完成对该课题的研究。
2.硬件电路设计
学习使用Proteus软件,在该环境下先对电路进行设计,首先根据各元器件数据手册正确使用,以免损坏器件,
然后再根据电路中各部分所需设计电路,各参数计算无误后再进行系统电路原理图的绘图。
学习使用Keil软件,首先根据自己绘制的电路来编程定义每个端口等,然后根据指令表对所需要控制的器件进
行读写等操作程序的编写,再根据自己所要实现的功能进行总体编写,其中包括各子函数及主函数的关系等,注意
编程思路清晰,层次清楚。
4.系统仿真
当硬件电路设计以及软件编程都完成,在进行检查无误之后,在Proteus中选择自己所绘制的系统电路原理图中
的AT89C51单片机,把Keil生成的可执行文件写进去,然后再进行仿真操作,验证系统功能的正确性。
第二章 系统方案设计
2.1课题主要要求
本课题研究要求以51单片机为内核,产品设计一种采用单片机实现的数控直流稳压电源。要求系统必须满足下列
条件技术指标
1、输出电源范围:0~15V,可调。
2、额定电流:>0.5A 。
3、输出电压误差:≤5% 。
4、显示输出电压。
2.2课题设计思路
根据单片机系统设计的数控直流稳压电源,主要分为51单片机、控制电路、显示回路、稳定放大等部分。其实现
方法为,输入的220V市交流电压经电源变压器降压后进入整流电路成为单向的脉动电压,此电压再经过滤波器电路后
消除了交换成份,并保留整流电压中的直流成份,然后再进入稳定电路以保证输出电流的稳定性,最后将输出电流经过
其一分支流入采样电路,再经过A/D变换后输入单片机以实现在液晶显示屏显示。
本系统具有调节输出电压的功能,通过按键调节输出电压的大小,通过AD芯片实时采集输出电压,然后根据差值调
整DA芯片从而减小电压输出误差。系统通过LCD液晶屏显示屏将系统设定的输出电压和实际输出的电压显示在屏幕
上,并且系统可通过按键模块对输出电压就行调节。主要是对可调电源系统的方案设计进行分析,然后设计出系统的
硬件结构,然后选择合适的单片机型号和显示器件,并且介绍了各个模块电路的设计原理。
系统的硬件框架有以下几个模块组成,各个模块通过单片机控制组合在一起。该控制系统一般包括了电力提供系
统模块、电流采集系统模块、AD转换模块、DA转换模块、单片机最小系统模组、液晶模组、按键检测模组。
2.2课题方案设计
1.主控芯片的论证与择选
在当今这样一个科学技术飞速发展的时代,单片机已经成为了人们日常生活中随处可见的高科技产品的核心部
件,其功能也在日益增强,以适应人类对生活方式的要求,而从此次设计中来考察,由于其要求内容简单,所以选择了较
基础较简单的AT89C51单片微型计算机为主控芯片,AT89C51是一个带四K字节的闪烁可程序设计,可消除只读存储器的
最低工作电压,高性能CMOS8位微处理器,俗称单片机。该设备使用ATMEL的高密度非易失存储器加工技术制成,并带有
工业国际标准的MCS-51指令集和输出管脚。它具有丰富的指令系统以及良好的逻辑控制能力,并且还具备一定的运
算能力,能够满足多种应用需求,因此被广泛运用到各个领域。本设计主要针对于此进行分析探讨。 AT89C51作为
一种高效的微控制器,由于采用单片集成的多功能8位CPU和闪烁存储器。
在当下这种科技发展快速的年代,单块微机已经成为了人们日常生活中到处可见的高科技产品的核心部件,其功
能也在日益增强,以适应人类对生活方式的要求,而从此次设计中来考察,由于其要求内容简单,于是选用了较基础简
单
2.复位电路的论证与择选
复位电路的功能是使微控制器在获得供电的瞬间,由初始状态开始工作,而我们现阶段最常用的方法是系统上
电来进行恢复,或者自动使用键盘进行恢复。系统上的电复位方法是给单片机电源时,再进行一次恢复,以确保其能够
从头开始正常工作,电路也非常简单,一边接电阻接地另一边接电容接VCC;手动按键复位顾名思义就是使用按键来
进行复位操作,当按键按下时单片机从头开始运行。除了以上两种复位方式其实还有一种不常见但是非常有用的复
位电路,就是看门狗复位,看门狗复位就是模块式复位,只对某一块进行复位,结合本次设计,所以选择按键复位
更加灵活简便。
3.晶振电路的论证与择选
晶振是晶体振荡器的简写,在电学上它可等价为将某个电容器与某个电阻并行,再连接上某个电容器的二端网络
电工学上这种网的二个谐振点按照频谱的多少划分,当中比较小的频谱就是并联谐振而更多的频谱则是并联谐振,因
为晶格本身的特点使得这二个频谱之间的间距非常的小接近,在这种极窄的频谱范围里因为晶振等效为一种电感,所
以如果在晶体振荡器的二端连接上相应的电容器,它就会形成并联谐振电路这种并联谐振电路再加在一种负反馈电路
上就可能形成正弦波震荡集成电路,因为晶振等效的温度电子感应的频谱范围比较狭窄,也就是如果其他器件的参数
变化很大,这种温度传感器的频率范围就不会发生较大的改变。晶振电路不仅可以使用内部振荡的方式来获取时钟信
号,它还可以将外部振荡生成的信号传入单片机内当作时钟,从而达到引进较精准的时钟信号,是可以供给高精度
的频率基准的;内部振荡简单来说就是可以将单片机的两个晶振引脚当作一个反向放大器的输入和输出端,给它们
接上石英晶振再连上电容并接地,就组成了我们高频电路中所学的并联谐振电路,再加上负反馈就构成了正弦波振
荡电路。根据本次设计的需求所以选择内部振荡的晶振电路。
4.反馈电路的论证与择选
反馈电路也就是把放大输出信息(电压或电流)的一个或整个,返回到加大器输入信号端与进口信息加以对比(加
法或相减),然后再利用比较得出的有效输入信息去调节输出功率,这就是放大后的反馈过程。
5.D/A转换电路的论证与择选
该方法中,所使用的TLC5615芯片,是一个带有双串行接口的D/A变换器,其输入输出类型是电流型,即其最大输出
电流为参考电压值的2倍。具备线上电恢复的功能,也即把DAC寄存器恢复至全零。而且,该系统只需使用3根串行总线
就达到了十个数据的串行式进入与出口,易于和单片机接口。本产品设计的最重要目的,在于产品设计一款数控稳压
电源。将单片机AT89C51为主控芯片,对以TLC5615为数字/模拟转换器的主体芯片的输出电压进行控制。计算放大器
LM385构成负反馈控制系统,并产生恒定电流。接着,将输入输出讯号经由电位计分压器传递给计算放大器LM358,来调
节信号的输入输出准确度。本产品设计采用将按键控制器和数字机器人相连接,来读出和管理数字,并利用软件作出
决策,进而达到了调控输出功率的效果。同时通过观察LED显示器上的数码,对开关电源的输出电流加以控制,进而实
现了简单的人机交互功能。该产品设计设置简洁,操作灵活,调节简单,易于携带,成本低,具备了较好的实用价值。
以上的分析比较,最终确定本课题的方案硬件电路设计包括单片机系统、按键控制切换电路和LCD液晶模块等。
硬件电路系统的组成部分如图2-3所示:
图2-3 系统组成框图
第三章 系统硬件电路设计
3.1 AT89C51单片机
1.AT89C51单片机引脚图:
图3-1 AT89C51单片机引脚图
2.AT89C51单片机的介绍
(1)AT89C51单片机一般默认电压范围是4.5V~5.5V,最佳是5V。
(2)是一种八位兼容MCS-51的单片机,它内置了通用的CPU和存储单元。
(3)有P0、P1、P2、P3四组共32个I/O口线,可以对其每一个引脚传送不同的数据实现并行传输数据。在单片
机的P1、P2、P3引脚里面有上拉电阻,但P0端口是开漏的,里面无上拉电阻,需要自己外加并接正电源才可以作为I
/O口来用。
(4)可以进行多次的4KB擦写ROM,且内部RAM容量有8位*128。
(5)可切换节电模式和掉电模式来保持低功耗,进行个人设置来选择休眠或开启状态。
(6)有5个中断包括INT0、INT1、串行中断、定时器中断。
(7)可产生较宽频率的时钟振荡信号,其范围在0Hz到24MHz。
3.2晶振电路
本设计中所使用的晶体振荡器也就是石英晶体振荡器,石英晶振的两个端口分别接入到单片机时钟管脚XTAL1、
XTAL2上面,再并联上两个电容,再进行接地。单片化微式计算机内部还可作为反相信的放大器,和外部电路一起组成
并联谐振电路,再加上负反馈功能就可以为单片机控制器供给由我们所需要的正弦波振荡电路所形成的信息,简单来
说就是我们所需的时钟信号。
在此晶振电路中,石英晶振的两个引脚接到单片机的两个晶振端口,然后经过耦合电容就形成了简单的晶振电
路,其具体元件参数值由于设计电路的差异性有时也有所不同。晶振电路中的晶振就是给单片机提供其所需的时钟
信号,在一些特殊的情况下,为了保持系统时钟的一致性,使误差减小,即便是不同电路也会接到同一个晶振上,
让它变得相对精准。
3.3复位电路
复位电路是单片机系统不可缺少的重要组成部分,当某些地方出现问题无法自行恢复时,我们就要进行复位操
作来使之变为重新开始的状态,使之继续运行下去。本设计选择的手动按键复位电路,电路结构也非常简单,接线
时将此复位电路接到单片机的RST端,当该端口电平拉高时,单片机才会进行复位。
3.4按键电路
本设计设有4个电压调节按键,这4个按键用于调节系统输出电压。我们都知道一般的按键有2个引脚,这2个引脚
平时是不相连的。在按键还没按下时二对插针都是不会导通的,而只有在按键已被按下时二对插针才会导通。因此我
们可以利用单片机去检查按钮有无导通以确定该按钮当前有没有被按下,本系统也针对键盘的此特点专门设计了一种
键盘识别测试电路。设计电路中将键盘端直接和GND连接,而键盘的另一端则连接在单片机IO接口,利用键盘的程序,
就能够去检测当前键盘并检测IO接口上的最高低电平,当键盘不能按下时读到的电平信号是高电平。但如果当键盘按
下后,此时程序所读到的高电平信号就会变为低电平有效,则就可确定将该键按下,按键检测的电路的电路如图3-4所
示:
按键K1、K2、K3、K4分别接到单片机P1端口的P1.0、P1.1、P1.1、P1.1上,有电源电压增加设置按键,其中K3
按键每按一次输出电压增加1V,K1按键每按一次输出电压增加0.1V,而K2、K4为电源电压减设置按键,其中K4按键
每按一次输出电压减小1V,其中K2按键每按一次输出电压减小0.1V。
图3-4 按键电路图
3.5 显示电路
一般来说系统的显示器件常见的有数码管、液晶屏、点阵屏等等。本设计所用到的显示器为1602字符的显示液
晶屏,这是一种字符型显示模块其可以显示32个字符,显示内容可以为数字或者字母形式,可以应用在较多的场合。
LCD1602虽然可以在单片机下驱动下显示多个字符,但是LCD1602并不能显示中文汉字,因此在有汉字现实要求的场
合并不适用。同时LCD液晶屏的使用会占用比较多的单片机IO口引脚,所以使用LCD液晶屏的时候需要预留IO口资
源。综合以上分析,本设计最终选用LCD1602液晶屏作为系统显示器件,从设计成本方面来说,LCD液晶屏的成本价
格也不会太高,不会增加方案的设计成本。从电路设计方面来讲,LCD液晶屏数码管的应用电路比较简单。
3.6.电压采集电路
如图3-6是输出电压分压采集电路,输出电压经过R4、R5电阻进行分压,以此建立分压检测电路,通过单片机去
分压点的电压即可得知此时电压值。
本设计需要测量整个系统电压,而51单片机则可以处理数字信号。因此,电压的输出信息必须先通过A/D变换芯片
转换成数字信号,由单片机对数字信息进行后处理后得出稳压数值。 这样就会增加电路的复杂性和成本。为了解决
这个问题,我们可以利用ADC对数据进行采集。然后根据所获得的数据来计算出系统电压,从而实现整个测量的目的。
本设计过程中所采用的AD转换晶片,为由美国国家半导体有限公司所制造并设计的ADC0832,其主要技术特性包括:它
可以使用八位数分辨率,因此应用上极为方便,价格低廉,兼容性好,因此深受各公司以及单片机使用爱好者的喜爱,在
市场上普及率很高。以下为ADC0832的引脚功能介绍表如表3-6所示
表3-6ADC0832引脚及功能介绍
引脚 符号 功能
1 CS 片选使能,低电平芯片使能
2 CH0 模拟输入通道0,或作为IN+/-使用
3 CH1 模拟输入通道1,或作为IN+/-使用
4 GND 芯片参考0点位
5 DI 数据信号输入,选择通道控制
6 DO 数据信号输出,转换数据输出
7 CLK 芯片时钟输入
8 VCC/REF 电源输入及参考电压输入(复用)
其AD转换电路如3-7所示,根据ADC0832的典型应用电路设计如下电路图。当中引脚CH就是模拟讯号的输入输出
插针,而模拟电流经过该插针后会进入到AD变换芯片当中去,再经过AD变换以后就由输入与输出插针所输出为数字信
息,而这些输入与输出插针可以直接连接单片或微型计算机插针,使用此程序去处理由该插针所传回的数据,就能够实
现对AD信息的收集过程。
3.7 TLC5615 芯片
TLC5615芯片是美国德州仪器公司在1999年推出的产品,该芯片具有串行接口的数模转换器,它的输出是电压
型,最大输出电压是基准电压值的两倍。带有上电复位功能,也就是把DAC寄存器复位到全零。性能上比早期电流型
输出的DAC还要好。只需使用三根串行总线就即可达到十个数据信息的连续进入出口,而且很轻松地与工业规范的微
处理器或者数字单片机进行接口技术,特别适合于电池供电的测量仪器、移动电话、数字失调与增益调节,或者工业
控制系统场合。本设计采用TLC5615转换芯片,单片机输出的数字信号转换成模拟信号,模拟电压信号再通过比较放
大器之后实现电压输出。
TLC5615工作时如图3-8, TLC5615的引脚功能如表3-7介绍:
表3-7TLC5615引脚功能表
引脚 符号 功能
1 DIN 串行数据输入端
2 /CS 芯片选用通端,低电平有效
3 DOUT 用于级联时的串行数据输出端
4 AGND 模拟地
5 REFIN 基准电压输入端,2V~(VDD-2)
6 OUT DAC模拟电压输出端
7 VDD 正电源端,4.5~5.5V,通常取5V
8 SCLK 串行时钟输入端
不管是哪种工作方式,输出电压为:
公式(3-1)
其中,VREFIN为参考电压,N为输入的二进制数
图3-8(a) TLC5615芯片内部结构图
图3-8(b) TLC5615 AD转换电路
3.8供电电路设计
系统电源采用交流220V输入,由于系统的最大供电要求是直流5V,所以需要设计电源转换电路。首先使用电力变
压器降低交流电压,然后产生交流的15V电流,再通过整流桥最后整流产生18V的直流电压,再稳压到5V,就这样得到了
系统供电稳压5V的要求。在电路中也设置有电压表便于检测电压的大小。电源电路如图3-9所示。
图3-9 电源电路
3.9系统硬件总电路
本系统能够实现输出电压可调功能,通过按键来实现输出电压调大或者调小,通过AD芯片TLC5615实时采集输出
电压,再根据差值调整DA芯片来降低电压输出误差。系统通过LCD显示屏将系统设定的输出电压和实际输出的电压显
示在屏幕上,并且系统可通过按键模块对输出电压进行调节。本设计使用的是AT89C51的,最小系统电路中包括了晶
振电路和复位电路等。基本内容设计要求显示数字,电路设计只需在最小系统的基础上将LCD的引脚与单片机引脚进
行连接。最终完成的系统硬件电路原理如图3-10所示:
图3-10 系统硬件电路图
第四章 系统软件设计
在整个设计过程中离不开以下流程,我在这部分设计了以下流程:系统整体程序、按键检测程序、液晶显示程
序、下面分别都绘制出它们的流程图。
4.1系统程序流程图
分析本设计的控制功能要求,本系统需要显示按键检测程序功能、液晶显示功能、AD转换功能、DA转换输出功
能。系统首先对数据显示接口、按键输入接口、稳压控制接口、模数数模转换控制接口进行初始化。可以输出0.0伏
到15.0伏电源电压,数控电源的控制由TLC5615实现,按键可以设置输出电压值,整个系统的程序设计框架如下图4-
1所示。
图4-1 系统程序流程图
4.2 按键检测程序流程图
图4-2 按键检测程序流程图
按键检测程序流程图如上图所示,在进行按键程序的设计之前,需要对按键功能具有一定得了解,在按键按下
之前为高电平,但在按键的过程中或有一定程度的抖动,所以单片机不一定可以准确的采集到合适的电平信息。因
此我们在软件检测的时候需要进行消抖,也就是等按键抖动信号过去,再检测按键信号,一般按键抖动时间是3到5
毫秒,所以在首次扫描到有效的按键信号后,再经过3到5毫秒后,继续扫描按键的信号,如果既然有效,则表示按键确实按下。
4.3 液晶显示程序设计
图4-3 液晶显示程序流程图
本设计的液晶显示子程序设计流程图如4-3所示,首先要配置LCD控制IO口也就是LCD初始化,通过程序定义IO
口,将电路连接和程序引脚对应起来。然后编写LCD地址写入子程序和LCD数据写入子程序,在完成这2个子程序之后
可以开始调用显示函数。在调用显示子函数的实现只需要写入2个代入参数即可,在调用液晶显示子函数时写入地址
参数和内容参数,就可以实现在液晶屏指定位置显示指定内容,通过调用液晶显示子函数就可以完成显示屏的功能。
4.4 Keil软件的简介及使用
Keil软件最初是由美国Keil Software公司研发上市的,它里面一整套的开发流程然后通过μVision这个集成的
开发环境将它们串接起来,由于它的C51系列能够满足C程序的开发,C程序较汇编更加浅显易懂,所以Keil C51逐渐
广为人们普及使用。Keil中有各种程序开发时所需的工具供我们选择使用,而且它的用户使用界面也非常人性化,
在我们需要库函数时它能提供大量的函数让我们直接使用修改,更加便捷。且它在汇编程序方面的功能也不弱,输
出的汇编运行速度快、易于人们理解,基于Windows界面的特点更方便我们使用和学习。本设计是基于的Keil
μVision4环境下编程的,其使用方法如下所述:
打开Keil μVision4软件如图4-4(a),创建工程并按照毕业设计要求编写主程序及各个子程序。
图4-4(a)软件启动界面
1.选中Keil上方选项卡中的工程选项,出现下拉菜单后选中新建 μVision 工程来创建新工程,然后会出现新建立
的工程需要保存的路径,个人建议尽量选择英文路径,确定好之后再对它进行起名并保存工程。
2.然后会出现需要选择公司芯片的窗口,我们在里面找到Atmel,再选中它子选项的AT89C51,选定好后就完成了单
片机选型操作。
3.接下来需要我们新建.c文件,找到选项卡中的文件按钮,左击出现子选项后点击新建进行新建文件,这时出现我
们的编程界面,然后对新建的文件进行保存,注意文件后缀名为“.c”程序才能编译如图4-4(b)运行。
图4-4(b) 程序编写界面
4.展开工程左侧窗口的 “Target1”,然后右击“Source Group1”选择“add file to group ‘source
group1’”,找到自己保存路径下的.c文件选择添加并关闭。
5.点击Keil上方菜单中的“flash”,在出现的下拉菜单中选择“configuration flash tools”。然后出现设置选
项,我们选中窗口上方菜单的“Output”,找到创建hex文件的选项并勾选,基本配置即就完成了。
6.接下来就是在编程窗口里编写程序了,编写好程序后进行编译,再结合Proteus软件的仿真,反复修改再调试。直
至达到目标要求,每次使用完毕记得保存文件。
附 录
稳压电源总程序
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char //定义uchar 为 unsigned char
#define uint unsigned int
#define DelayNOP(){_nop_();_nop_();_nop_();_nop_();}
sbit K1=P1^0;//十分位加
sbit K2=P1^1;//十分位减
sbit K3=P1^2;//个位加
sbit K4=P1^3;//个位减
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit SCLK = P2^4;
sbit CS = P2^5;
sbit DIN = P2^6;
sbit DOUT = P2^7;
void check_busy();
19
void LCD_Initialize();
void LCD_Set_POS(uchar);
void write_command(uchar);
void write_data(uchar);
uchar data BUF1_str[16]={" "}; //1602第一行缓存数组
uchar data BUF2_str[16]={" "}; //1602第二行缓存数组
uchar key_val=0,flag=0,Key_cnt=0,Key_cnt1=0,KEYdown_INT_val=5;
uint cnt=0,Voltage=0;
int DADATA=0;
//******************adc0832****************************//
sbit CS_0832 = P1^4;
sbit CLK_0832= P1^5;
sbit DO_0832 = P1^6; // DI、DO不同时有效,可共用一个接口
sbit DI_0832 = P1^6;
extern void _nop_ ( void );
#define pulse0832() _nop_();_nop_();CLK_0832=1;_nop_();_nop_();CLK_0832=0
//把模拟电压值转换成8位二进制数并返回
unsigned char read0832()
{
unsigned char i, ch = 0, ch1 = 0;
CS_0832=0; // 片选,DO为高阻态
DI_0832=1;
// 此处暂停T-SetUp: 250ns (由pulse0832完成)
pulse0832(); // 第一个脉冲,起始位,DI置高
DI_0832=1;
pulse0832(); // 第二个脉冲,DI=1表示双通道单极性输入
DI_0832=1;
pulse0832(); // 第三个脉冲,DI=1表示选择通道1(CH2)
// MSB FIRST DATA
for(i = 0; i < 8; ++i)
{
pulse0832();
ch <<= 1;
if(DO_0832==1)
ch |= 0x01;
}
// MSB FIRST输出的最后一位与LSB FIRST输出的第一位是在
// 同一个时钟下降沿之后,故此处先执行读取,后执行pulse
// LSB FIRST DATA
for(i = 0; i < 8; ++i)
{
ch1 >>= 1;
if(DO_0832==1)
ch1 |= 0x80;
pulse0832();
}
CS_0832=1; // 取消片选,一个转换周期结束
20
return (ch==ch1) ? ch : 0; // 返回转换结果
}
//延迟
void DelayMS(uint x)
{
uchar i;
while(x--);
for(i=0;i<120;i++);
}
//显示函数,在LCD指定行上显示字符串
void Display_string(uchar *str,uchar lineno)
{
uchar k;
LCD_Set_POS(lineno);
for(k=0;k<16;k++)
write_data(str[k]);
}
//1602LCD测忙
void check_busy(void)
{
while(1)
{
P0=0xff;
E=0;
_nop_();
RS=0;
_nop_();
_nop_();
RW=1;
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
if((P0&0x80)==0)
{
break;
}
E=0;
}
}
//1602LCD写命令
void write_command(uchar tempdata)
{
E=0;
21
_nop_();
_nop_();
RS=0;
_nop_();
_nop_();
RW=0;
P0=tempdata;
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
E=0;
_nop_();
check_busy();
}
//1602LCD写数据
void write_data(uchar tempdata)
{
E=0;
_nop_();
_nop_();
RS=1;
_nop_();
_nop_();
RW=0;
P0=tempdata;
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
E=0;
_nop_();
check_busy();
}
//1602LCD初始化
void LCD_Initialize()
{
DelayMS(5);
write_command(0x38);
DelayMS(5);
write_command(0x0c);
DelayMS(5);
write_command(0x06);
DelayMS(5);
write_command(0x01);
22
DelayMS(5);
}
//1602LCD设置位置
void LCD_Set_POS(uchar Position)
{
write_command(Position|0x80);
}
//初始化定时器0
void InitTimer0(void)
{
TMOD=0X01;//定时器寄存器配置
TH0=(65535-50000)/256;//定时50000us=50ms
TL0=(65535-50000)%256;
//TR0=1;//启动定时器0
ET0=1;
EA=1;//开总中断
}
void _DA(uint DAValue)
{
uchar i=0;
DAValue <<= 2;
CS=1;
SCLK=1;
DelayMS(1);
CS=0;
for(i=0;i<12;i++)
{
SCLK=0;
DelayMS(1);
if(DAValue&0x0800)DIN=1;
else DIN=0;
DelayMS(1);
SCLK=1;
DAValue<<=1;
DelayMS(1);
}
CS=1;
SCLK=1;
DelayMS(1);
}
//************************************
//按键扫描
//************************************
void scan_key(void)
{
if(K1==0)
{
23
if(flag==0)
{
flag=1;
Voltage+=1;
}
if(flag==1)
{
Key_cnt++;
if(Key_cnt>=3)
{
Key_cnt=0;
Key_cnt1++;
if(Key_cnt1>=KEYdown_INT_val)
{
Key_cnt1=0;
KEYdown_INT_val=1;
Voltage+=1;
}
}
}
if(Voltage>=240) Voltage=240;
}
if(K2==0)
{
if(flag==0)
{
flag=1;
Voltage-=1;
}
if(flag==1)
{
Key_cnt++;
if(Key_cnt>=3)
{
Key_cnt=0;
Key_cnt1++;
if(Key_cnt1>=KEYdown_INT_val)
{
Key_cnt1=0;
KEYdown_INT_val=1;
Voltage-=1;
}
}
}
if(Voltage>150) Voltage=0;
}
if(K3==0)
24
{
if(flag==0)
{
flag=1;
Voltage+=10;
}
if(flag==1)
{
Key_cnt++;
if(Key_cnt>=3)
{
Key_cnt=0;
Key_cnt1++;
if(Key_cnt1>=KEYdown_INT_val)
{
Key_cnt1=0;
KEYdown_INT_val=1;
Voltage+=10;
}
}
}
if(Voltage>=240) Voltage=240;
}
if(K4==0)
{
if(flag==0)
{
flag=1;
Voltage-=10;
}
if(flag==1)
{
Key_cnt++;
if(Key_cnt>=3)
{
Key_cnt=0;
Key_cnt1++;
if(Key_cnt1>=KEYdown_INT_val)
{
Key_cnt1=0;
KEYdown_INT_val=1;
Voltage-=10;
}
}
}
if(Voltage>150) Voltage=0;
}
25
if(K1==1&&K2==1&&K3==1&&K4==1)
{
Key_cnt=0;
Key_cnt1=0;
KEYdown_INT_val=5;
flag=0;
}
}
//声明变量
//定义变量
float Kp; //PID调节的比例常数
float Ti; //PID调节的积分常数
float T; //采样周期
float Td; //PID调节的微分时间常数
float a0;
float a1;
float a2;
float ek; //偏差e[k]
float ek1; //偏差e[k-1]
float ek2; //偏差e[k-2]
float uk; //u[k]
int uk1; //对uk四舍五入求整
int adjust; //最终输出的调整量
int ee=1;//ee 为误差的阀值,小于这个数值的时候,不做PID调整,避免误差较小时频繁调节引起震荡。ee的
值可自己设
//变量初始化,根据实际情况初始化
void PID_init(void)
{
Kp=1;
Ti=1;
T=1;
Td=0;
a0=Kp*(1+T/Ti+Td/T);//1*(1+1+0)=1
a1=-Kp*(1+2*Td/T);//-1*(1+0)=-1
a2=Kp*Td/T;//0
// Ki=KpT/Ti=0.8,微分系数Kd=KpTd/T=0.8,Td=0.0002,根据实验调得的结果确定这些参数
ek=0;
ek1=0;
ek2=0;
uk=0;
uk1=0;
adjust=0;
}
float gabs(float ek)
{
if(ek<0)
{
26
ek=0-ek;
}
return ek;
}
int pid(float ek)
{
if(gabs(ek)<ee) //ee 为误差的阀值,小于这个数值的时候,不做PID调整,避免误差较小时频繁调节引起震
荡。ee的值可自己设
{
adjust=0;
}
else
{
uk=a0*ek+a1*ek1+a2*ek2;
ek2=ek1;
ek1=ek;
uk1=(int)uk;
if(uk>0)
{
if(uk-uk1>=0.5)
{
uk1=uk1+1;
}
}
if(uk<0)
{
if(uk1-uk>=0.5)
{
uk1=uk1-1;
}
}
adjust=uk1;
}
return adjust;
}
//主程序
void main()
{
uint data_temp=0;
int ADJ=0;
InitTimer0();//初始化定时器0
DelayMS(10);
LCD_Initialize();//初始化LCD
PID_init();
DADATA=0;
BUF1_str[1] ='E';
BUF1_str[2] ='X';
27
BUF1_str[3] ='P';
BUF2_str[1] ='C';
BUF2_str[2] ='U';
BUF2_str[3] ='R';
while(1)
{
scan_key();
DelayMS(5000);
data_temp=read0832();
ADJ=pid(Voltage-data_temp);
DADATA=DADATA+ADJ;
BUF1_str[9]=Voltage%1000/100+'0';
BUF1_str[10]=Voltage%100/10+'0';
BUF1_str[11]='.';
BUF1_str[12]=Voltage%10+'0';
BUF1_str[15]='V';
BUF2_str[9]=data_temp%1000/100+'0';
BUF2_str[10]=data_temp%100/10+'0';
BUF2_str[11]='.';
BUF2_str[12]=data_temp%10+'0';
BUF2_str[15]='V';
_DA(DADATA);
Display_string(BUF1_str,0x00);//第一行显示更新
Display_string(BUF2_str,0x40);//第二行显示更新
}
}
//定时器0中断函数
timer0() interrupt 1
{
TR0=0;
TH0=(65535-50000)/256;//50000us=50ms
TL0=(65535-50000)%256;
cnt++;
//TR0=1;
}
第五章 系统仿真与调试
5.1 Proteus软件的介绍
Proteus软件是一种集设计、综合、验证等流程一体的EDA软件,它能够完成各种电路的布局、布线、版图、设
计规则检查等,而且它可以仿真单片机以及其他外围器件,这是其他软件未能企及的。EDA就是电子设计自动化,它
是使用了CAD来各项设计和检测VLSI芯片。Proteus是在自身的运行环境下利用电路模拟实物从而进行仿真得出运行
结果的软件,它从原理图的设计与布线、程序编译到总电路与各子电路相结合并进行仿真实验,还可以设计和制作
PCB板。它有着同时支持电路的设计与仿真、虚拟仿真系统和PCB制作的环境,同时它还支持多种类型的芯片,如
8051、8086、AVR、MSP430、ARM和DSP等。
在程序这块,它自带多种编译器,并且满足多种编译软件生成的代码来实现仿真,也可以对汇编进行编辑编译
等操作,其广泛的衔接性的特点这就更加方便我们的使用。在Proteus中,它不仅有着丰富的虚拟仪器,而且它所提
供的仪器仪表都有着我们做仿真时规定范围内的理想指标,在我们仿真过程中很大限度的减少了各种仪器误差等,
现实中需要考虑到的仪器的使用次数也会对实验测量结果造成的影响在Proteus中也得到了解决。这使我们的实验结
果更加准确,更加趋于理论值,同时也更加便捷。同时Proteus更加直观的仿真显示是实物电路所没有的,它用色点
来显示引脚的高低电平,蓝色表示低电平红色表示高电平。当进行高级图形仿真时不但可以精确的分析出电路的多
种参数而且还可以对它们进行一致性的分析。
毕业设计就是要求学生完整的完成软硬件结合的动手实践的这个过程,是我们必须要经历并且特别重要的一个
实践过程。Proteus软件可以在没有实物的情况下设计电路与仿真时,模拟各种所要用的元器件和仪器仪表,更加方
便了我们的研究与实验。同时也方便我们对设计硬件电路图的修改和校验。仿真能省下我们很大一部分的设计、修
改、制作等步骤所花费的时间,而且大大减少了设计的过程中所需要的物资等,降低了在制造过程中潜在风险发生
的可能性。在以后的学习生活中,单片机的应用已经与我们的生活息息相关,且Proteus软件在单片机的应用与开发
得到越来越广泛的使用。因此我们也应学会使用这一软件,为我们以后的学习与工作打好基础。
本次设计是通过Proteus 8.6版本来进行系统原理图的设计与仿真,其使用方法下面进行一一描述。
Proteus软件的工程创建步骤:
1.在Proteus中选中上方工具栏的“文件”,然后选中文件子菜单的新建工程。
2.给新工程选择它的保存路径,最好是英文路径,并且电脑用户名不能是中文,否则无法仿真。然后给建立的工程
取名,由于个人习惯所以我设置为英文名称,再点击下一步。
3.选中“从选中的模板中创建原理图”然后根据自己的实际要求情况选择横纵向以及大小再进行下一步。
4.本设计未进行实物制作,若进行实物制作个人认为使用Altiem Dsigner更好,所以不创建PCB,然后单击下一步。
5.为了制作的任意性,故选择没有固件项目,单击下一步。
6.确认选择信息,无误后点击完成,工程就建立完毕了。
Proteus软件的使用步骤:
1.单击左边工具栏的元件模式,然后出现DEVICES的对象选择窗口,单击右键选择“从库中挑选”,在关键字中搜索
需要的元器件,会出现很多结果,选中自己需要的器件,该元器件名称就会在左边窗口出现。
2.选中上一步出现的元器件名称,即在原理图中使用,按照以上步骤完成所所有元件的放置。
3.鼠标接至元器件引脚一侧,点击出现连线即可将元器件相连接,逐步进行直至按照电路设计全部连接完成。
4.最后将制作完成的硬件电路原理图保存并命名。
5.2软硬件统调
1.运行Proteus软件并点击稳压电源的电路硬件仿真图。
2.选中原理图中的主控芯片——AT89C51,在出现的窗口找到程序文件那个选项后的文件夹图标,打开自己之前编译
完程序输出的路径,选中该文件并打开。
3.最后在Proteus的原理图界面中的点击仿真按键运行,若未能实现仿真结果或跳出警告错误,需要逐一排查问题并
再进行统调直至达到所要完成的目标。
5.3系统仿真结果与分析
点击仿真开始按钮,软件运行,显示器显两行内容EXP和CUR,其中EXP显示设定输出电压,UR显示实际输出电
压。系统初始化显示状态如图5-1所示。
图5-1 显示器显示电压(系统初始化显示状态)
通过调节按键模块,调节输出电压大小。其中K1,K2两个按键为微调,K3,K4为粗调。
在系统仿真时,我在系统输出端接了一个数字电压表V用于检测实际输出电压,比如,调节K3按钮设定输出电压
为5V,系统运行后 ,LCD显示EXP显示5V CUR显示5V结果如图5-2(a),此时电压表测量的输出电压显示5.05如图5-
2(b)所示。
(b)实际测量电压值
图 
(a)系统显示电压
图5-2 设置系统输出电压为5V时的工作状态
通过程序及系统的综合控制,该系统输出电压范围为0-15V,所以通过系统的按键系统调整设定输出电压为
15V,可以看到实际输出电压也为15V,系统自带电压表显示15.1V,如图5-3(a)和5-3(b)所示。
(a)显示器显示电压 
(b)电压表显示电压
图5-3 设置系统输出电压为15V时的工作状态
通过仿真,实现了任务书技术指标要求的基本内容显示,使用按键进行模式切换,验证了设计的系统功能的正
确性。
误差分析:因为这些模拟结果在相同条件重复计算相同量值时,倒数和符号都不改变,所以这些数据的偏离只可
以是整个系统差错,而不可以是随机误差。
表5-3 软件仿真数据及误差记录表
设定输出电压(V) 实际输出电压(V) 误差(x) 电压表显示电压(V) 误差(x)
0 0.1 0.1 0.07 0.07
1 1 0 0.95 0.05
2 2 0 2 0
3 3 0 2.94 0.06
4 4 0 4.05 0.05
5 5 0 4.99 0.01
6.1 6.1 0 6.16 0.06
7.2 7.2 0 7.22 0.02
8.3 8.3 0 8.33 0.03
9.4 9.4 0 9.43 0.03
10.5 10.5 0 10.6 0.1
11.6 11.6 0 11.7 0.1
18
12.7 12.7 0 12.8 0.1
13 13 0 13.1 0.1
14 14 0 14.1 0.1
15 15 0 15.1 0.1
数据设备在初始化后的设定初值电流为0V时,实际输出中显示的电流值都是在0.1V左右。紧接着,我使用按键电
路把设定电流提高到了1V,但实际输出中显示的电流值仍然是1V,随后我每提高1V就使得设定电流再达到了5V,之后我
以每增加1.1V电流到12.7V之间输出的理论电流值和实际输入的数字量基本一致,原设计的电压表在实际电路中电压
误差幅度一般在0.1V之间,但通过分析原本设计的实际电流值和理论电流值基本一致,测得的结果都是真实的。
第六章 全文总结
本课题是基于单片机的数控直流稳压电源设计,论文逻辑结构关系是:第一章主要介绍了对于本次基于单片机
的数控直流稳压电源控制系统课题的背景、意义和应用前景;在第二章中根据任务书中给出的要求进行系统方案的
设计;第三章是主要介绍整个方案中所用到的各个模块;而第四章则是介绍整个系统的软件设计以及keil软件的简
介;在第五章主要赘述了proteus软件的运行方式和系统仿真结果的分析,在最后我在第六章中简单的对整体设计进
行总结。
经过几个月的努力,毕业设计顺利完成。在这几个月里,我学到了很多,重新理解和巩固了以前的知识。我本
次设计内容是基于单片机的数控直流稳压电源设计,也就是运用所学理论知识设计了一种采用单片机的数控直流稳
压电源,在完成了控制系统总体设计与硬件部分设计,并将设计好各组成部分系统软件编程后,运用Proteus软件通过
模拟和调试,完成的0~15V的直流电压可调,并将输出电压误差控制在5%以内。
在本次课题设计中,我将AT89C51作为整个总设计电路系统的主控芯片,本系统能够实现输出电压可调功能,通
过按键实现输出电压调大和调小,通过AD芯片实时采集输出电压,然后根据差值调整DA芯片从而减小电压输出误
差。系统通过LCD液晶屏显示屏将系统设定的输出电压和实际输出的电压显示在屏幕上,并且系统可通过按键模块对
输出电压就行调节。
在本次毕设中从开始的开题、查找资料学习到后来的电路设计、编写程序再到最后的仿真调试、撰写论文,我
收获了很多,不仅充实了我的理论知识,更是提高了我的实践操作,将理论与实践相结合使我受益匪浅。
更多推荐



所有评论(0)