叨叨游戏网
您的当前位置:首页基于51单片机数控直流电源的设计

基于51单片机数控直流电源的设计

来源:叨叨游戏网
基于单片机的数控直流电源的设计

摘 要:该设计采用220V市用交流电输入,输出电压为0~9.9V可调,可步进0.1V调整。电源的主控电路采用STCC52单片机,并能够通过液晶直观地显示出电压。设计分析了各个模块电路和整机的工作原理,给出了整机工作的硬件实现和主要的软件流程设计。

关键词:直流稳压电源;STCC52;D/A转换

1引言

当今社会人们极大的享受着电子设备带来的便利,但是任何电子设备都有一个共同的电路--电源电路。大到超级计算机、小到袖珍计算器,所有的电子设备都必须在电源电路的支持下才能正常工作。当然这些电源电路的样式、复杂程度千差万别。可以说电源电路是一切电子设备的基础,没有电源电路就不会有如此种类繁多的电子设备。

数控直流稳压电源主要用微处理器等配合其它控制器件控制电源的电压输出,实现数控可调,高精度输出,过流保护,数字显示等。其调节的范围大,利用高精度的DA转换器,可以实现数控电源高精度输出,同时步进可调。这种高精度的的数控稳压电源可以满足对电源要求比较高的场合。

2方案设计与论证

2.1 DA的选择与论证

方案一:采用我们熟悉的8位DA,DAC0832. 方案二:采用我们熟悉的10位DA,TLC5615. 方案三:采用内部自带基准源的12位DA MAX531

对于方案一:选择DAC0832符合题目的要求,其价格低廉、接口简单、转换控

制容易等优点,在单片机应用系统中得到广泛的应用

对于方案二:为10位DA,虽然输出精度高,但接口稍复杂,同时该DA芯片价格昂贵。本设计不予采用

对于方案三:MAX531内部自带2.048V基准源,输出精度高,但价格太贵,本着满足设计要求尽量节约成本的前提,我们放弃方案三。

综上所述,我们选择方案二。 2.2 显示电路

方案一:采用四位共阳极数码管显示温度,动态扫描显示方式。 方案二:采用液晶显示屏LCD显示温度。

对于方案一,该方案成本低廉,但显示灵活性及可调性较差,硬件驱动电路复杂,故本设计中不采用本方案。

对于方案二,采用LCD显示方便清晰,可变性和可调性突出,与单片机硬件电路的连接简单,程序设计也较为灵活,成为单片机输出显示的首选。随着其成

本的不断降低,模块化程度不断提高,应用领域日益增多。所以,本设计中选用方案二。

2.3输入按键的选择与论证

方案一:采用4*4键盘

方案二:采用4按键,第一个选择个位和十位电压的加减,第二个和第三个加减1V,第四个确认输出。

对于方案一:主要采用4*4的矩阵键盘,可以设置0-9和步进,小数点等按键,可以快速的输入。但是4*4键盘占用的PCB面积较大,增加了PCB的成本,增加了PCB的布线难度,并且得占用8个单片机I/0口,这种方案不可取。 对于方案二:中虽不能直接输入0-9,但是可以通过“+”和“-”来实现0-9数字的输入,这样只占用了5个单片机I/O口,节约3个I/O口,同时PCB的面积和成本也进一步缩小。

综上考虑,我们选择方案二。 3系统简介

该系统主要由单片机最小控制系统、显示电路、按键、D/A转换电路、放大电路和稳压电路和系统供电电源等组成。外接220V的交流电源经过整流滤波后给上述各部分单元提供工作电源,通过键盘给单片机设定预输出值,并通过DA0832转化为模拟量,再经过运算放大和稳压电路最后输出预设电压值,通过液晶能够直观的显示出预设值。系统的框图结构如图3-1所示。

显示电路 单 片 机 D/A转换 按键 放大电路 输出电路 ~220v 变压器 整流滤波 稳压电路

图3-1数控直流稳压电源设计方框图

