基于单片机控制的直流稳压源的设计

更新时间:2024-06-28 22:29:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

成绩

课程论文

题 目: 基于单片机控制的直流稳压电源

学生姓名: 董翠影 学生学号: 1008030208

系 别: 电气信息工程学院 年 级: 10级 任课教师: 张水峰

电气信息工程学院制

2012年12月

专 业: 电子信息工程

基于单片机控制的直流稳压电源

学生:董翠影 指导教师:张水峰

电气信息工程学院 电子信息工程

摘要:在现代家庭中各种电器的不断出现,并要求着各种不同值的电源出现,使得家庭购买不同值得电源。数字化的也更加贴近人们的生活,因为它更加的直观,易被接受,大家都开始追求数字化的各类电子产品。数控直流电源有着直观,易操作,各种电压集一身, 输出精度和稳定性都较高等优点,所以越来越受广大人们的喜爱。以后家里的电视遥控,电动玩具等都可以共用一个电源。

本系统以 AT89S51 单片机作为系统的核心,由D/A数字模拟转换模块、按键、LED串口显示模块等模块组成一个数控电源。该系统实现了 输出电压:范围 2 ~+ 15 .0 V,步进1V,纹波不大于10mV;输出电流:500mA;输出电压值由数码管显示;由“+”、“-”两键控制输出电压步进增减 。输入模块的按键按下之后,对单片机就有了一个输入,单片机将输入的数字一方面给显示模块,让它们在数码管中显示出来;另一部分输给DAC0832,让它转化为模拟量电流输出,通过运算放大器将这模拟量转化为相应的电压,这电压经过放大后控制LM317的控制端,从而实现输出电压的控制。

关键词: AT89S51 单片机, 数控电源, D/A, 直流电源

1 设计要求

设计并制作有一定输出电压调节范围和功能的数控直流稳压电源,基本要求如下:

1、输出直流电压调节范围2~15V,纹波小于10mv; 2、电压误差少于1%; 3、输出电流为500mA;

4、稳压系数小于0.2,直流电源内阻小于0.5Ω; 扩展要求:

1、输出直流电压能步进调节,步进值为1V; 2、由“+”“-”两间分别控制输出电压步进增和减。

2 方案论证

分析本题,根据设计要求先确定了本系统的整体设计原理框图如图1:

整流滤波 单 片 机 可调稳压芯片 输出 交流220D/A模块 按键模块 显示模块

图1 原理框图

2.1 D/A数字模拟转换模块

方案一:采用MX7541是高速高精度12位数字/模拟转换器芯片,功耗低,而且其线性失真可低达0.012%,特别适合于精密模拟数据的获得和控制。

方案二:采用DAC0832,DAC0832是一种常用的8位的数字/模拟转换芯片。

本系统是基于51单片机的数控电源的设计, 8位的单片机,而MX7541是12位数字

输入的,因此须用锁存器。而此数控电源要求单步1V,2~15V,DAC0832完全可以达到,故选择常用的DAC0832。

2.2 可调稳压芯片

三端可调稳压芯片有多种,其中最常见的有LM317、LM337、LM318、LM196等几种,LM317用于正电压调整,LM337用于负电压调整。本系统的输出电压范围2~+15.0V为正电压输出,固排除LM337,对于LM317又有如下各种型号,它们的输出电流与电压的对照表如表1:

表1 常见稳压输出电流和电压范围

芯片型号 LM317L LM317T LM317 LM318 LM196

输出电流(A) 输出电压(V) 0.1 0.5 1.5 5 10 1.25~37 1.25~37 1.25~37 1.25~37 1.25~15 根据设计要求输出电压范围2~+15.0V,输出电流500mA,以上有多种型都可以满足要求,再根据成本和现有材料,我选择了LM317T三端可调稳压芯片。

2.3 按键控制模块

方案一:采用矩阵键盘,由于按键多可实现电压值的直接键入。

方案二:采用一般的电平判键按钮,实现方法很简单,但一个端口最多只实现8个按键。

