第一章 直流稳压电源的基本原理
在电子电路中,通常都需要电压稳压的直流电源供电。日常生活中也需要将交流电转变成直流电,形成直流稳压电源。一般直流稳压电源由电源变压器、整流电路、滤波电路和稳压电路等四部分组成。
图1 直流稳压电源的工作原理
电源变压器是将交流电网220V 的电压变为所需要的电压值,然后通过整流电路将交流电压变为脉动的直流电压,由于此脉动的直流电压还含有较大的纹波,必须通过滤波电路加以滤除,从而得到平滑的直流电压。但这样的电压还随电网电压波动(一般10%左右的波动)、负载和温度的变化而变化。因而在整流、滤波电路之后,还需接稳压电路。稳压电路的作用是当电网电压波动、负载和温度变化时,维持输出直流电压稳定。
1.1 整流电路
整流电路的任务是将交流电变换成直流电。完成这一任务主要靠二级管的单向导电作用。因此二极管是构成整流电路的关键元件。常见的几种整流电路有单相半波、全波、桥式和倍压整流。我主要研究了单项桥式整流电路。
1.1.1 单相桥式整流电路
图2 单相桥式整流电路
图2中Tr 为电源变压器,它的作用事将交流电网电压变成整流电路要求的交流电压。单相桥式整流电路是由四个二极管接成电桥的形式构成的。设电源变压器二次侧电压U=Usinwt(v),在U 的正半周,极性为上正下负,此时二极管D1、D3承受正向电压而导通,D2、D4反向截止,电流i 的通路是a →D1→RL →D3→b 。负载RL 上又得到半波电压。在U 的负半周,极性为上正下负,此时二极管D2、D4导通,D1、D3
i 的通路是b →D2→RL →D4→a 。负载RL 上
又得到半波电压。RL U 是单方向全波脉动(图3) 。
a
b
图3 单相桥式整流滤波电路波形图
要使之接近于理想的直流电压,在整流之后需加滤波电路,将单向脉动电压中的交流分量尽量多地滤掉。
1.2 滤波电路
滤波电路用于滤去整流输出电压中的纹波,一般由电抗元件组成,如在负载电阻两端并联电容器C ,或与负载串联电感器L ,以及由电容、电感组合而成的各种复式滤波电路。滤波电路的形式有很多,分为电容输入式和电感输入式。
1.2.1电容滤波电路
采用一只容量较大的电解质电容器,所以要注意其极性,其正极要接电路高电位端,负端要接电路低电位端。若极性接反,过高的反向电压可能击穿电容器。
图4 桥式整流、电容滤波电路
图5 交流电压U 的波形
如图4,由于电容C1并联在负载电阻R1上,所以电容C1两端的电压U C 就是负载的电压U O ,交流电压U 的波形(如图5);假设,电路接通时,恰恰在
电压U 由负到正过零的时刻,这时二极管开始导通,电压U 通过二极管向电容C1充电,由于二极管的正向电阻很小,所以充电时间常数很小,电压U C 将随着电压U 按正弦规律逐渐升高,当U 增大到最大值时,U C 也随之上升到最大值。
然后U 开始下降,U C 也开始下降,但他们按不同规律下降,U 按正弦规律下降,
而电容C1则通过负载R1放电,电容端电压U C 按指数规律下降,由于放电时间
常数较大,U C 下降缓慢。除了刚过最小值的一小段时间内,仍有U C =U的关系外,之后就出现UU C 以后,二极管才又导通,电容C1由放电状态重
新变为充电状态,U C 又随着U 上升。如此继续下去,电压U C 也就是负载电压
U L 就变得平滑了,因而负载电压的平均值也有所增大了。如果电容滤波电路接
于桥式整流电路,则在交流电压的一个周期内,电容C1有两次充、放电,其放电时间比上述半波整流后所接电容滤波电路要短,故输出电压更为平滑。电容滤波使整流输出电压波形变得平直的原因,还可以从电容C1对脉动电流中的交流成分具有旁路作用来理解。由于电容C1与负载电阻R1并联,C1的容量愈大,整流后所得的脉动电流交流分量的频率愈高,则电容C1的荣康、、容抗愈小,而电阻R1 的阻值与频率无关,因此,脉动电流中的交流成分主要通过电容C1而被旁路,R1上的电流和电压便较为平直了。
1.2.2 电感滤波电路
图6 电感滤波电路
如图6是电感滤波电路,它是在整流电路的输出端和负载电阻R 之间串联一个电感线圈。电感中流过的电流发生变化时,线圈中要产生自感电动势阻碍电流的变化。当电流增加时,自感电动势的方向与电流方向相反,自感电动势阻碍电流的增加,同时将能量储存起来,使电流增加缓慢。反之,当电流减小时,自感电动势的方向与电流的方向相同,自感电动势阻止电流的减小,同时将能量释放出来,使电流减小缓慢,因而使负载电流和负载电压脉动大为减小。
如果要求输出电流较大,输出电压脉动很小时,可在电感滤波电路之后再接电容C 。组成LC 滤波电路。电感滤波之后,利用电容再一次滤掉交流分量,这样,便可得到更为平直的直流输出电压。上面讨论的整流滤波电路,输出电压已较平滑,但却不稳定,当用一个不稳定的电压对负载供电时,会引起负载工作不稳定,甚至不能正常工作。为了得到稳定的直流输出电压,在整流滤波电路之后,需要增加稳压电路。
1.3 稳压电路
稳压电路用的比较多的稳压电路是硅稳压管稳压电路。如图7是硅稳压管稳压电路,由稳压管D2和调整电阻R1组成,稳压管在电路中应为反向联接,它与负载电阻R1并联后,再与调整电阻串联。下面分析一下稳压原理。
图7 硅稳压管稳压电路
1)负载电阻R1不变,交流电源电压波动时的稳压情况:当负载电阻不变,支流电源电压增加时,整流滤波电路的电压U o 随之增加,负载电压U L 也将增加,而U L 就是稳压管两端的反向电压。当U L 稍有增加,稳压管的电流I Z 就会显著增加,因此电阻R1上的压降增加,从而使增大了的负载电压U L 的数值有所减小。如果电阻R1的阻值选择适当,最终可使U L 基本上保持不变。同理
如果交流电压降低,使U o 减小,则U L 也减小,I Z 也随着减小,则U R 也减小,仍保持负载电压U L 近似不变。
2)电源电压不变、负载电流变化时的稳压情况:假设交流电源电压不变,由于负载电阻变化而使负载电流增大,则电阻R1上的电压降增大,负载电阻R1上的端电压U L 因而下降,U L 下降一点,稳压管的电流I Z 显著减小,使已经
降低的负载电压U L 回升,与原来数值比较可基本保持不变。当负载电流减小时,
稳压过程相反。
经半波最好是全波整流,再由稳压电路最终送给负载的电压就是比较稳定的支流电了。由以上几部分电路就组成了直流稳压电源,它将广泛地应用到实践中。
第二章 数控恒压源的实现方案
传统的直流稳压电源输出是通过粗调波段开关及细调电位器来调节的,并由电位表指示电压值的大小。这种直流稳压电源存在读数不直观、电位器易磨损、稳压精度不高、不易调准、电位构成复杂、体积大等缺点,而基于单片机控制的数控直流电源不但实现了直流稳压的功能,而且没有上述的缺点。
2.1 设计目标
1)电源输出电压范围0.0V-15.0V ,步长0.06V ,输出电压值由液晶显示器显示。
2)用户对数控恒压源的控制,通过按键进行控制。
3)整机由自制稳压电源供电,输入交流220V ,输出直流+5V。
2.2 实现框图
整个电源(如图10
)分成三个主要部分:供电部分、稳压输出部分和数控部分。
图8 稳压直流电源总框图
第三章 供电和稳压输出部分
供电部分简单,不做详细论述。
3.1 稳压输出部分仿真图
Ω
图9 模拟部分中的稳压电路稳定性验证图
一般的直流稳压电源是用可变电阻来实现输出电压的调节,那么要在直流稳压电源的基础上实现数字控制的话,实际上很简单,我们只要将可变电阻换成数字控制部分来代替,就能实现数控恒压源这一课题。所以,首先要做的,就是选择合适的稳压输出电路并对其可行性进行了仿真。如图9,很容易就验证了此稳压输出电路的可靠。
3.2 供电和稳压输出部分电路图
这部分将数控部分送来的电压控制字转换成稳定电压输出,电路主要由供电、整流滤波、稳压输出、过流保护和延时启动等几部分组成。(如图10)
D/A转换部分的输出电压作为稳压输出电路的参考电压。稳压输出电路的输出与参考电压成比例。稳压输出电路采用的是串联式反馈稳压电路(如图9),在电路中,Q1—TIP122为调整管,U6A —LM358 为比较放大器,R19、R22组成反馈网络。D/A转换电路的输出电压DAOUT 接到 U6A 的同向端,稳压电源的输出经R19、R22组成的取样电路分压后送到运放U6A 的反向端,经运放比较放大后,驱动调整管Q1。当电路平衡时,D/A电路的输出电压V DAOUT 与取样后的电压V REF 相等。
稳压输出部分的过流保护电路由R21和Q2组成。设I m 为保护动作电流,则
当电源输出电流I 增加到I m 时,R21上的压降I m *R21使得Q2管导通,分掉了Q1
上的基极电流,使输出I 不再增加,起到了过流保护作用。
图10 供电和稳压输出部分
第四章 数字控制部分
4.1 单片机部分
图11 单片机控制部分
控制部分是系统整机协调工作和智能化管理的核心部分,采用89C52单片机实现控制功能是其关键,采用单片机不但方便监控,并且大大减少硬件设计。
I10,I9属微调,步长为0.0586V ,I10加,I9减;I8,I7属粗调,步长为0.9961V ,I8加,I9减。
4.2 D/A转换部分
系统设置A/D、D/A转换接口,采用美国TI 公司的高速串行8位模数转换器TLC549和四通道串行数模转换器TLC5620。
图12 D/A转换部分
D/A转换部分的输出电压作为稳压输出电路的参考电压。稳压输出电路的输出与参考电压成比例。8位字长的D/A转换器具有256种状态。当电压控制字从0,1,2,……到256时,电源输出电压为0.0,0.06,……15.0。
TLC5620是八位的串行输入四路电压输出的数模转换器。
其时序图如图13:
图13 TLC5620 数模转换时序图
Clk 为时钟端,Data 为输入数据,LOAD 为输入控制信号。
每路电压输出值的计算: data ⨯2 V 0=REF ⨯256
REF 为参考电压,data 为输入8位的比特数据;
我们这里用的REF=2.5v;
4.3 A/D转换部分
图14 A/D转换部分
TLC549是采用LinCMOSTM 技术,以开关电容逐次逼近原理工作的8位串行A/D
芯片。单电源3V ~6V 供电范围,控制口线少,时序简单,转换速度快,功耗低,价格便宜,适用于低功耗的袖珍仪器上的单路A/D采样,也可将多个器件并联使用。
TLC549是8位串行A/D转换器芯片,可与通用微处理器、控制器通过I/O CLOCK 、CS 、DATA OUT 三条口线进行串行接口。具有4MHz 片内系统时钟和软、硬件控制电路,转换时间最长17μs,TLC549允许的最高转换速率为40 000次/s。总失调误差最大为±0.5LSB ,典型功耗值为6mW 。采用差分参考电压高阻输入,抗干扰,可按比例量程校准转换范围,V REF-接地,V REF+-V REF-≥1V ,可用于较小信号的采样。 TLC549的极限参数如下: ●电源电压:6.5V ;
●输入电压范围:0.3V ~V CC +0.3V ; ●输出电压范围:0.3V ~V CC +0.3V ; ●峰值输入电流(任一输入端) :±10mA ; ●总峰值输入电流(所有输入端) :±30mA ; ●工作温度:TLC549C:0℃~70℃ TLC549:-40℃~85℃ TLC549M:-55℃~125℃
TLC549片型小,采样速度快,功耗低,价格便宜,控制简单。适用于低功耗的袖珍仪器上的单路A/D或多路并联采样。
TLC549均有片内系统时钟,该时钟与I/O CLOCK是独立工作的,无须特殊的速度或相位匹配。
当CS 为高时,数据输出(DATA OUT)端处于高阻状态,此时I/O CLOCK不起作用。这种CS 控制作用允许在同时使用多片TLC548、TLC549时,共用I/O CLOCK ,以减少多路(片)A/D并用时的I/O控制端口。一组通常的控制时序为: (1)将CS 置低。内部电路在测得CS 下降沿后,再等待两个内部时钟上升沿和一个下降沿后,然后确认这一变化,最后自动将前一次转换结果的最高位(D7)位输出到DATA OUT端上。
(2) 前四个I/O CLOCK周期的下降沿依次移出第2、3、4和第5个位(D6、D5、D4、D3) ,片上采样保持电路在第4个I/O CLOCK 下降沿开始采样模拟输入。
(3)接下来的3个I/O CLOCK 周期的下降沿移出第6、7、8(D2、D1、D0) 个转换位,
(4)最后,片上采样保持电路在第8个I/O CLOCK 周期的下降沿将移出第6、7、8(D2、D1、D0) 个转换位。保持功能将持续4个内部时钟周期,然后开始进行32个内部时钟周期的A/D转换。第8个I/O CLOCK 后,CS 必须为高,或I/O CLOCK 保持低电平,这种状态需要维持36个内部系统时钟周期以等待保持和转换工作的完成。如果CS 为低时I/O CLOCK 上出现一个有效干扰脉冲,则微处理器/控制器将与器件的I/O时序失去同步;若CS 为高时出现一次有效低电平,则将使引脚重新初始化,从而脱离原转换过程。
在36个内部系统时钟周期结束之前,实施步骤(1)-(4),可重新启动一次新的A/D转换,与此同时,正在进行的转换终止,此时的输出是前一次的转换结果而不是正在进行的转换结果。
若要在特定的时刻采样模拟信号,应使第8个I/O CLOCK 时钟的下降沿与该时刻对应,因为芯片虽在第4个I/O CLOCK时钟下降沿开始采样,却在第8个I/O CLOCK的下降沿开始保存。
本设计中A/D的采样电压是稳压输出电路的取样电压V REF 。V REF 与输出电压V o 的关系:
V REF =
R 19
(4-1) V o
R 19+R 22
因此可以通过一定的比例调整来得到输出电压V o 的数字显示值。
4.4 绘制PCB
图15 总电路的PCB
4.5 总电路软件实现流程图
图16 总流程图
程序见后面附录。
第五章 电源测试结果
5.1电压测试
5.2 性能测试
用单片机控制电源时,输出直流0-15V ,液晶显示器显示清晰正确,误差极小,完美的实现了数控恒压源这一课题。
但在功能上还不够强大, 如没有开机的电压预置功能,没有电流过流时的报警指示功能等等,还可以进一步得到提高。
结 论
本文先对直流稳压电源原理进行了论述,主要是对整流电路、滤波电路和稳压电
路等几部分功能进行了论述;然后通过仿真进行稳压输出电路可行性研究,最终
确定了数控恒压源的方案。绘制PCB 版,制作完成硬件部分,然后对硬件进行了
测试;编写单片机程序实现软件部分;通过对整个数控衡压源的调试完善,最终
实现了数控恒压源的制作,实现了数字控制稳定电压输出的功能。但在制作上还
有进一步提高的可能,如开机预置电压输出,过流保护警报指示等等。
致 谢
大学生活即将结束,回想这四年有苦有甜。在最后的毕业设计过程中,我得
到了很多老师和同学的帮助,也学到了很多平时在学习中无法学到的东西。在此,
我要感谢所有曾经教导过我的老师和关心过我的同学,是他们在我的成长过程中
给予了我足够的帮助。本文能够顺利的完成,要特别感谢我的导师殷奎喜老师的
关怀和教导;还有我的同学蔡红雷在硬件电路的设计和电子器件的选择上给了我
很多的意见,潘应云同学在单片机的编程上给了我特别多的帮助,使我能够顺利
完成毕业设计。
参考文献
[1]7—04—007241—6 康华光 电子技术基础 高等教育出版社
[2]1000—5013(2001)04—0371—05 AT89C51单片机数控多路直流稳压电源
华侨大学学报(自然科学报) 第22卷第4期2001年10月
[3]1002—8743(2004)02—0055—05 串联型直流稳压电源的仿真分析 广西
师范学院学报 第21卷第2期
[4]高稳定度稳压电源(GWE-1)的研制 西南石油学院学报 第17卷第3期
1年8月
[5]1671—1041(2003)01—0013—02 基于TL431的直流稳压电源设计 设计师
笔记
[6]基于单片机的高品质直流电源 电子产品世界 2005,1/下半月 [7]基于先进集成电路多输出线性直流稳压电源设计 中文核心期刊《微计算机
信息》(测控自动化) 2005年第21卷第1期
[8]1673—0062(2005)0063—04 数字可调式高压直流稳压电源的设计 南
华大学学报(自然科学版) 第19卷2005年9月
[9]用单片机制作的直流稳压可调电源 电子世界 2005年第11期
[10]刘华毅,李霞,徐景德 电力电子技术 第35卷第六期2001年12月 [11]7-81012-969-4 何立民 单片机中级教程 北京航空航天大学出版社 [12]7-115-13713-7 陈小忠、黄宁、赵小侠 单片机接口技术实用子程序 人民邮电出版社
[13]Matthew R, Robin T. M icrop rocessor controlled pow er supp
ly[J ].ElectronicWorldW -irelessWorld, 1994,95 (1 639) : 524~ 527
附录
//包函数调用
#include #include
//显示器数据口定义 #define lcd1602_bus P0
/******************tlc549 port*********************/ //tlc549接口定义 sbit cs_549=P1^2; sbit data_549=P1^1; sbit clk_549=P1^0;
/*******************tlc5620 port***********************/ //tlc5620接口定义 sbit load_5620=P1^3; sbit clk_5620=P1^4; sbit data_5620=P1^5;
/***************lcd1602 port******************************/ //lcd1602显示器接口定义 //引脚定义
sbit rs_1602=P2^5; sbit rw_1602=P2^6; sbit e_1602=P2^7;
/*************************************/
/*****************tlc549 output variable**********************/ //tlc549 全局变量定义
unsigned char bdata adc_549; //bdata //bit data area sbit adc_549low=adc_549^0; //最低位
//ASCII码表
/**********0---9**************/ unsigned int table[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
unsigned int set[5]; //setting unsigned int mea[5]; //measure unsigned int ad[5]; //ad data
//输入数据的ASCII 码转换函数
code
hexstoascii_set(unsigned int hex)
{
set[0]=table[hex/10000];
hex=hex%10000;
set[1]=table[hex/1000];
hex=hex%1000;
set[2]=table[hex/100];
hex=hex%100;
set[3]=table[hex/10];
hex=hex%10;
set[4]=table[hex];
}
//测量数据的ASCII 码转换函数
hexstoascii_mea(unsigned int hex)
{
mea[0]=table[hex/10000];
hex=hex%10000;
mea[1]=table[hex/1000];
hex=hex%1000;
mea[2]=table[hex/100];
hex=hex%100;
mea[3]=table[hex/10];
hex=hex%10;
mea[4]=table[hex];
}
/***********************549convert**************************************************************/
//tlc549 子程序
/**************adc_549convert*******************/
unsigned char adc_549convert()
{ unsigned char i;
cs_549=1;
cs_549=0;
clk_549=0;
for(i=0;i
{ clk_549=1;
adc_549low=data_549; //read one bit
clk_549=0;
if(i
}
clk_549=0;
cs_549=1;
return(adc_549);
}
/*****************end of adc_549convert************/
/*********************dac_5620******************************/ //tlc5620子程序(四个通道)
void dac_5620(unsigned char dataa,unsigned char datab,
unsigned char datac,unsigned char datad)
{
unsigned char i;
/****************dataa************/
load_5620=1;
clk_5620=1; data_5620=0; clk_5620=0;
clk_5620=1; data_5620=0; clk_5620=0;
clk_5620=1; data_5620=1; clk_5620=0;
for(i=0;i
{
clk_5620=1;
if(dataa & 0x80) data_5620=1;
else data_5620=0;
clk_5620=0;
dataa=dataa
}
load_5620=0;
_nop_();
load_5620=1;
/************datab*************/
load_5620=1;
clk_5620=1; data_5620=0; clk_5620=0;
clk_5620=1; data_5620=1; clk_5620=0;
clk_5620=1; data_5620=1; clk_5620=0;
for(i=0;i
{
clk_5620=1;
if(datab & 0x80) data_5620=1;
else data_5620=0;
clk_5620=0;
datab=datab
}
load_5620=0;
_nop_();
load_5620=1;
/************datac*******************/
load_5620=1;
clk_5620=1; data_5620=1; clk_5620=0;
clk_5620=1; data_5620=0; clk_5620=0;
clk_5620=1;data_5620=1; clk_5620=0;
for(i=0;i
{
clk_5620=1;
if(datac & 0x80) data_5620=1;
else data_5620=0;
clk_5620=0;
datac=datac
}
load_5620=0;
_nop_();
load_5620=1;
/***************datad***************/
load_5620=1;
clk_5620=1; data_5620=1; clk_5620=0;
clk_5620=1; data_5620=1; clk_5620=0;
clk_5620=1; data_5620=1; clk_5620=0;
for(i=0;i
{
clk_5620=1;
if(datad & 0x80) data_5620=1;
else data_5620=0;
clk_5620=0;
datad=datad
}
load_5620=0;
_nop_();
load_5620=1;
}
/***********************end of dac5620****************************/
/**************************lcd1602*******************************/ //lcd1602液晶显示子程序(四个通道)
/*********延时子程序**********/
void delay_1602(unsigned char dy)
{
while(--dy);
/***********忙判断标志,返回一个位BF********************/
bit lcd1602_busy(void)
{
unsigned char busy_flag;
rs_1602=0;
rw_1602=1;
_nop_();
e_1602=1;
_nop_();
lcd1602_bus=0xff;
busy_flag=lcd1602_bus; //e在高电平时读
e_1602=0;
return (bit)(busy_flag&0x80); //BF=1; BUSY 返回一个位
}
/********写命令,有两个参数,一个是要写的命令控制字,
第二个是用来控制是否进行忙标志的判断。
busyflag=1;
判断: 为0
***************/
void lcd1602_wrcmd(unsigned char lcdcmd)
{
while(lcd1602_busy()); //等待空闲
lcd1602_bus=lcdcmd;
rs_1602=0;
rw_1602=0;
_nop_();
e_1602=1;
_nop_();
_nop_();
e_1602=0; //产生一个下沿
}
/***************向液晶写数据******************/
void lcd1602_wrdata(unsigned char lcddata)
{
while(lcd1602_busy()); //等待空闲
lcd1602_bus=lcddata; //在下沿的时候写数据
rs_1602=1;
rw_1602=0;
_nop_();
e_1602=1;
_nop_();
_nop_();
e_1602=0;
//lcd_bus=0xff;
}
/************液晶的清屏************/
void lcd1602_clear(void)
{
lcd1602_wrcmd(0x01); //液晶清屏控制字 并延时>40us
delay_1602(100);
}
/***********1602液晶的初始化***************/
void lcd1602_init(void)
{
lcd1602_wrcmd(0x38); //功能设置-----8位数据接口,两行显示,5*7点阵字符显示
delay_1602(100);
lcd1602_wrcmd(0x0c); //显示开关控制----显示开关开,光标开关关,闪烁开关关
delay_1602(100);
lcd1602_wrcmd(0x06); //输入方式设置,AC 自增1, S=0;
delay_1602(100);
lcd1602_wrcmd(0x01); //清屏
delay_1602(100);
}
/*********************************/
/******延时子程序*********/
delay (unsigned char dy)
{ while(--dy);}
/***高玉老师的读键子程序***/
unsigned char getkey()
{unsigned char k,tem,keytem;
keytem=0;tem=P2&0x0f;
if(tem!=0x0f)
{for(k=0;k
delay(250); //加延时防抖
tem=P2&0x0f;
if(tem!=0x0f)
{if(tem==0x0e) keytem=1;
else if(tem==0x0d) keytem=2;
else if(tem==0x0b) keytem=3;
else if(tem==0x07) keytem=4;
}
}
while(tem!=0x0f) tem=P2 & 0x0f;
return(keytem);
}
//主程序
main()
{
//初始化
unsigned char data549=0;
unsigned char data5620=0;
unsigned int cov549=0;
unsigned int cov5620=0;
unsigned char str0[]="Output: . V ";
unsigned char str1[]="Input : . V ";
unsigned char kk=0x80;
unsigned char i;
unsigned char key;
delay(2);
lcd1602_bus=0xff;
lcd1602_init();
lcd1602_wrcmd(kk+0x00);
for(i=0;i
lcd1602_wrcmd(kk+0x40);
for(i=0;i
while(1)
{
dac_5620(data5620,data5620,data5620,data5620); data549=adc_549convert();
cov549=data549*58.59;
hexstoascii_mea(cov549);
lcd1602_wrcmd(kk+0x47);
for(i=0;i
lcd1602_wrcmd(kk+0x4a);
for(i=2;i
hexstoascii_set(cov5620);
lcd1602_wrcmd(kk+0x07);
for(i=0;i
lcd1602_wrcmd(kk+0x0a);
for(i=2;i
key=getkey(); //读键
if(key==1)
{ if(data5620>=255) data5620=data5620; else data5620=data5620+1; //加0.0586v
dac_5620(data5620,data5620,data5620,data5620); cov5620=data5620*58.59;
hexstoascii_set(cov5620);
lcd1602_wrcmd(kk+0x07);
for(i=0;i
for(i=2;i
}
if(key==2)
{
if(data5620==1) data5620=data5620;
else data5620=data5620-1; //减0.0586v dac_5620(data5620,data5620,data5620,data5620); cov5620=data5620*58.59;
hexstoascii_set(cov5620);
lcd1602_wrcmd(kk+0x07);
for(i=0;i
for(i=2;i
if(key==3)
{
if(data5620>=249) data5620=data5620; else data5620=data5620+17; //加0.99v
dac_5620(data5620,data5620,data5620,data5620); cov5620=data5620*58.59;
hexstoascii_set(cov5620);
lcd1602_wrcmd(kk+0x07);
for(i=0;i
for(i=2;i
if(key==4)
{
if(data5620
dac_5620(data5620,data5620,data5620,data5620); cov5620=data5620*58.59;
hexstoascii_set(cov5620);
lcd1602_wrcmd(kk+0x07);
for(i=0;i
for(i=2;i
}
} }
第一章 直流稳压电源的基本原理
在电子电路中,通常都需要电压稳压的直流电源供电。日常生活中也需要将交流电转变成直流电,形成直流稳压电源。一般直流稳压电源由电源变压器、整流电路、滤波电路和稳压电路等四部分组成。
图1 直流稳压电源的工作原理
电源变压器是将交流电网220V 的电压变为所需要的电压值,然后通过整流电路将交流电压变为脉动的直流电压,由于此脉动的直流电压还含有较大的纹波,必须通过滤波电路加以滤除,从而得到平滑的直流电压。但这样的电压还随电网电压波动(一般10%左右的波动)、负载和温度的变化而变化。因而在整流、滤波电路之后,还需接稳压电路。稳压电路的作用是当电网电压波动、负载和温度变化时,维持输出直流电压稳定。
1.1 整流电路
整流电路的任务是将交流电变换成直流电。完成这一任务主要靠二级管的单向导电作用。因此二极管是构成整流电路的关键元件。常见的几种整流电路有单相半波、全波、桥式和倍压整流。我主要研究了单项桥式整流电路。
1.1.1 单相桥式整流电路
图2 单相桥式整流电路
图2中Tr 为电源变压器,它的作用事将交流电网电压变成整流电路要求的交流电压。单相桥式整流电路是由四个二极管接成电桥的形式构成的。设电源变压器二次侧电压U=Usinwt(v),在U 的正半周,极性为上正下负,此时二极管D1、D3承受正向电压而导通,D2、D4反向截止,电流i 的通路是a →D1→RL →D3→b 。负载RL 上又得到半波电压。在U 的负半周,极性为上正下负,此时二极管D2、D4导通,D1、D3
i 的通路是b →D2→RL →D4→a 。负载RL 上
又得到半波电压。RL U 是单方向全波脉动(图3) 。
a
b
图3 单相桥式整流滤波电路波形图
要使之接近于理想的直流电压,在整流之后需加滤波电路,将单向脉动电压中的交流分量尽量多地滤掉。
1.2 滤波电路
滤波电路用于滤去整流输出电压中的纹波,一般由电抗元件组成,如在负载电阻两端并联电容器C ,或与负载串联电感器L ,以及由电容、电感组合而成的各种复式滤波电路。滤波电路的形式有很多,分为电容输入式和电感输入式。
1.2.1电容滤波电路
采用一只容量较大的电解质电容器,所以要注意其极性,其正极要接电路高电位端,负端要接电路低电位端。若极性接反,过高的反向电压可能击穿电容器。
图4 桥式整流、电容滤波电路
图5 交流电压U 的波形
如图4,由于电容C1并联在负载电阻R1上,所以电容C1两端的电压U C 就是负载的电压U O ,交流电压U 的波形(如图5);假设,电路接通时,恰恰在
电压U 由负到正过零的时刻,这时二极管开始导通,电压U 通过二极管向电容C1充电,由于二极管的正向电阻很小,所以充电时间常数很小,电压U C 将随着电压U 按正弦规律逐渐升高,当U 增大到最大值时,U C 也随之上升到最大值。
然后U 开始下降,U C 也开始下降,但他们按不同规律下降,U 按正弦规律下降,
而电容C1则通过负载R1放电,电容端电压U C 按指数规律下降,由于放电时间
常数较大,U C 下降缓慢。除了刚过最小值的一小段时间内,仍有U C =U的关系外,之后就出现UU C 以后,二极管才又导通,电容C1由放电状态重
新变为充电状态,U C 又随着U 上升。如此继续下去,电压U C 也就是负载电压
U L 就变得平滑了,因而负载电压的平均值也有所增大了。如果电容滤波电路接
于桥式整流电路,则在交流电压的一个周期内,电容C1有两次充、放电,其放电时间比上述半波整流后所接电容滤波电路要短,故输出电压更为平滑。电容滤波使整流输出电压波形变得平直的原因,还可以从电容C1对脉动电流中的交流成分具有旁路作用来理解。由于电容C1与负载电阻R1并联,C1的容量愈大,整流后所得的脉动电流交流分量的频率愈高,则电容C1的荣康、、容抗愈小,而电阻R1 的阻值与频率无关,因此,脉动电流中的交流成分主要通过电容C1而被旁路,R1上的电流和电压便较为平直了。
1.2.2 电感滤波电路
图6 电感滤波电路
如图6是电感滤波电路,它是在整流电路的输出端和负载电阻R 之间串联一个电感线圈。电感中流过的电流发生变化时,线圈中要产生自感电动势阻碍电流的变化。当电流增加时,自感电动势的方向与电流方向相反,自感电动势阻碍电流的增加,同时将能量储存起来,使电流增加缓慢。反之,当电流减小时,自感电动势的方向与电流的方向相同,自感电动势阻止电流的减小,同时将能量释放出来,使电流减小缓慢,因而使负载电流和负载电压脉动大为减小。
如果要求输出电流较大,输出电压脉动很小时,可在电感滤波电路之后再接电容C 。组成LC 滤波电路。电感滤波之后,利用电容再一次滤掉交流分量,这样,便可得到更为平直的直流输出电压。上面讨论的整流滤波电路,输出电压已较平滑,但却不稳定,当用一个不稳定的电压对负载供电时,会引起负载工作不稳定,甚至不能正常工作。为了得到稳定的直流输出电压,在整流滤波电路之后,需要增加稳压电路。
1.3 稳压电路
稳压电路用的比较多的稳压电路是硅稳压管稳压电路。如图7是硅稳压管稳压电路,由稳压管D2和调整电阻R1组成,稳压管在电路中应为反向联接,它与负载电阻R1并联后,再与调整电阻串联。下面分析一下稳压原理。
图7 硅稳压管稳压电路
1)负载电阻R1不变,交流电源电压波动时的稳压情况:当负载电阻不变,支流电源电压增加时,整流滤波电路的电压U o 随之增加,负载电压U L 也将增加,而U L 就是稳压管两端的反向电压。当U L 稍有增加,稳压管的电流I Z 就会显著增加,因此电阻R1上的压降增加,从而使增大了的负载电压U L 的数值有所减小。如果电阻R1的阻值选择适当,最终可使U L 基本上保持不变。同理
如果交流电压降低,使U o 减小,则U L 也减小,I Z 也随着减小,则U R 也减小,仍保持负载电压U L 近似不变。
2)电源电压不变、负载电流变化时的稳压情况:假设交流电源电压不变,由于负载电阻变化而使负载电流增大,则电阻R1上的电压降增大,负载电阻R1上的端电压U L 因而下降,U L 下降一点,稳压管的电流I Z 显著减小,使已经
降低的负载电压U L 回升,与原来数值比较可基本保持不变。当负载电流减小时,
稳压过程相反。
经半波最好是全波整流,再由稳压电路最终送给负载的电压就是比较稳定的支流电了。由以上几部分电路就组成了直流稳压电源,它将广泛地应用到实践中。
第二章 数控恒压源的实现方案
传统的直流稳压电源输出是通过粗调波段开关及细调电位器来调节的,并由电位表指示电压值的大小。这种直流稳压电源存在读数不直观、电位器易磨损、稳压精度不高、不易调准、电位构成复杂、体积大等缺点,而基于单片机控制的数控直流电源不但实现了直流稳压的功能,而且没有上述的缺点。
2.1 设计目标
1)电源输出电压范围0.0V-15.0V ,步长0.06V ,输出电压值由液晶显示器显示。
2)用户对数控恒压源的控制,通过按键进行控制。
3)整机由自制稳压电源供电,输入交流220V ,输出直流+5V。
2.2 实现框图
整个电源(如图10
)分成三个主要部分:供电部分、稳压输出部分和数控部分。
图8 稳压直流电源总框图
第三章 供电和稳压输出部分
供电部分简单,不做详细论述。
3.1 稳压输出部分仿真图
Ω
图9 模拟部分中的稳压电路稳定性验证图
一般的直流稳压电源是用可变电阻来实现输出电压的调节,那么要在直流稳压电源的基础上实现数字控制的话,实际上很简单,我们只要将可变电阻换成数字控制部分来代替,就能实现数控恒压源这一课题。所以,首先要做的,就是选择合适的稳压输出电路并对其可行性进行了仿真。如图9,很容易就验证了此稳压输出电路的可靠。
3.2 供电和稳压输出部分电路图
这部分将数控部分送来的电压控制字转换成稳定电压输出,电路主要由供电、整流滤波、稳压输出、过流保护和延时启动等几部分组成。(如图10)
D/A转换部分的输出电压作为稳压输出电路的参考电压。稳压输出电路的输出与参考电压成比例。稳压输出电路采用的是串联式反馈稳压电路(如图9),在电路中,Q1—TIP122为调整管,U6A —LM358 为比较放大器,R19、R22组成反馈网络。D/A转换电路的输出电压DAOUT 接到 U6A 的同向端,稳压电源的输出经R19、R22组成的取样电路分压后送到运放U6A 的反向端,经运放比较放大后,驱动调整管Q1。当电路平衡时,D/A电路的输出电压V DAOUT 与取样后的电压V REF 相等。
稳压输出部分的过流保护电路由R21和Q2组成。设I m 为保护动作电流,则
当电源输出电流I 增加到I m 时,R21上的压降I m *R21使得Q2管导通,分掉了Q1
上的基极电流,使输出I 不再增加,起到了过流保护作用。
图10 供电和稳压输出部分
第四章 数字控制部分
4.1 单片机部分
图11 单片机控制部分
控制部分是系统整机协调工作和智能化管理的核心部分,采用89C52单片机实现控制功能是其关键,采用单片机不但方便监控,并且大大减少硬件设计。
I10,I9属微调,步长为0.0586V ,I10加,I9减;I8,I7属粗调,步长为0.9961V ,I8加,I9减。
4.2 D/A转换部分
系统设置A/D、D/A转换接口,采用美国TI 公司的高速串行8位模数转换器TLC549和四通道串行数模转换器TLC5620。
图12 D/A转换部分
D/A转换部分的输出电压作为稳压输出电路的参考电压。稳压输出电路的输出与参考电压成比例。8位字长的D/A转换器具有256种状态。当电压控制字从0,1,2,……到256时,电源输出电压为0.0,0.06,……15.0。
TLC5620是八位的串行输入四路电压输出的数模转换器。
其时序图如图13:
图13 TLC5620 数模转换时序图
Clk 为时钟端,Data 为输入数据,LOAD 为输入控制信号。
每路电压输出值的计算: data ⨯2 V 0=REF ⨯256
REF 为参考电压,data 为输入8位的比特数据;
我们这里用的REF=2.5v;
4.3 A/D转换部分
图14 A/D转换部分
TLC549是采用LinCMOSTM 技术,以开关电容逐次逼近原理工作的8位串行A/D
芯片。单电源3V ~6V 供电范围,控制口线少,时序简单,转换速度快,功耗低,价格便宜,适用于低功耗的袖珍仪器上的单路A/D采样,也可将多个器件并联使用。
TLC549是8位串行A/D转换器芯片,可与通用微处理器、控制器通过I/O CLOCK 、CS 、DATA OUT 三条口线进行串行接口。具有4MHz 片内系统时钟和软、硬件控制电路,转换时间最长17μs,TLC549允许的最高转换速率为40 000次/s。总失调误差最大为±0.5LSB ,典型功耗值为6mW 。采用差分参考电压高阻输入,抗干扰,可按比例量程校准转换范围,V REF-接地,V REF+-V REF-≥1V ,可用于较小信号的采样。 TLC549的极限参数如下: ●电源电压:6.5V ;
●输入电压范围:0.3V ~V CC +0.3V ; ●输出电压范围:0.3V ~V CC +0.3V ; ●峰值输入电流(任一输入端) :±10mA ; ●总峰值输入电流(所有输入端) :±30mA ; ●工作温度:TLC549C:0℃~70℃ TLC549:-40℃~85℃ TLC549M:-55℃~125℃
TLC549片型小,采样速度快,功耗低,价格便宜,控制简单。适用于低功耗的袖珍仪器上的单路A/D或多路并联采样。
TLC549均有片内系统时钟,该时钟与I/O CLOCK是独立工作的,无须特殊的速度或相位匹配。
当CS 为高时,数据输出(DATA OUT)端处于高阻状态,此时I/O CLOCK不起作用。这种CS 控制作用允许在同时使用多片TLC548、TLC549时,共用I/O CLOCK ,以减少多路(片)A/D并用时的I/O控制端口。一组通常的控制时序为: (1)将CS 置低。内部电路在测得CS 下降沿后,再等待两个内部时钟上升沿和一个下降沿后,然后确认这一变化,最后自动将前一次转换结果的最高位(D7)位输出到DATA OUT端上。
(2) 前四个I/O CLOCK周期的下降沿依次移出第2、3、4和第5个位(D6、D5、D4、D3) ,片上采样保持电路在第4个I/O CLOCK 下降沿开始采样模拟输入。
(3)接下来的3个I/O CLOCK 周期的下降沿移出第6、7、8(D2、D1、D0) 个转换位,
(4)最后,片上采样保持电路在第8个I/O CLOCK 周期的下降沿将移出第6、7、8(D2、D1、D0) 个转换位。保持功能将持续4个内部时钟周期,然后开始进行32个内部时钟周期的A/D转换。第8个I/O CLOCK 后,CS 必须为高,或I/O CLOCK 保持低电平,这种状态需要维持36个内部系统时钟周期以等待保持和转换工作的完成。如果CS 为低时I/O CLOCK 上出现一个有效干扰脉冲,则微处理器/控制器将与器件的I/O时序失去同步;若CS 为高时出现一次有效低电平,则将使引脚重新初始化,从而脱离原转换过程。
在36个内部系统时钟周期结束之前,实施步骤(1)-(4),可重新启动一次新的A/D转换,与此同时,正在进行的转换终止,此时的输出是前一次的转换结果而不是正在进行的转换结果。
若要在特定的时刻采样模拟信号,应使第8个I/O CLOCK 时钟的下降沿与该时刻对应,因为芯片虽在第4个I/O CLOCK时钟下降沿开始采样,却在第8个I/O CLOCK的下降沿开始保存。
本设计中A/D的采样电压是稳压输出电路的取样电压V REF 。V REF 与输出电压V o 的关系:
V REF =
R 19
(4-1) V o
R 19+R 22
因此可以通过一定的比例调整来得到输出电压V o 的数字显示值。
4.4 绘制PCB
图15 总电路的PCB
4.5 总电路软件实现流程图
图16 总流程图
程序见后面附录。
第五章 电源测试结果
5.1电压测试
5.2 性能测试
用单片机控制电源时,输出直流0-15V ,液晶显示器显示清晰正确,误差极小,完美的实现了数控恒压源这一课题。
但在功能上还不够强大, 如没有开机的电压预置功能,没有电流过流时的报警指示功能等等,还可以进一步得到提高。
结 论
本文先对直流稳压电源原理进行了论述,主要是对整流电路、滤波电路和稳压电
路等几部分功能进行了论述;然后通过仿真进行稳压输出电路可行性研究,最终
确定了数控恒压源的方案。绘制PCB 版,制作完成硬件部分,然后对硬件进行了
测试;编写单片机程序实现软件部分;通过对整个数控衡压源的调试完善,最终
实现了数控恒压源的制作,实现了数字控制稳定电压输出的功能。但在制作上还
有进一步提高的可能,如开机预置电压输出,过流保护警报指示等等。
致 谢
大学生活即将结束,回想这四年有苦有甜。在最后的毕业设计过程中,我得
到了很多老师和同学的帮助,也学到了很多平时在学习中无法学到的东西。在此,
我要感谢所有曾经教导过我的老师和关心过我的同学,是他们在我的成长过程中
给予了我足够的帮助。本文能够顺利的完成,要特别感谢我的导师殷奎喜老师的
关怀和教导;还有我的同学蔡红雷在硬件电路的设计和电子器件的选择上给了我
很多的意见,潘应云同学在单片机的编程上给了我特别多的帮助,使我能够顺利
完成毕业设计。
参考文献
[1]7—04—007241—6 康华光 电子技术基础 高等教育出版社
[2]1000—5013(2001)04—0371—05 AT89C51单片机数控多路直流稳压电源
华侨大学学报(自然科学报) 第22卷第4期2001年10月
[3]1002—8743(2004)02—0055—05 串联型直流稳压电源的仿真分析 广西
师范学院学报 第21卷第2期
[4]高稳定度稳压电源(GWE-1)的研制 西南石油学院学报 第17卷第3期
1年8月
[5]1671—1041(2003)01—0013—02 基于TL431的直流稳压电源设计 设计师
笔记
[6]基于单片机的高品质直流电源 电子产品世界 2005,1/下半月 [7]基于先进集成电路多输出线性直流稳压电源设计 中文核心期刊《微计算机
信息》(测控自动化) 2005年第21卷第1期
[8]1673—0062(2005)0063—04 数字可调式高压直流稳压电源的设计 南
华大学学报(自然科学版) 第19卷2005年9月
[9]用单片机制作的直流稳压可调电源 电子世界 2005年第11期
[10]刘华毅,李霞,徐景德 电力电子技术 第35卷第六期2001年12月 [11]7-81012-969-4 何立民 单片机中级教程 北京航空航天大学出版社 [12]7-115-13713-7 陈小忠、黄宁、赵小侠 单片机接口技术实用子程序 人民邮电出版社
[13]Matthew R, Robin T. M icrop rocessor controlled pow er supp
ly[J ].ElectronicWorldW -irelessWorld, 1994,95 (1 639) : 524~ 527
附录
//包函数调用
#include #include
//显示器数据口定义 #define lcd1602_bus P0
/******************tlc549 port*********************/ //tlc549接口定义 sbit cs_549=P1^2; sbit data_549=P1^1; sbit clk_549=P1^0;
/*******************tlc5620 port***********************/ //tlc5620接口定义 sbit load_5620=P1^3; sbit clk_5620=P1^4; sbit data_5620=P1^5;
/***************lcd1602 port******************************/ //lcd1602显示器接口定义 //引脚定义
sbit rs_1602=P2^5; sbit rw_1602=P2^6; sbit e_1602=P2^7;
/*************************************/
/*****************tlc549 output variable**********************/ //tlc549 全局变量定义
unsigned char bdata adc_549; //bdata //bit data area sbit adc_549low=adc_549^0; //最低位
//ASCII码表
/**********0---9**************/ unsigned int table[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
unsigned int set[5]; //setting unsigned int mea[5]; //measure unsigned int ad[5]; //ad data
//输入数据的ASCII 码转换函数
code
hexstoascii_set(unsigned int hex)
{
set[0]=table[hex/10000];
hex=hex%10000;
set[1]=table[hex/1000];
hex=hex%1000;
set[2]=table[hex/100];
hex=hex%100;
set[3]=table[hex/10];
hex=hex%10;
set[4]=table[hex];
}
//测量数据的ASCII 码转换函数
hexstoascii_mea(unsigned int hex)
{
mea[0]=table[hex/10000];
hex=hex%10000;
mea[1]=table[hex/1000];
hex=hex%1000;
mea[2]=table[hex/100];
hex=hex%100;
mea[3]=table[hex/10];
hex=hex%10;
mea[4]=table[hex];
}
/***********************549convert**************************************************************/
//tlc549 子程序
/**************adc_549convert*******************/
unsigned char adc_549convert()
{ unsigned char i;
cs_549=1;
cs_549=0;
clk_549=0;
for(i=0;i
{ clk_549=1;
adc_549low=data_549; //read one bit
clk_549=0;
if(i
}
clk_549=0;
cs_549=1;
return(adc_549);
}
/*****************end of adc_549convert************/
/*********************dac_5620******************************/ //tlc5620子程序(四个通道)
void dac_5620(unsigned char dataa,unsigned char datab,
unsigned char datac,unsigned char datad)
{
unsigned char i;
/****************dataa************/
load_5620=1;
clk_5620=1; data_5620=0; clk_5620=0;
clk_5620=1; data_5620=0; clk_5620=0;
clk_5620=1; data_5620=1; clk_5620=0;
for(i=0;i
{
clk_5620=1;
if(dataa & 0x80) data_5620=1;
else data_5620=0;
clk_5620=0;
dataa=dataa
}
load_5620=0;
_nop_();
load_5620=1;
/************datab*************/
load_5620=1;
clk_5620=1; data_5620=0; clk_5620=0;
clk_5620=1; data_5620=1; clk_5620=0;
clk_5620=1; data_5620=1; clk_5620=0;
for(i=0;i
{
clk_5620=1;
if(datab & 0x80) data_5620=1;
else data_5620=0;
clk_5620=0;
datab=datab
}
load_5620=0;
_nop_();
load_5620=1;
/************datac*******************/
load_5620=1;
clk_5620=1; data_5620=1; clk_5620=0;
clk_5620=1; data_5620=0; clk_5620=0;
clk_5620=1;data_5620=1; clk_5620=0;
for(i=0;i
{
clk_5620=1;
if(datac & 0x80) data_5620=1;
else data_5620=0;
clk_5620=0;
datac=datac
}
load_5620=0;
_nop_();
load_5620=1;
/***************datad***************/
load_5620=1;
clk_5620=1; data_5620=1; clk_5620=0;
clk_5620=1; data_5620=1; clk_5620=0;
clk_5620=1; data_5620=1; clk_5620=0;
for(i=0;i
{
clk_5620=1;
if(datad & 0x80) data_5620=1;
else data_5620=0;
clk_5620=0;
datad=datad
}
load_5620=0;
_nop_();
load_5620=1;
}
/***********************end of dac5620****************************/
/**************************lcd1602*******************************/ //lcd1602液晶显示子程序(四个通道)
/*********延时子程序**********/
void delay_1602(unsigned char dy)
{
while(--dy);
/***********忙判断标志,返回一个位BF********************/
bit lcd1602_busy(void)
{
unsigned char busy_flag;
rs_1602=0;
rw_1602=1;
_nop_();
e_1602=1;
_nop_();
lcd1602_bus=0xff;
busy_flag=lcd1602_bus; //e在高电平时读
e_1602=0;
return (bit)(busy_flag&0x80); //BF=1; BUSY 返回一个位
}
/********写命令,有两个参数,一个是要写的命令控制字,
第二个是用来控制是否进行忙标志的判断。
busyflag=1;
判断: 为0
***************/
void lcd1602_wrcmd(unsigned char lcdcmd)
{
while(lcd1602_busy()); //等待空闲
lcd1602_bus=lcdcmd;
rs_1602=0;
rw_1602=0;
_nop_();
e_1602=1;
_nop_();
_nop_();
e_1602=0; //产生一个下沿
}
/***************向液晶写数据******************/
void lcd1602_wrdata(unsigned char lcddata)
{
while(lcd1602_busy()); //等待空闲
lcd1602_bus=lcddata; //在下沿的时候写数据
rs_1602=1;
rw_1602=0;
_nop_();
e_1602=1;
_nop_();
_nop_();
e_1602=0;
//lcd_bus=0xff;
}
/************液晶的清屏************/
void lcd1602_clear(void)
{
lcd1602_wrcmd(0x01); //液晶清屏控制字 并延时>40us
delay_1602(100);
}
/***********1602液晶的初始化***************/
void lcd1602_init(void)
{
lcd1602_wrcmd(0x38); //功能设置-----8位数据接口,两行显示,5*7点阵字符显示
delay_1602(100);
lcd1602_wrcmd(0x0c); //显示开关控制----显示开关开,光标开关关,闪烁开关关
delay_1602(100);
lcd1602_wrcmd(0x06); //输入方式设置,AC 自增1, S=0;
delay_1602(100);
lcd1602_wrcmd(0x01); //清屏
delay_1602(100);
}
/*********************************/
/******延时子程序*********/
delay (unsigned char dy)
{ while(--dy);}
/***高玉老师的读键子程序***/
unsigned char getkey()
{unsigned char k,tem,keytem;
keytem=0;tem=P2&0x0f;
if(tem!=0x0f)
{for(k=0;k
delay(250); //加延时防抖
tem=P2&0x0f;
if(tem!=0x0f)
{if(tem==0x0e) keytem=1;
else if(tem==0x0d) keytem=2;
else if(tem==0x0b) keytem=3;
else if(tem==0x07) keytem=4;
}
}
while(tem!=0x0f) tem=P2 & 0x0f;
return(keytem);
}
//主程序
main()
{
//初始化
unsigned char data549=0;
unsigned char data5620=0;
unsigned int cov549=0;
unsigned int cov5620=0;
unsigned char str0[]="Output: . V ";
unsigned char str1[]="Input : . V ";
unsigned char kk=0x80;
unsigned char i;
unsigned char key;
delay(2);
lcd1602_bus=0xff;
lcd1602_init();
lcd1602_wrcmd(kk+0x00);
for(i=0;i
lcd1602_wrcmd(kk+0x40);
for(i=0;i
while(1)
{
dac_5620(data5620,data5620,data5620,data5620); data549=adc_549convert();
cov549=data549*58.59;
hexstoascii_mea(cov549);
lcd1602_wrcmd(kk+0x47);
for(i=0;i
lcd1602_wrcmd(kk+0x4a);
for(i=2;i
hexstoascii_set(cov5620);
lcd1602_wrcmd(kk+0x07);
for(i=0;i
lcd1602_wrcmd(kk+0x0a);
for(i=2;i
key=getkey(); //读键
if(key==1)
{ if(data5620>=255) data5620=data5620; else data5620=data5620+1; //加0.0586v
dac_5620(data5620,data5620,data5620,data5620); cov5620=data5620*58.59;
hexstoascii_set(cov5620);
lcd1602_wrcmd(kk+0x07);
for(i=0;i
for(i=2;i
}
if(key==2)
{
if(data5620==1) data5620=data5620;
else data5620=data5620-1; //减0.0586v dac_5620(data5620,data5620,data5620,data5620); cov5620=data5620*58.59;
hexstoascii_set(cov5620);
lcd1602_wrcmd(kk+0x07);
for(i=0;i
for(i=2;i
if(key==3)
{
if(data5620>=249) data5620=data5620; else data5620=data5620+17; //加0.99v
dac_5620(data5620,data5620,data5620,data5620); cov5620=data5620*58.59;
hexstoascii_set(cov5620);
lcd1602_wrcmd(kk+0x07);
for(i=0;i
for(i=2;i
if(key==4)
{
if(data5620
dac_5620(data5620,data5620,data5620,data5620); cov5620=data5620*58.59;
hexstoascii_set(cov5620);
lcd1602_wrcmd(kk+0x07);
for(i=0;i
for(i=2;i
}
} }