4.本系统核心器件简介

4.1STCC52单片机

STCC52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes

的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用STCMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位处理器和Flash存储单元,STCC52单片机在电子行业中有着广泛的应用。STCC52单片机由以下功能部件组成:微处理器、数据存储器、程序存储器、并行I/O口、串行口、定时器/计数器、中断系统及特殊功能寄存器。它们都是通过片内单一总线连接而成,对各种功能部件的控制是采用特殊功能寄存器的集中控制方式。 微处理器:

该单片机中有一个8位的微处理器,与通用的微处理器基本相同,同样包括了运算器和控制器两大部分,只是增加了面向控制的处理功能,不仅可处理数据,还可以进行位变量的处理。 数据存储器:

STCC52 有256 个字节的内部RAM,80H-FFH 高128 个字节与特殊功能寄存器(SFR)地址是重叠的,也就是高128字节的RAM 和特殊功能寄存器的地址是相同的,但物理上它们是分开的。当一条指令访问7FH 以上的内部地址单元时,指令中使用的寻址方式是不同的,也即寻址方式决定是访问高128 字节RAM 还是访问特殊功能寄存器。如果指令是直接寻址方式则为访问特殊功能寄存器。

程序存储器:

由于受集成度,片内有8KB Flash存储器,如果片内的只读存储器的容量不够,则需用扩展片外的只读存储器,片外最多可外扩至K字节。 中断系统:

具有8个中断源,2个外部中断源。 定时器/计数器:

片内有2个16位的定时器/计数器T0,T1,T2, 具有四种工作方式。 串行口:

1个全双工的串行口,具有四种工作方式。可用来进行串行通讯,扩展并行I/O口,甚至与多个单片机相连构成多机系统,从而使单片机的功能更强且应用更广。

输入/输出(I/O)口:

P0口、P1口、P2口、P3口为4个并行8位I/O口。 特殊功能寄存器:

在STCC52 片内存储器中,80H-FFH 共128 个单元为特殊功能寄存器(SFR),并非所有的地址都被定义,从80H—FFH 共128 个字节只有一部分被定义,还有相当一部分没有定义。对没有定义的单元读写将是无效的,读出的数值将不确定,而写入的数据也将丢失。 不应将数据写入未定义的单元,由于这些单元在将来的产品中可能赋予新的功能,在这种情况下,复位后这些单元数值总是“0”。 STCC52除了有STCC51所有的定时/计数器0 和定时/计数器1 外,还增加了一个定时/计数器2。定时/计数器2 的控制和状态位位于T2CON T2MOD,寄存器对(RCAO2H、RCAP2L)是定时器2 在16 位捕获方式或16 位自动重装载方式下的捕获/自动重装载寄存器。

引脚功能及管脚电压

STCC52为8 位通用微处理器,准的C51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。STCC52引脚图如图2-5:

图4-1 STCC52引脚图

主要管脚有:XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复

位电路。VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。P0~P3 为可编程通用I/O 脚,其功能用途由软件定义,在本设计中,P0 端口(32~39 脚)被定义为N1 功能控制端口,分别与N1的相应功能管脚相连接, 13 脚定义为IR输入端,10 脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12 脚、27 脚及28 脚定义为握手信号功能端口,连接主板CPU 的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。

P0 口

P0 口是一组8 位漏极开路型双向I/O 口, 也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8 个TTL逻辑门电路,对端口P0 写“1”时,可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8 位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash 编程时,P0 口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。

P1 口

P1 是一个带内部上拉电阻的8 位双向I/O 口, P1 的输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉 电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。 与STCC51 不同之处是,P1.0 和P1.1 还可分别作为定时/计数器2 的外部计数输入(P1.0/T2)和输入(P1.1/T2EX), 参见表。 Flash 编程和程序校验期间,P1 接收低8 位地址。

P2 口