由于本数控电源需要用的按键不多,要实现步进为1V的设计要求,只需用一个“+”和一个“-”按键,另外再加两个按键用于实现固定电压输出,按键时可直接输出相应电压。4个按键就可实现本题的设计要求,固采用方案二。

2.4 显示模块

方案一:选用数码管显示,用普通的数码管显示简单的数字、符号、字母。 方案二:选用液晶显示,显示的内容更加的丰富。

此系统显示的只是最终电源输出的10位和个位电压值,只需显示出两个数字,数码管更加的实惠,故我选择了方案一。

3 设计原理

本系统选用的模块包括:单片机系统,D/A转换模块,LED显示模块,直流

电源模块,具体的电路图参照附录二。 3.1 单片机模块

此次的毕业设计的核心部分是单片机的控制,给以相关的命令,按照人们的

意愿执行相应的操作,这次选用的是ATMEL公司生产的常用芯片AT89C52,主要是他的价格便宜,而且是我们通用性较强,容易获得。

3.1.1单片机介绍

CPU即中央处理器的简称,是单片机的核心部件,它完成各种运算和控制操作,CPU由运算器和控制器两部分电路组成。 a. 运算器电路

运算器电路包括ALU(算术逻辑单元)、ACC(累加器)、B寄存器、状态寄存器、暂存器1和暂存器2等部件,运算器的功能是进行算术运算和逻辑运算。 b. 控制器电路

控制器电路包括程序计数器PC、PC加1寄存器、指令寄存器、指令译码器、数据指针DPTR、堆栈指针SP、缓冲器以及定时与控制电路等。控制电路完成指挥控制工作,协调单片机各部分正常工作。 c. 定时器/计数器

MCS-52单片机片内有两个16位的定时/计数器,即定时器0和定时器1。它们可以用于定时控制、延时以及对外部事件的计数和检测等。 d. 存储器

MCS-52系列单片机的存储器包括数据存储器和程序存储器,其主要特点是程序存储器和数据存储器的寻址空间是相互独立的,物理结构也不相同。 e. 并行I/O口

MCS-52单片机共有4个8位的I/O口(P0、P1、P2和P3),每一条I/O线都能独立地用作输入或输出。P0口为三态双向口,能带8个TTL门电路,P1、P2和P3口为准双向口,负载能力为4个TTL门电路。 f. 串行I/O口

MCS-521单片机具有一个采用通用异步工作方式的全双工串行通信接口,可以同时发送和接收数据。

g. 中断控制系统

8051共有5个中断源,即外中断2个,定时/计数中断2个,串行中断1个。 h. 时钟电路

MCS-52芯片内部有时钟电路,但晶体振荡器和微调电容必须外接。时钟电路为单片机产生时钟脉冲序列,振荡器的频率范围为1.2MHz~12MHz,典型取值为6MHz。 i. 总线

以上所有组成部分都是通过总线连接起来,从而构成一个完整的单片机。系统的地址信号、数据信号和控制信号都是通过总线传送的,总线结构减少了单片机的连线和引脚,提高了集成度和可靠性。 选用单片机的结构: 1 一个8 位算术逻辑单元

2 32 个I/O 口4 组8 位端口可单独寻址 3 两个16 位定时计数器 4 全双工串行通信

5 6 个中断源两个中断优先级 6 128 字节内置RAM

7 独立的64K 字节可寻址数据和代码区

每个8051 处理周期包括12 个振荡周期每12 个振荡周期用来完成一项操作如取指令和计算指令执行时间可把时钟频率除以12 取倒数然后指令执行所须的周期数因此如果你的系统时钟是11.059MHz 除以12 后就得到了每秒执行的指令个数为921583条指令取倒数将得到每条指令所须的时间1.085ms 。 AT89C52的管脚图如图2::

U119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161718XTAL29RST293031PSENALEEA12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51 图2 89CS51管脚图 3.1.2 单片机外围电路介绍 电源引脚Vcc和Vss Vcc:电源端,接+5V。 Vss:接地端。

时钟电路引脚XTAL1和XTAL2

XTAL1:接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,若使用外部TTL时钟时,该引脚必须接地。

XTAL2:接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出,若使用外部TTL时钟时,该引脚为外部时钟的输入端。 地址锁存允许ALE