P2 是一个带有内部上拉电阻的8 位双向I/O 口,P2 的输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻辑门电路。对端口P2 写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。在访问外部程序存储器或16 位地址的外部数据存储器(例如执行MOVX @DPTR 指令)时,P2 口送出高8 位地址数据。在访问8 位地址的外部数据存储器(如执行MOVX @RI 指令)时,P2 口输出P2 锁存器的内容。 Flash 编程或校验时,P2亦接收高位

地址和一些控制信号。

P3 口

P3 口是一组带有内部上拉电阻的8 位双向I/O 口。P3 口输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻辑门电路。对P3 口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的P3 口将用上拉电阻输出电流(IIL)。P3 口除了作为一般的I/O 口线外,更重要的用途是它的第二功能 P3 口还接收一些用于Flash 闪速存储器编程和程序校验的控制信号。

RST复位输入

当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。 ALE/PROG

当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8 位字节。一般情况下,ALE 仍以时钟振荡频率的1/6 输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE 脉冲。 对Flash 存储器编程期间,该引脚还用于输入编程脉冲(PROG)。 如有必要,可通过对特殊功能寄存器(SFR)区中的8EH 单元的D0 位置位,可禁止ALE 操作。该位置位后,只有一条 MOVX 和MOVC指令才能将ALE 激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE 禁止位无效。

PSEN

程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当STCC52 由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN 有效,即输出两个脉冲。在此期间,当访问外部数据存储器,将跳过两次PSEN信号。

EA/VPP

外部访问允许。欲使CPU 仅访问外部程序存储器(地址为0000H—FFFFH),EA 端必须保持低电平(接地)。需注意的是:如果加密位LB1 被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU 则执行内部程序存储器中的指令。 Flash 存储器编程时,该引脚加上+12V 的编程允许电源Vpp,当然这必须是该器件是使用12V 编程电压Vpp。

XTAL1

振荡器反相放大器的及内部时钟发生器的输入端。 XTAL2

振荡器反相放大器的输出端。 定时器0和定时器1:

STCC52的定时器0和定时器1 的工作方式与STCC51 相同。为了获得更深入的关于UART 的信息,选择“Products”,然后选择“8051-Architech Flash Microcontroller”,再选择“ProductOverview”即可。

定时器2

基本特性:定时器2 是一个16 位定时/计数器。它既可当定时器使用,也可作为外部事件计数器使用,其工作方式由特殊功能寄存器T2CON(如表3)的C/T2 位选择。定时器2 有三种工作方式:捕获方式,自动重装载(向上或向下计数)方式和波特率发生器方式,工作方式由T2CON 的控制位来选择。

中断

STCC52 共有6 个中断向量:两个外中断(INT0 和INT1),3 个定时器中断(定时器0、1、2)和串行口中断。这些中断源可通过分别设置专用寄存器IE 的置位或清0 来控制每一个中断的允许或禁止。IE 也有一个总禁止位EA,它能控制所有中断的允许或禁止。IE.6 为保留位,在STCC51 中IE.5 也是保留位。程序员不应将“1”写入这些位,它们是将来STC 系列产品作为扩展用的。

4.2LM324芯片

LM324系列器件带有真差动输入的四运算放大器。与单电源应用场合的标准运算放大器相比,它们有一些显著优点。

该四放大器可以工作在低到3.0伏或者高到32伏的电源下,静态电流为MC1741的静态电流的五分之一。共模输入范围包括负电源,因而消除了在许多应用场合中采用外部偏置元件的必要性。LM324的管脚连接图如下:

图4-2 LM324管脚连接图

每一组运算放大器可用图1所示的符号来表示,它有5个引出脚,其中“+”、“-”为两个信号输入端,“V+”、“V-”为正、负电源端,“Vo”为输出端。两个信号输入端中,Vi-(-)为反相输入端,表示运放输出端Vo的信号与该输入端的位相反;Vi+(+)为同相输入端,表示运放输出端Vo的信号与该输入端的相位相同。

4.3DA0832芯片