系统扩展时,ALE用于控制地址锁存器锁存P0口输出的低8位地址,从而实现数据与低位地址的复用。 P0口的P1.0,P1.1,P1.2,P1.3和键盘相连,作为整个系统的输入部分。其中和P1.0相接的是+5V电源的数字输入键,和P1.1相接的是+12V电压的数字输入键。和P1.2,P1.3相接的分别是“+”,“—”号键。

P1口和DAC0832的输入相接,作为D/A模块的输入。 电路如下:

图3 按键输入图

其中S1、S2为固定电压的输入,分别是+8V和+12V电压的输入按钮,S3、S4分别为+,—键,对电压值进行加和减计算。

/WR和/RD分别接到两数码管的公共端COM1和COM2。 3.2 D/A模块

3.2.1 D/A电路简介

根据平时的使用习惯和相关资料,我们使用的D/A转换一般有下列两种方案:

方案一:采用MX7541 是高速高精度 12 位数字 / 模拟转换器芯片,功耗低,而且其线性失真可低达 0.012% ,特别适合于精密模拟数据的获得和控制。

方案二:采用DAC0832,DAC0832是一种常用的8位的数字/模拟转换芯片。

3.2.2 DAC0832及其外围电路

本系统是基于单片机的数控电源的设计,而MX7541 是 12 位数字 输入的 , 因此须用锁存器。而此数控电源要求单步1V, 2~15 .0V只需区分14个点,DAC0832完全可以达到,故选择常用的DAC0832。当其与单片机进行相连时,电路也 简单,只需把单片机的数据线与DAC0832的输入端直接相连即可,程序也很简单,只需向其送数据即可。

DAC0832的管脚图如图3所示:

U212345678910CSVCCWR1ILE(BY1/BY2)GNDWR2DI3XFERDI2DI4DI1DI5DI0DI6VREFDI7RFBIOUT2GNDIOUT1DAC083220191817161514131211 图4 DAC0832管脚图 其各个引脚的连接及外围图: U119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD3938373635343332212223242526272810111213141516171218XTAL29RST293031PSENALEEAU212345678910274LS041CSVCCWR1ILE(BY1/BY2)GNDWR2DI3XFERDI2DI4DI1DI5DI0DI6VREFDI7RFBIOUT2GNDIOUT1DAC0832412345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51U3:A120191817161514131211U4:A3128R14kU3:B3LM3584274LS04D21N4001 图5 D/A模块电路 管脚的具体名称和用法 D0 ~ D7:数字量输入端; CS:片选信号,低电平有效;

ILE:数据锁存允许信号,高电平有效;

WR1:第1写信号,低电平有效;

WR2:第

2写信号,低电平有效;

XFER:数据传送控制信号,低电平有效;

IOUT1:电流输出端1; IOUT2:电流输出端2;

RFB:反馈电阻端;

VREF:基准电压,基电压范围为-10V ~ +10V;

GND:数字地; AGND:模拟地 ;

单片机与DAC0832的接口可按二级缓冲器方式、单缓冲器方式和直通方式联接。如上图4的联接方式是直通方式联接方式。由OUT1脚输出的为一个模拟电流值,经过运算放大器后为一个电压值,这电压值输入到后面的运算放大部分,作为后面部分的输入。

3.2.3 D/A 转换的计算

D/A转换器(DAC)输入的是数字量,经转换输出的是模拟量。DAC的技术指标很多,如:分辨率、满刻度误差、线性度、绝对精度、相对精度、建立时间、输入/输出特性等。

分辨率:DAC的分辨率反映了它的输出模拟电压的最小变化量。其定义为输

n出满刻度电压与 2的比值,其中 n 为DAC的位数。如:8位DAC的满刻度输出

5555?(V)?(V)1081024256电压为5V,则其分辨率为 2;10位DAC的分辨率为 2。

可见,DAC的位数越高,分辨率越小。

建立时间:是描述DAC转换速度快慢的参数。其定义为从输入数字量变化到输出达到终值误差 达1us。