DAC0832是8分辨率的D/A转换集成芯片。与微处理器完全兼容。这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。DA0832分辨率(LSB)为8位,电流稳定时间为1us,有三种工作方式,即直通方式、单缓冲方式和双缓冲方式。工作方式的设置由19管脚ILE、2管脚WR和18管脚WR2决定,本设计采用直通方式,将2管脚和18管脚全部接地为低电平。另外DA0832采用单电源供电(+5V~15V),且在满量程内呈线性变化。

4.4 LCD1602显示器

①字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。

②LCD1602主要技术参数:,如图表3-1所示。

表4-1 1602的主要技术参数 工作电压: 容量 最佳工作电压 工作电流 字符尺寸

③引脚功能说明 如下图表3-2所示:

表4-2引脚接口说明表 4.5—5.5V 16×2个字符 5.0V 2.0mA 2.95×4.35(W×H)mm 1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表 编号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 符号 VDD VSS VL RS R/W E D0 D1 D2 D3 D4 D5 D6 D7 BLA BLK 引脚说明 正极 地 液晶显示偏压 数据/命令选择 读/写选择 使能信号 数据 数据 数据 数据 数据 数据 数据 数据 背光源正极 背光源负极 1602液晶模块的读写操作,屏幕和光标的操作都是通过指令编程来实现的。LCD1602主要有两种,主要区别在于是否背光,它的控制器主要为HD44780,带背光的比不带背光的厚,在应用中是否带背光并不影响使用。液晶显示模块是一个比较慢的显示器件,因此在执行指令之前要首先确认模块的忙标志处于低电平,表示空闲,不然此指令失效,输入显示字符地址后会显示字符。

5.硬件电路设计

根据设计的要求,本系统可分为电源模块、DA输出模块和稳压输出模块三大

重要部分,缺一不可。 5.1 电源电路

系统供电电源外接220V交流电,经过双12V变压器T1降压和整流桥整流变为直流,接着用电容滤波,最后用三端稳压芯片7812、7912、7805稳压后再经电容滤波就可得到+12V,-12V,+5V的电源。

图5-1 电路

5.3控制电路

控制电路由单片机,振荡电路,复位电路,按键电路等组成,晶振选取12MHZ,按键电路S1为设置切换(个位和小数位),S2为加1,S3为减1,S4为确定输出当前设定电压值。

图5-2 控制电路

5.3 DA输出电路

DA输出电路主要由74573寄存器,DAC0832,运放LM324构成,其中573负责传输存储由单片机送给的DAC032的数据,DAC0832与一级运放构成电压输出,二级运放构成电压放大电路。

图5-3 DA转换电路

5.4显示电路设计

显示电路主要由液晶1602,寄存器74573构成。液晶负责显示设计者名字拼音及当前设定电压值。

图5-4 显示电路图

6.系统软件设计

6.1 主程序流程图

程序开始以后,首先液晶初始化,显示液晶初试的预设电压值。然后进行按键检测,如果没有按键按下,显示液晶当前的初试电压;如果有按键按下,进入电压检测中断程序,确认当前液晶的调整值。接着检测D/A是否启动,启动以后进行数模转换,将转换后的模拟量送给系统最终输出端。系统总流程图如图6-1所示。

开始 程 序 初 始 化 键 盘 扫 描 检测 按键 Y 中 断 N 电压 检测 Y D/A 转 换 N 延时程序 显 示 程序 结束 图6-1 系统总流程图

6.2 DA转换流程图

DA转换流程图,如下如图6-2所示。

程序入口 初始化 读取键盘 输入数据 输出数据到DAC YES 数据=900 NO 输出

图6-2 DA转换流程图

7系统调试与仿真

7.1.硬件调试

做硬件焊接完成之后,我们必须对硬件进行调试,发现其中可能存在的问题,并对其进行改进。 硬件调试的方法有两种:

方案一用万用表和其他仪器仪表进行检测 方案二采用软件测试硬件的方法进行检测 方法分析:

这两种方法各有优点,方法一能直接准确的确定元件的故障所在点,并直接进行故障排除。但是此方法必须对元件进行一一检测,检测的过程非常慢。对于一个大系统和元件比较多的电路来说,此种方法不适合

方法二用软件来控制硬件,编写某一电路的控制程序,看这部分的电路的运行结果是否与书的软件控制的效果一致。如果不一致,则证明这部分电路有问题。这种方法可以迅速的判断某一部分电路的故障,对于大系统来说,这种方法可以

缩小故障的范围,再对所出现的故障进行排除,节约系统调试的时间。

这个数控直流稳压电源系统中,我们把电路分成几个小模块,采取方法一和方法二相结合的测试方法进行测试。 测试步骤:

(1)用万用表对电路中的电源线进行测量,我们先用万用表的蜂鸣档,将万用表的红黑表笔接到电路电源线进行测量,若发现蜂鸣器响,则证明电源线有短路。如蜂鸣器没有响,则证明电源线无短路现象。

(2)再用蜂鸣档对单片机的电源、晶振、复位等电路进行测量,看有没有连接好。若连接正常,则对系统进行通电。通电前先拨出单片机。

(3)测量单片机的工作电压。看是否正常,若不正常。再用万用表进行检测,排除电源故障。

(4)若电源工作正常,插上单片机。编程控制,数码管的亮灭,以及数码管按键等,看是否正常。若都正常,测证明电路硬件连接无误。若有故障,再用万用表对出故障的模块进行检测。 7.2软件调试

软件调试是建立在硬件调试的基础之上的。调试完硬件之后,我们就开始编写程序,对程序进行调试。我们先画出程序的流程图,然后根据流程图来编写程序。

程序编写调试方法:

方法一:根据流程图,直接编写。

方法二:先编写部分模块的程序,再对模块程序进行整合。 方法分析:

方法一中直接根据流程图写,适合小规模的程序,对于大规模的程序不适合,且程序的可移植性差。

方法二中可以移植相似的程序,节约程序编写的工作量。对于大规模的程序比较适合。程序的编写也相对比较轻松。可以节约程序的编写时间。 在本系统中,我们采取方法二来进行软件的编写与调试 程序编写和调试方法:

(1)建立主程序,定义各端口。

(2)写出数码管、按键的模块程序。 (3)对各模块程序进行整合。 (4)对最终的程序进行优化。 7.3系统仿真与误差分析

7.3.1软件调试

整个软件通过C语言编程,先在Keil C51集成开发环境下将编好的程序进行编译、调试,调试通过后会生成.HEX文件。

图7-3 protues仿真图

预设输出电压(V)

0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0

实际输出电压(V)

0.57 0.98 1.95 2.93 3.90 4.88 5.86 6.82 7.80 8.77 9.75

表1: 仿真数据

误差(x)

0.57 0.02 0.05 0.07 0.10 0.12 0.14 0.18 0.20 0.23 0.25

预设输出电压(V)

0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 7.3.1误差分析

由于上述仿真数据在相同条件下多次测量同一量值时,绝对值和符号均不改变,为此上述数据的误差只可能是系统误差,不可能是随机误差[8]。下面分别计算出上述数据的绝对误差。绝对误差定义为被测量值x和测量的真值A的差值。上述把预设的电压作为真值,绝对误差用符号x表示。

计算出上述数据绝对误差的平均值:

1i10Δx=11(x1x2x3....x9x10)[8]=0.12

i0实物数据在预设电压为0V时,第一级运算放大后的电压值调整不到零,总是从3.0V开始,然后预设电压每增加1V,第一级运放后的电压增加0.2V,即预设电压值为1V时,第一级运放后的电压为3.2V,当然第二级放大5倍后最终输出是15V左右。从3.2V开始线性变化而没有从0V开始线性变化是本设计没有调试成功的根源所在。如果第一级运放后的电压能从0开始的话,整个输出就和理论相符。因此测出的实物数据是错误的,无法再进行误差分析。