接口形式:在DAC输入/输出特性之一。包括输入数字量的形式,十六进制式BCD,输入是否带有锁存器等。

DAC0832为8位D/A转换器。单电源供电,范围为+5V ~ +15V,基准电压范围为 ?10V。电流的建立时间为1us。CMOS工艺功耗20 mw。 输入设有两级缓冲锁存器。

电压的计算方式:

设计要求数控电压步进为1V,因此要准确选择D/A的参考电压 VREF,如上图用一个精密电阻进行调节,计算方法如下:

VrefV? 256nVrefV?, 256n?12LSB(最低有效位)所需的时间。高速DAC的建立时间可

数字量取0 ~ 256,n取16, VREF取8V,即数字量每步进16,模拟量0.03125V,要达到步进1V,必须放大2倍,用运放即可 。

运算放大器的原理如下图:

U4:B57648LM358 图6 运算放大电路

输出的电压V,再从Vi输入,经过电容C10滤波再输入,

Vi?V?V??VO?I???R4R3??V?V?0???, V?VO?i?R4R3,

?VO??R3ViR4,

输出的Vo值的大小为输入Vi的 ?R3R4倍,只需调节可调电阻R3的阻值达到所

需的电压放大倍数即可,输出的电压Vo通过电压跟随,再用于控制LM317T的输出。

4.3 LED数码管显示模块

4.3.1 数码管显示简介

数码管LED串口显示模块通常有两种显示方法:动态显示和静态显示。

动态显示:连接方法是将每个二极管的同名端连在一起,而每个显示器的 公共极COM各自独立的接受I/O线控制,CPU向字段输出端口输出字型码,所有显示器接受到相同的字符,而要使用哪个显示器要取决于他们的COM的电平,而这段是由I/O端控制的,由单片机输出。动态扫描时连续的动态扫描,只是肉眼暂留现象,乃发光二极管的余辉效应,给人的感觉是一组稳定的显示数据。

静态显示: 静态显示显示效果好,但是功耗大,但不占用端口,只需两个串口线输出,变成较为简单。而且采用静态显示需要的驱动器件多,硬件成本相对更高。

比较以上两种方案,方案一硬件简单程序复杂,方案二硬件复杂程序简单,考虑到实惠和对自己的编程锻炼,选择方案动态显示。

动态扫描 方法是用其接口电路把所有显示器的8个笔画字段(a—g和dp)同名端连在一起,而每个显示器的公共极COM各自独立的接受I/O线控制。CPU向字段输出端口输出字型码时,所有显示器接受到相同的字型码,但究竟使用哪个显示,则取决于公共极COM端,而这一端是由/WR和/RD控制的,由单片机决定何时显示哪一位。动态扫描用分时的方法去轮流控制各个显示的COM端,时各个显示器轮流亮。在轮流点亮扫描过程中,每为显示器的点亮时间极为短暂,但由于人的视觉暂留现象及发光二极管的于辉效应,给人的印象就时一组稳定的显示数据。 显示部分电路图:

12 图7 数码管显示电路

4.3.2 数码管编码表

7段数码管可以包括小数点的0~9的数字和部分的英文字母,为了获得不同的字符,数码管各段所加的电平也不同,编码也不一样。共阴极数码管的字型,字段和编码的关系如下表1:

表 2 数码管编码表 十六进制数 0 h gf edcba 00111111 显示代码 0x3f 1 2 3 4 5 6 7 8 9 . 4.4直流电源

00000110 01011011 01001111 01100110 01101101 01111101 00000111 01111111 01101111 10000000 0x06 0x5b 0x4f 0x66 0x6d 0x7d 0x07 0x7f 0x6f 0x80 4.4.1直流供电电源制作原理

由于本系统的许多的电源电压都是由+5V的电源供电,且D/A模块中的74LS164要用到+12V,—12V的电源,所以这要制作这些不同值的电源,涉及到的各类芯片有7805,7812,7912。

首先制作电路中的+12V,-12V的电源,这要用到三端固定稳压芯片,一个整流,滤波过程。电路如图6:

图8 +12 V和-12V电源的制作图

+5V的电源制作和+12的电源制作的原理和电路图一样,只需将电路的7812换成7805即可。