实际输出电压(V)

3.20 4.10 5.30 6.20 7.10 8.20 9.00 9.50 9.60 9.70 9.70

表2: 实物数据 误差(x)

3.20 3.10 3.30 3.20 3.10 3.20 3.00 2.50 1.60 0.70 0.70

8结束语

这次设计数控直流稳压电源,是毕业前对我们大学四年所学知识的一个检验。检验我们的硬件设计能力,软件设计能力,还有查阅资料与人沟通等各方面的能力。同时也将我们大学四年的知识运用到实践中。

在设计的过程中,我首先设计硬件,要画原理图。以前的课程中学过画图软件。但是由于长时间没有用,并且那时上这个门时练习不多也不怎么熟练,所以

在设计原理图的过程中很吃力,不得不查找相关资料,再进行画图。经过几天的查找资料看其操作教程,最后完成了原理图设计。

在编写软件时,为了能尽快把程序调试好,我学习了Proteus仿真软件,利用这个仿真软件,在线实时调试程序。因为利用Proteus在程序编译完成后,就可以直接运行程序。而如果不仿真,则每次要将编译完成的代码通过下载线下载到单片机里面,再通电运行,这样很浪费时间。所以我先在Proteus仿真软件里面进行仿真,仿真好了之后,再下载到单片机里面进行检验。

在写程序时,也遇到了不少问题,自己平时没有经常的练习写程序,所以在面对这样一个系统时,不知道从哪里下手。于是在网上找了相关的例程来学习。经过几天的学习,终于找到一点当年写程序的感觉了。在调试的过程中虽然遇到一些困难,但是通过请教周围的朋友,最终得以解决。

完成硬件与软件的设计之后,再回顾此电源的设计,心中感慨万千,从理论到实践,让我明白了,学校里面学了很多很多的东西,但是我们要和实践相结合,否则就是空理论。只有将理论转化为实践,才能真正的走出校门,走向社会,完成从学生到社会型人才的转变。

参考文献

[1]邹红.数字电路与逻辑设计[M].北京:人民邮电出版社,2008.3 [2]李祥臣.模拟电子技术基础教程.[M].北京:清华大学出版社,2005.3 [3]童诗白,华成英.模拟电子技术基础[M].北京:高等教育出版社,2006.1 [4]邱关源.电路(第四版)[M].北京:高等教育出版社,2006.4

[5]李群芳,张士军,黄建.单片微型计算机与接口技术(第二版)[M].北京:电子工业出版社,2007.12

[6]刘文涛.单片机语言C51典型应用设计[M].北京:人民邮电出版社,2006.5 [7]于永,戴佳,常江.51单片机实例精讲[M].北京:电子工业出版社,2007.4 [8]曹凤.微机数控技术及应用[M].四川:电子科技大学出版社,2002.8 [9]胡寿松.自动控制原理[M].北京:科学出版社,2007.1

[10]潘永雄,沙河,刘向阳.电子线路CAD实用教程(第二版)[M].陕西:西安电子科技大学出版社,2006.9

谢辞

在论文完成之际,我要忠心的感谢身边给予过我莫大帮助的老师、同学和朋友,致以他们最诚挚的谢意。

本研究及学位论文是在我的指导教师的亲切关怀和悉心指导下完成的。他严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我。从课题的选择到项目的最终完成,老师都始终给予我细心的指导和不懈的支持。老师多次询问研究进程,并为我指点迷津,帮助我开拓研究思路,精心点拨、热忱鼓励,这让我在整个论文的撰写过程中学习到了很多关于课题研究方面的知识。

真诚的感谢参加论文评审和答辩的各位老师,感谢你们的辛勤劳动和即将从你们那里获得的有益教诲;感谢同学们在设计中给予的指导和帮助。

在这四年的学期中结识的各位生活和学习上的挚友让我得到了人生最大的一笔财富。在此,也对他们表示衷心感谢。

本文参考了大量的文献资料,在此,向各学术界的前辈们致敬。最后要感谢的是我的父母和家人,感谢他们多年来对我默默的支持和帮助。由衷的希望在未来的日子里,周围的老师、同学和朋友们一如既往的在各方面继续给予我更多的指教和帮助,以期取得新的进步和成绩来回报大家。

附录一 元器件清单 序号 型号 规格 序号 型号 规格 名称 数量 名称 数量 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

单片机 液晶显示 电源变压器 C52 LCD1602 双12V 1 1 1 1 2 1 2 1 1 1 5 1 3 1 1 16 17 18 19 20 21 22 23 24 25 26 27 28 电解电容 瓷片电容 瓷片电容 石英晶振 排阻 通用实验板 通用实验板 10uF 104 30pF 12MHz A331G 12*18 6.5*9 1 8 2 1 1 1 1 1 1 4 若干 若干 若干 数模转换器 DAC0832 运算放大器 运算放大器 锁存器 三端稳压器 三端稳压器 三端稳压器 按键 自锁开关 电解电容 电解电容 电解电容 LM358 Lm324 74HC573 L7812 L7912 L7805 12*12*8 双路 1000uF 470uF 100uF 发光二极管 黄色3mm 发光二极管 绿色5mm 整流二极管 杜邦线 色环电阻 可变电阻 IN4007 彩色 各规格 各规格

附录二 实物图

附录三 源程序代码 #include

#define uchar unsigned char #define uint unsigned int

sbit key1=P1^0; sbit key2=P1^1; sbit key3=P1^2; sbit key4=P1^3; sbit rs=P1^4; sbit en=P1^5; sbit w1=P1^6; sbit w2=P1^7;

sbit DAC_CS=P3^2; sbit DAC_WR=P3^6;

uchar code table1[]=\"sunyuandu design \"; uchar code table2[]=\" voltage 0.0V \"; uchar ge,shifen,keynum,volt;

void delay(uint z) {

uint x,y;

for(x=z;x>0;x--) for(y=110;y>0;y--); }

void write_com(uchar com) {

rs=0; en=0; P0=com; delay(5); w1=1; en=1; delay(5); en=0; }

void write_dSTCe(uchar dSTCe) {

rs=1; en=0;

P0=dSTCe;

//端口定义 // 设计者拼音字母// 电压值 //延时函数 //写指令到1602 //写数据到1602

delay(5); w1=1; en=1; delay(5); en=0; }

void Init() //初始化 {

uchar num; en=0;

write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80);

for(num=0;num<16;num++) { write_dSTCe(table1[num]); delay(50); } write_com(0x80+0x40); for(num=0;num<14;num++) { write_dSTCe(table2[num]); delay(50); } }

void write_voltage(uchar add,uchar dSTC) {

write_com(0x80+0x40+add); write_dSTCe(0x30+dSTC); }

void da0832out(uchar dadSTCa) {

w1=0; w2=1;

DAC_CS=0; P0=dadSTCa; DAC_WR=0; delay(5); DAC_WR=1; DAC_CS=1; w2=0; }

//写电压到1602 //写电压数据到DAC0832 void keyscan() //键盘扫描 {

if(key1==0) {

delay(5); if(key1==0) {

keynum++; while(!key1); if(keynum==1) {

write_com(0x80+0x40+12); write_com(0x0f); } }

if(keynum==2) {

write_com(0x80+0x40+10); write_com(0x0f); }

if(keynum==3) {

keynum=0;

write_com(0x0c); } }