电源工作原理: 降压 → 整流 → 滤波 → 稳压 → 输出 。

降压: 由于输入的市用电压为220V,远大于我们所需电压幅值,必须把电压降低,直接用一个变压器即可达到降压的目的.

整流:由于降压后的电压仍为交流电压,要把交流电压整为直流电压,利用整流桥,整流桥内部实际上就是四个大功率的二极管(例如IN4007) 。 Ui的电压/时间曲线如图a所示,当Ui为正时,二极管D2、D3导通,D1、D4截止,电流从a流向b,U1输出正电压,经过外电路后,又从d流向c,形成电流回路。当Ui为负时,二极管D1、D4导通,D2、D3截止,电流从c流向b,U1仍然输出正电压,实现了交流到直流的转变。

滤波:经整流后的直流并不是稳定的直流,是一个周期性的振荡曲线。要减落这种振荡幅度,最简单的滤波方法就是用电容,利用电容的充放电特性。

tt输入的U1> 放时,放电未完又再次充电,输入的U1>U2,电容C就开始充电,

tc充>>

t充时,充电未完又再次放电,由此类推,不断放电

充电,滤波后的电压为U2在 Vt2到 Vt3的正电压之间波动变化,且波动幅度变缓,使用大电容值的电容滤波此幅度波动更平缓,且多次滤波使直流的纹波更小。

稳压: 波后的电压U2输入三端稳压芯片LM7805便可将稳定输出电压+5V,在上图中的一个二极管D3是一个保护二极管,它的作用是保护稳压芯片。

7805、7812、7912是所需的三端稳压器,分别输出+5V、+12V、-12V。

4.4.2 输出电源工作原理

输出电源的原理图和上面的恒定电源的制作原理基本一样,电路图如下:

图9 输出电源电路图

220V市电经变压器变压(降压),二极管桥式整流,电容滤波后送入LM317第三脚(输入端),第二脚输出稳压的直流电压。第一脚为调整端,调整端电压Ui与输出端电压Uo之间为1.25的基准电压。输出的基本公式为: U0=1.25+Ui; 5 软件部分

5.1 开发工具介绍

单片的使用除了硬件,同样也要软件的使用,我们写汇编程序编程CPU可执行的机器码有两种方法,一种是手工汇编,一种是机器汇编。机器汇编通过汇编软件变为机器码,用于MSC-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从使用普通汇编语言到高级语言的不断发展,Keil是目前最流行开发MCS-51系列单片机的软件。Keil c51汇编,PLM语言和C语言的程序设计,界面友好。Keil是美国keil software公司出品的52系列兼容单片机c语言开发系统。用过汇编语言后再使用C语言来开发,体会更加深刻。

Keil C51软件提供丰富的库,与汇编相比,C语言在功能上,结构上,可读性,可维护性上有明显的优势,因而易学易用函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生产的汇编代码,就能体会到KeilC51DE 生成的

目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解,在开发大型软件时更能体现高级语言的优势。

5.2程序框图:

6 仿真结果数据分析

开始初始化为串口方式零 键盘扫描 延时去抖 判断是否有键结束

6 仿真结果数据分析

本系统的设计电路相对简单,硬件制作基本完成,我用ISIS Profressional

软件已仿真出来,效果非常的好。已经在输出的精度和稳定性基本达到要求,输出的电压范围为2-- +15v,步进为1v,又预设两个定值电压+12v和+5v。实验结果为下表:

表3 仿真数据结果

理论值(V) 实际值(V) 理论值(V) 实际值(V) 2 2.01 9 9.00 3 3.01 10 9.99 4 4.00 11 11.00 5 5.00 12 12.00 6 6.00 13 13.00 7 7.00 14 14.00 8 8.00 15 14.8 由上表的电压实测值与显示值对比值,可见该电源相对误差小于1%,按下“+”、“—”键时,单步变化1V的精度也基本符合要求。

参考文献

[1]王港元.电工电子实践指导[M].江西科学技术出版社