if(keynum!=0) {

if(key2==0) {

delay(5); if(key2==0) {

while(!key2); if(keynum==1) {

shifen++;

if(shifen==10)shifen=0;

write_com(0x80+0x40+11); write_com(0x0c); write_voltage(12,shifen); }

if(keynum==2) {

ge++;

if(ge==10)ge=0;

write_com(0x80+0x40+9); write_com(0x0c); write_voltage(10,ge); } } }

if(key3==0) {

delay(5); if(key3==0) {

while(!key3); if(keynum==1) { shifen--;

if(shifen==-1)shifen=9;

write_com(0x80+0x40+11); write_com(0x0c);

write_voltage(12,shifen); }

if(keynum==2) {

ge--;

if(ge==-1)ge=9;

write_com(0x80+0x40+9); write_com(0x0c); write_voltage(10,ge); } } }

if(key4==0) {

delay(5); if(key4==0) {

while(!key4);

volt=10*ge+shifen; da0832out(volt); } }

} }

void main() //主函数 {

w1=0; w2=0; Init(); ge=0;

shifen=0; while(1) {

keyscan(); }

while(1); }

#include

#define uchar unsigned char #define uint unsigned int

sbit key1=P1^0; sbit key2=P1^1; sbit key3=P1^2; sbit key4=P1^3; sbit rs=P1^4; sbit en=P1^5; sbit w1=P1^6; sbit w2=P1^7;

sbit DAC_CS=P3^2; sbit DAC_WR=P3^6;

uchar code table1[]=\"sunyuandu design\"; uchar code table2[]=\" voltage 0.0V \"; uchar ge,shifen,keynum,volt;

void delay(uint z) //端口定义 //显示设计者拼音姓名 //显示电压值 //延时函数

{

uint x,y;

for(x=z;x>0;x--) for(y=110;y>0;y--); }

void write_com(uchar com) //写指令到1602 {

rs=0; en=0; P0=com; delay(5); w1=1; en=1; delay(5); en=0; }

void write_dSTCe(uchar dSTCe) {

rs=1; en=0;

P0=dSTCe; delay(5); w1=1; en=1; delay(5); en=0; }

void Init() {

uchar num; en=0;

write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80);

for(num=0;num<16;num++) { write_dSTCe(table1[num]); delay(50); } write_com(0x80+0x40); for(num=0;num<14;num++) {

//写数据到1602 //初始化 write_dSTCe(table2[num]); delay(50); } }

void write_voltage(uchar add,uchar dSTC) //写电压到1602 {

write_com(0x80+0x40+add); write_dSTCe(0x30+dSTC); }

void da0832out(uchar dadSTCa) {

w1=0; w2=1;

DAC_CS=0; P0=dadSTCa; DAC_WR=0; delay(5); DAC_WR=1; DAC_CS=1; w2=0; }

void keyscan() {

if(key1==0) {

delay(5); if(key1==0) {

keynum++; while(!key1); if(keynum==1) {

write_com(0x80+0x40+12); write_com(0x0f); } }

if(keynum==2) {

write_com(0x80+0x40+10); write_com(0x0f); }

if(keynum==3) {

keynum=0;

//写电压数据到DAC0832 //键盘扫描 write_com(0x0c); } }

if(keynum!=0) {

if(key2==0) {

delay(5); if(key2==0) {

while(!key2); if(keynum==1) {

shifen++;

if(shifen==10)shifen=0;

write_com(0x80+0x40+11); write_com(0x0c); write_voltage(12,shifen); }

if(keynum==2) {

ge++;

if(ge==10)ge=0;

write_com(0x80+0x40+9); write_com(0x0c); write_voltage(10,ge); } } }

if(key3==0) {

delay(5); if(key3==0) {

while(!key3); if(keynum==1) { shifen--;

if(shifen==-1)shifen=9;

write_com(0x80+0x40+11); write_com(0x0c);

write_voltage(12,shifen);

}

if(keynum==2) {

ge--;

if(ge==-1)ge=9;

write_com(0x80+0x40+9); write_com(0x0c); write_voltage(10,ge); } } }

if(key4==0) {

delay(5); if(key4==0) {

while(!key4);

volt=10*ge+shifen; da0832out(volt); } } } }

void main() //主函数 {

w1=0; w2=0; Init(); ge=0;

shifen=0; while(1) {

keyscan(); }

while(1); }

因篇幅问题不能全部显示,请点此查看更多更全内容