[2]陈明荧. 8051 单片机课程设计实训教程[M].清华大学出版社. [3]郁慧娣.微机系统及其接口技术[M].南京东南大学出版社, 1999 年.

[4]谢嘉茥,宣月清,冯军 . 电子线路-非线性部分[M]. 高等教育出版社 , 200 0 年. [5]何立民.单片机高级教程[M].北京航空航天大学出版社, 2003 年.

附录一:电路图

X1C122pFCRYSTALC222pF19U1XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD3938373635343332212223242526272810111213141516171218XTAL29RST293031PSENALEEAU212345678910274LS041CSVCCWR1ILE(BY1/BY2)GNDWR2DI3XFERDI2DI4DI1DI5DI0DI6VREFDI7RFBIOUT2GNDIOUT1DAC08324RP1987654321RESPACK-812345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51U3:A120191817161514131211U4:A3128R14kRV1U4:B8U3:B3LM358542610k774LS044LM358D21N4001R2500C31000uF+88.8VoltsD11N4001R32203U5LM317LVIADJVO21 附录二:源程序 #include

#define uchar unsigned char #define uint unsigned int

uchar code ziku[20]= {

0xc0,0xf9,0xa4,0xb0,0x99, //0,1,2,3,4, 0x92,0x82,0xD8,0x80,0x90, //5,6,7,8,9, 0x88,0x83,0xc6,0xa1,0x86, //A,B,C,D,E 0x8e,0x7f,0xbf,0x89,0xff //F,.,-,H,NULL };

//0 1 2 3 4 5 6 7 8 9 .

uchar buff[2]; uchar voltage; uchar ans; uchar x,y;

sbit key16 = P1^0; sbit key8 = P1^1; sbit keyadd = P1^2; sbit keysub = P1^3;

sbit OUT0 = P2^0; sbit OUT1 = P2^1; sbit OUT2 = P2^2; sbit OUT3 = P2^3; sbit OUT4 = P2^4; sbit OUT5 = P2^5; sbit OUT6 = P2^6; sbit OUT7 = P2^7; sbit L1 = P3^6; sbit L2 = P3^7;

//---------------------------------------- //函数名称: delay

//功能描述:延时(N*8+6)μ

//---------------------------------------- void delay(uint N) { uint i; for(i=0;i

/*函数名:getbuff 功能:将电压值转化为显示码存入buff*/ void getbuff(void) {

x = voltage/10; y = voltage; buff[1] = ziku[x]; buff[0] = ziku[y]; }

/*函数名:display 功能:显示buff*/ void display(void)

{ L1 = 0; P0=buff[0]; delay(200); L1 = 1; L2 = 0; P0=buff[1]; delay(200); L2 = 1; }

/*函数名:key 功能:键盘扫描和设置*/

/*按下P1.0:输出16V 按下P1.1:输出8V */ /*按下P1.2:输出加1V 按下P1.3:输出减1V */ void key(void) {

key16 = 1; key8 = 1; keyadd = 1; keysub = 1;

if((P1&0x0f)!=0x0f) //有键按下 { delay(200); //延时去抖动 if ((ans=(P1&0x0f))!=0x0f) { do{;}while((P1&0x0f)!=0x0f); // 等待键放松 switch (ans) { case 0x0e: voltage=10;break; case 0x0d: voltage=5;break; case 0x0b: if(voltage<15) voltage++;break; case 0x07: if(voltage>2) voltage--;break; default: break; } } } }

/*函数名:DAC 功能:直通方式DA转换*/ void DAC(void) { uchar temp; temp = voltage*16-20;

OUT0 = temp%2; temp = temp/2; OUT1 = temp%2; temp = temp/2; OUT2 = temp%2; temp = temp/2; OUT3 = temp%2; temp = temp/2; OUT4 = temp%2; temp = temp/2; OUT5 = temp%2; temp = temp/2; OUT6 = temp%2; temp = temp/2; OUT7 = temp%2; }

void main(void) {

P0 = 0xff; P1 = 0xff; P2 = 0xff; P3 = 0xff; voltage=2;

while(1) { key(); DAC(); getbuff(); display(); } }

本文来源:https://www.bwwdw.com/article/uag3.html

Top