数控直流电流源设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数控直流电流源设计报告
摘要
本设计以直流稳压电源和稳流电源为核心,结合单片机最小系统实现对输出电流的控制。

首先采用了单片集成稳压芯片LM338K实现直流稳压,然后采用了分立元件实现稳流。

为实现对输出电流的精确控制,运用Atmel公司AT89C55WD、扩展了TI公司A/D转换芯片TLC2543、D/A 转换芯片TLC5617实现了对输出电流的设置和控制,输出电流的采样。

为实现对输出电流的控制:一方面,通过D/A 输出实现电流的预置,通过运算放大器控制晶体管2N3055的输出电流;另一方面,运用A/D转换器件TLC5617将输出电流的采样值送入单片机,与预置值进行比较,将误差值通过D/A转换芯片添加到调整电路,从而进一步降低了输出电流的纹波。

Abstract
DC voltage regulator and DC current regulator is the key part of the design, its output current is controlled by single chip microprocessor .Firstly, single chip IC voltage regulator LM338K is used to generate stable voltage, and then desperate devices is used to generate stabilize current. For the accuracy control of output current, Atmel 忽略pany chip –At89C55WD .TI A/D converter chip TLC2543 and D/A converter chip TLC5617 are designed to set , control and sample the output current .To control the output current ,on the
one hand , system sets output current by D/A converter and controls current of transistor 2N3055 by operational amplifier, on the other hand ,with the help of A/D converter TLC5617 ,system samples the output current and convert it into digital data, 忽略pares it with preset value, converts the error value into analogy and puts it on adjusting circuit, and decreases the ripple of the system output current.
目录
任务 (3)
要求: (4)
1、基本要求 (4)
2、发挥部分 (4)
系统设计 (5)
一、总体方案设计与论证 (5)
1、方案一 (5)
2、方案二 (5)
二、单元电路分析 (6)
1、恒流源电路 (6)
2、单片机系统 (10)
三、理论分析与计算 (10)
1、电压源设计 (10)
2、电流源设计 (12)
四、电路图及有关设计文件 (14)
1、单片机最小系统原理图 (14)
2、显示与键盘电路原理图及PCB图 (15)
3、直流稳压电源电路图 (16)
4、直流稳流电路图 (16)
5、A/D与D/A部分原理图 (17)
五、系统软件工作流程 (17)
六、安装测试与仪器仪表 (20)
1、测试仪器、设备清单 (20)
2、安装与测试 (20)
七、元器件清单 (21)
八、总结与思考 (23)
附录 (24)
1、使用说明书 (24)
2、参考文献 (24)
3、数控直流电流源程序 (25)
任务
设计并制作数控直流电流源。

输入交流200~240V,50H Z;输出直流电压≤10V。

其原理示意图如下所示。

要求:
1、基本要求
(1)输出电流范围:200mA~2000mA;
(2)可设置并显示输出电流给定值,要求输出与给定值偏差≤给定值的1%+10mA;
(3)具有“+”、“-”步进调整功能,步进≤10mA;
(4)、改变负载电阻,输出电压在10V 以内变化时,要求输出电流变化的绝对值≤输出电流值的1%+10mA;
(5)纹波电流工作≤2mA;
(6)自制电源。

2、发挥部分
(1)输出电流范围为20mA -2000mA,步进1mA;
(2)设计、制作测量并显示输出电流的装置(可同时或交替显示电流的给定值和实际测量值),测量误差的绝对值≤0.1%+3个字;
(3)改变负载电阻,输出电压在10V以内变化的绝对值≤0.1%+1mA;
(4)纹波电流≤0.2mA;
(5)其他。

系统设计
一、总体方案设计与论证
1、方案一(如图1-1-1)
该方案使用一套十进制计数器,一方面完成电流的译码显示,另一方面其输出作为EPROM的地址输入,而由EPROM 的输出经D/A变换后控制电流源的输出电流。

该电路结构简单,且实现了数字控制,但由于控制数据烧录在EPROM中,使系统设计灵活性降低,另一方面,此电路工作在开环情况下,输出误差较大。

图1-1-1
2、方案二(如图1-1-2)
此方案采用以89C55芯片为核心的单片机最小系统作为该系统的控制部分。

其中采样与控制部分采用精度较高的12位AD/、D/A转换器,它不仅能实现步进≤10mA的基本
要求,而且在对电压采样中,可以得到精度较高电流输出,这是方案一不可能实现的。

此外,控制部分电路还具有键控和显示功能来进一步优化系统功能。

综合比较后,采用此方案。

图1-1-2
二、单元电路分析
1)恒流源电路
方案一、
由CW78XX 集成稳压块构成的恒流源电路如图2-1-1所示。

这时集成稳压块工作在悬浮状态,在其输出端与公共端之间接入电阻R W ,形成恒流通道,此恒定电流I O 流经负载R L 后再回至电源。

但其输出电流达不到题目要求值,可以采用三极管扩展电流电路。

图2-1-1
为提高效率,故选用了输出电压低的CW7805。

调节电阻R W 的大小可以控制恒流值。

流经负载电阻R L 的实际电流可由下式算出: 键盘
89C55
单片机
显 示 键盘显示器接口 D/A 转换电路 电流源 负载 稳压电源
采样电路
A/D 转换
电路
I0=U xx/R w+Id=5/R w+I d
由上式可以看出,只要改变电阻阻值就可以得到可变的恒流源。

当所需输出电流超过1.5A时,可采用外接功率管的办法来扩展电流。

对CW78XX系列稳压块的外接扩流功率管只能采用PNP型管。

电阻R的阻值由外接功率管的U be值和集成稳压块的输出电流I REG来决定,即:
R=U be/(I REG-I T/β)
式中,I REG是流入集成稳压块的电流,I T是流过外接功率管V T的集电极电流。

U be对于锗管取0.3V,对于硅管取0.7V。

由此得出扩展电流I T由电阻R的大小决定,从而得到可调节的恒流源。

I d一般为8mA左右,且在稳压源工作过程中会上下波动,对小电流的控制性能较差,只适用于恒流精度要求不高的场合。

方案二、
图2-1-2为一数控恒流源电路,图中运算放大器A1接成加法器,为得到大电流输出,其输出端进行了电流扩展。

A2接成跟随器。

A3接成反相器。

2-1-2图
设A1输出端电压为U1,根据加法原理得到:U1=-(U M+U N)
其中U N为U2经跟随器A2和反相器A3后获得,因此,U N=-U2,从而U1-U2=-U M
又因A2是跟随器,反馈支路的分流为零,流过电阻RM的电流全部通过负载,因而
I O=I RM=(U1-U2)/R M=-U M/R M
这是一个仅与电压U M和电阻有关的恒定电流。

如果U M来自数模转换器,则该恒定流大小可由数字设定。

又若数模转换器接成双机性电压输出,该数控恒流源就可输出正、负两个方向的电流。

图示电路适用于数字控制的测量回路。

方案三、
采用串联稳流电路,其原理图如图2-1-2所示,
图2-1-3
从图中可以看出,U i经调整元件输出恒电流,R S与R L 串联,R L负载上获得电流值,而采样则通过对R S上电压的采集来实现,把采样值送入放大元件来改变调整元件输出值,从而实现对输出电流值的可调。

这种硬件电路的调节控制输出精度较差,故对其稍做改变(如图2-1-3)可实现数字控制,其基本原理是对R S的采样用AD转换器,经软件控制输出数字控制信号,通过DA转换器对放大元件进行调整。

输入电源U i采用可调式三端稳压器输出,它具有很低的基准电压U=1.25,极强的调整能力Su=0.02%/V,S1=0.1~0.3%,调整端电流既小又稳定I Q=50uA,△I Q=0.2uA。

因此,用他构成的恒流源电流稳定、效率高、电路简单、安装调试方便,在mA~A级电流范围内都可满足较高精度应用的要优先选用。

从题目要求的多方面考虑,采用LM338,其输出电流可达到5A,调节电位器使其输出电压为10V。

比较以上方案,从精度和调节方便两方面考虑,选择方案三。

2)单片机系统
CPU采用89C55芯片,外部扩展8KBRAM(一片6264)、I/O接口(一片8155),时钟频率采用12MH Z。

3)显示与键盘部分
本系统显示的电流值为数字量,故采用数码管显示。

按键主要有“加”、“减”两个键,使系统实现了键控,且调节也十分方便。

4)ADC与DAC
根据题目要求需实现200mA~2A的输出,且步进值为10mA,采用十位的D/A转换器TLC5617,步进值=2/1024,可实现2mA的调整,完全达到了题目的要求。

对R S端的采样用十二位的AD转换器TLC2543。

三、理论分析与计算
1、电压源设计
要求输出电压为+12V、-12V、+5V、-5V。

分别对运放、和单片机最小系统供电。

1)基本原理
将交流电AC220V由变压器将压后(AC15V)送整流桥,整流后经过电容滤波后,得到一个波动较大的直流电压,之后再送三端稳压器稳压输出,供后续电路使用。


中5V的三端稳压器输入电压由12V的稳压器提供。

由于
稳压器的输出还含有教大纹波,故需加电容滤波,以获得
含有更小纹波的直流电压。

同时由于滤波电容较大还应与
之并接一个小容量的电容,使电路易启动。

其组成框图如
图3-1-1所示。

图3-1-1
2)参数计算与器件选择
(1)选三端集成稳压器:根据输出电压的要求,选用LM7812K、KA7912、L7805CV、L7905CV。

78XX、79XX 系列输出电流为1.5A,该系列稳压块有过流,和调整管安全工作区保护,以防过载而损坏。

一般不需要外接元件即可工作,有时为改善性能也加少量元件。

(2)选电源变压器:通常根据变压器的副边输出功率
P2来选购变压器。

LM7812K的输入电压U i≥12+3=15V,U2≥U min/1.2=12.5V。

最大输出电流取1A,则副边输出功率P2≥12.5V×1A=12.5W,查相关手册可得变压器的效率η=0.7,则原边输入功率P1≥P2/η=17.86W,为留有余地,选用220V/30V(30W)的变压器。

(3)选整流桥电路及滤波电容:整流桥采用PBP205,其极限参数满足要求。

滤波电容为C=I c t/△U i=I omax t/△Ui=2200uF
电容C的耐压应大于1.414×U2=17.7V,故取2200uF/50V的电容。

(4)其它元器件选择:输入端电容C1用以旁路高频干扰脉冲及改善纹波,一般取0.1uF;输出端所接电容C0起改善瞬态响应特性、减小高频输出阻抗的作用,一般取1uF;保护二极管选用IN4007,其极限参数为U RM≥1000V,I F=1A,能满足电路的要求。

2、电流源设计
1)取样电阻R S:在稳流电源中要承受较大的功率损耗,温度高,阻值变化也就比较大。

解决的办法是选择低温度系数的电阻材料,且要进行严格的热处理工艺,保证电阻材料性能稳定。

根据题目要求,输出电流值为200mA~2000mA,而A/D采样电压值在0~5V范围内其阻值最大不能超过2.5Ω,此方案设计中采用RX21型涂漆型线绕电阻器(KNP),阻值为1欧姆,误差在±5%范围内,由图3-2-1所知,最大所能承受功率可达10W,耐温值达到250℃。

在实际电路中,根据P=U max×I max得,最大输出功率为4W,因此符合电路要求。

图3-2-1
2)基准电压:因为此电压决定了输出电流的值,为了使输出电流能达到预定值,且要符合题目精度,故采用D/A 转换器进行控制,其控制精度主要取决于D/A的位数。

3)输入电压U i:根据已知条件,R L的最大变化△R L为0.05R L=0.05Ω。

如果选取调整管饱和压降U CES=3V,则由公式U imin≥U CES+△U i+ I L×(R S+R L+ △R L),其中I L为2A,得U imin≥9V。

通过调节电位器来改变LM338K的输出电压值,使其输出10V的电压值调节此电压值,能对输出电流值进行适当的调整。

LM338K输入电压采用电压源电路供电时,变压器输入电压过高,会影响LM338K正常工作,降低变压器输入电压值,电压源的输出﹢12V端电压降低,不能得到﹢12V稳定电压。

故在此采用双电源供电。

4)选择调整管:调整管最高工作电压
U CEmax = (U i+△U i)-[U SI+I L(R L-△R L)]=9.3V
最大集电极损耗功率P cmax=U CE max ×I L=18.6W.
根据以上计算选用大功率晶体管2N3055(NPN),其极限参数V CEO:60V;I CM:15A;P CM:115W。

当Ic=2A时,2N3055的H FE=20,则它的基极电流I B=2A/20=100mA。

显然,一般放大器供给不了如此大的电流,因此,选择复合管电路结构。

推动管工作条件如下:
最高工作电压U CEmax=9.3V
最大集电极电流I cmax=100mA
最大集电极损耗功率
P cmax=U CE max×I CE max=0.93W
选用大功率管8050,其极限参数:
U CBO:40V
U CEO:25V
I c:1.5A
P c:1W
在I c=100mA时,H FE=85,则基极电流I B=100mA/85=1.18mA。

满足一般放大器输出电流要求。

电路如图4-1-3,其基本工作过程如下:
运放A1起隔离作用,对单片机输出的DA信号进行隔离,再传送到A2,A2为反相器,使得A3输入一个负电压,即A3的正端对地产生一个负电压,则R S电阻上有电流流过电流的大小取决于R S上电压大小,而R S上电压是由DA决定。

AD转换器对输出电流进行采样,当DA输出的电压与AD采样值不一样,一方面会在A3输入端产生电压差,控制基极电流,从而控制了输出电流值,但这种控制,误差较大,所以,当有偏差产生时,由单片机进行调整,A/D转换器和D/A转换器决定了电流的控制精度。

四、电路图及有关设计文件
1)单片机最小系统原理图:
图4-1-0 最小系统的PCB图:
图4-1-1
2)显示与键盘电路原理图及PCB图:
(a)
(b)
图4-1-2 3)直流稳压电源电路图:
图4-1-3 4)直流稳流电路图:
图4-1- 5)A/D与D/A部分原理图五、系统软件工作流程
六、安装测试与仪器仪表
1、测试仪器、设备清单
万用表:UT53
直流稳压电源
PC机
仿真器:万利ME——52HP
交流毫伏表
2、安装与测试
1)硬件电路安装
(1)安装整流滤波电路
首先应在变压器的副边接入保险丝FU,以防电源输出端短路损坏变压器或其他器件,整流滤波电路主要检查整流二极管是否接反,否则会损坏变压器。

检查无误后,通电测试(可用调压器逐渐将输入交流电压升到220V)。

(2)安装稳压电路部分
集成稳压器要安装适当散热器,根据散热器安装的位置决定是否需要集成稳压器与散热器之间绝缘,输入端加电流电压U I,调节电位器RW,输出电压应随之变化,说明稳压电路正常工作。

注意检查在额定电流下稳压器的发热情况。

(3)安装电流源部分
该部分电流值较大,所以器件的选型要特别注意,一般选额定功率较大的器件,采用四股绞线作为电路的连接线。

(4)单片机系统
在设计时要考虑到将来修改、扩展的方便,对各资源留有一些余地,并尽可能采用功能强的芯片。

七、元器件清单
名称型号数量(个) 备注
电容CT4-0.1uF-63V-Ⅱ19 CBB 4 CT4-0.1uF-63V-Ⅱ 4 CD-4700uF-50V-Ⅱ 1 CD-2200uF-50V-Ⅱ 2 CD-100uF-25V-Ⅱ 2 CD-47uF-25V-Ⅱ 2 CD-10uF-25V-Ⅱ 5 CC-30pF-63V-Ⅱ 2
电阻RJ-1/4W-200-±10% 9 RJ-1/4W-1K-±11% 3 RJ-1/4W-10K-±12% 9 RX21—10W 2
集成块集成块AT89C55WD-24PI 1
OKIM81C55-5 1
HM6264ALP-10 1
TLO2543 1
TL084CN 2
CD4001BE 1
TY5617 1 贴片DM74LS373N 1
SN74LS138N 1
MAX232PE 1
DMLS245N 1 发光二极管
绿色LED 1
红色LED 1 数码管SNM4205-1 6 晶振12M 1 开关OMROM 17
插座20PIN 6 16PIN 2 5PIN 1 3PIN 2
变压器220V/ 15V—70W
220V/2*15V-50W 2
保险丝
BX250V-2A 3
BX250V-0.5A 1 整流桥PBP205 1
三端稳压器LM338K 1 LM7812K 1 L7912 1 LM7805 1 L7905 1
二极管6A1000V 4
整流1N4007 10
三极管
S8050 1
2N3005 1 保险丝支架 2
散热片TO-3 1 318 3
电位器
3296多圈
八、总结与思考:
经过四天的奋力拼搏,基本上完成了课题,在数控给定值和步进调整功能方面还做的比较出色。

当然这些都离不开老师们平时的谆谆教诲和赛前的尽心辅导。

虽说教学相长,但我们觉得我们才是这次比赛的最大受益者,通过这一段时间的训练,不仅动手增强了许多,而且理论上也有了更深的认识。

回过头再看看我们的作品,由于购买器件的时间过长,就直接导致所做的作品不仅制作比较粗糙,而且整个作品的布局都不是最优化的。

同时电路的保护措施也不完善,可以在电路中加接一个幅度控制电路,使电路在输出大电流时幅度有较大的变化。

通过这次比赛也使我们认识到,在完成一项任务时团队的力量是何其重要,只有在三人的不屑努力下才有可能在短短的四天三夜内完成此项目的所有要求。

九、附录
1、使用说明书
输出电流在200m A~2A范围内可调,第五位数码管为“H”时,表示此值是预置值,为“Y”时表示此值是测量值。

操作步骤如下:
a接通电源后,至少预热一分钟。

b设置输出电流:系统默认输出值为500mA,按“B”键,为递增,按“F”键为递减。

每按一下,步进10mA。

*注:输出电流值时将负载R L断开。

2、参考文献
《恒流源及其应用电路》…………电子书
《实用稳定电源》…………………人民邮电出版社
《电子设计技术》………………电子科技大学出版社
《单片机应用技术》…………西安电子科技大学出版社《新型电源电路应用实例》……电子工业出版社
3、数控直流电流源程序
#include <reg52.h>
#include "absacc.h"
#include <intrins.h>
#include <string.h>
#include "ctype.h"
#include <stdlib.h>
#include "min_uin.h"
#define Order_state XBYTE[0x2400]
#define port_a XBYTE[0x2401]
#define port_b XBYTE[0x2402]
#define port_c XBYTE[0x2403]
#define timer_l XBYTE[0x2404]
#define timer_h XBYTE[0x2405]
unsigned char code led_show_code[27]={{0x3f},{0x06},{0x5b},{0x4f},{0x66},
{0x6d},{0x7d},{0x07},{0x7f},{0x6f},
{0x77},{0x7c},{0x39},{0x5e},{0x79},
{0x71},{0x76},{0x38},{0x73},{0x31},
{0x3e},{0x6e},{0x40},{0x80},{0x00}};
unsigned int code d_a_code[181]={{0x012b},{0x0135},{0x0143},{0x014c},{0x0154},{0x015e},
{0x0168},{0x0173},{0x017b},{0x0184},{0x018e},{0x0198},
{0x01a0},{0x01aa},{0x01b4},{0x01be},{0x01c5},{0x01d0},
{0x01da},{0x01e3},{0x01ec},{0x01f7},{0x01ff},{0x020a},
{0x0210},{0x021b},{0x0224},{0x022f},{0x0238},{0x0243},
{0x024b},{0x0253},{0x025e},{0x0267},{0x0272},{0x027d},
{0x0281},{0x028e},{0x0297},{0x029f},{0x02aa},{0x02b0},
{0x02bb},{0x02c5},{0x02cf},{0x02d8},{0x02e0},{0x02ea},
{0x02f5},{0x02ff},{0x0305},{0x0310},{0x031a},{0x0323},
{0x032c},{0x0335},{0x033f},{0x034a},{0x0350},{0x035b},
{0x0366},{0x036e},{0x0378},{0x0383},{0x038a},{0x0394},
{0x039f},{0x03a5},{0x03b3},{0x03ba},{0x03c4},{0x03cf},
{0x03d5},{0x03e1},{0x03eb},{0x03f2},{0x03fc},{0x0407},
{0x0411},{0x041b},{0x0422},{0x042e},{0x0438},{0x0443},
{0x044b},{0x0452},{0x045c},{0x0467},{0x046f},{0x047a},
{0x0480},{0x049a},{0x0494},{0x049d},{0x04a4},{0x04b1},
{0x04bb},{0x04c2},{0x04cc},{0x04d7},{0x04e0},{0x04ea},
{0x04f4},{0x04fe},{0x0505},{0x050f},{0x0519},{0x0520},
{0x052b},{0x0534},{0x053f},{0x054a},{0x0550},{0x055a},
{0x0564},{0x056e},{0x0577},{0x0582},{0x058a},{0x0594},
{0x059e},{0x05a4},{0x05ae},{0x05b7},{0x05c2},{0x05cc},
{0x05d4},{0x05df},{0x05e8},{0x05f0},{0x05fc},{0x0608},
{0x0613},{0x061b},{0x0624},{0x062f},{0x0638},{0x0642},
{0x0648},{0x0659},{0x065d},{0x0666},{0x0671},{0x067c},
{0x0684},{0x068d},{0x0698},{0x06a3},{0x06ad},{0x06b4},
{0x06bf},{0x06ca},{0x06d2},{0x06dd},{0x06e4},{0x06ed},
{0x06f7},{0x0700},{0x070a},{0x0714},{0x071d},{0x0727},
{0x0730},{0x073b},{0x0744},{0x074d},{0x0757},{0x0760},
{0x076a},{0x0774},{0x077d},{0x0787},{0x0790},{0x079a},
{0x07a4},{0x07ad},{0x07b8},{0x07c2},{0x07cc},{0x07d4},
{0x07df}
};
unsigned char code max_buf[6]={{0x0a},{0x00},{0x00},{0x00},{0x02},{0x00}}; unsigned char code min_buf[6]={{0x0a},{0x00},{0x00},{0x02},{0x00},{0x00}}; unsigned char data xad_buf[8],AD_start_reg,set_time_fl=0,max_min=0; unsigned char xdata ad_set_buf[6],da_date=0x00,frequent_h=0;
unsigned char data led_reg,led_w,led_buf[6],move_reg=8,kj_time=0;
unsigned int data port_c_buf=0,port_c_buf_1=0,data_show_reg,data_buf; unsigned int xdata in_data=0,ad_read_val[16],ad_all,led_sum=0;
unsigned char data ad_read_time,ad_time;
unsigned int data dac_out_data,chazhi,show_reg;
bit timer_int,ad_change_end=1,kj,set_flag,shuchu_tai=0;
bit adj=0;
sbit CS=P1^2;
sbit clk=P1^4;
sbit din=P1^5;
sbit dout=P1^6;
sbit ad_cs=P1^3;
void i8155_init()
{
Order_state=0x03; /*口AB输出,口C输入,定时器空操作*/ port_a=0xff; /*LED亮*/
port_b=0x00;
x25_delay(2000);
port_a=0x00; /*LED灭*/
port_b=0xff;
}
/***********************************************************
***********************************************************/ void delay(unsigned char nx)
{
unsigned char i;
for(i=0;i<nx;i++)
i=i;
}
/************************************************************* *************************************************************/ system_init()
{
TMOD=0x01;
TCON=0x04;
TH0=0xf4;
TL0=0x47;
}
/************************************************************* **************************************************************/ int_t0() interrupt 1 /*t0定时器中断*/
{
timer_int=1;
TH0=0xf4;
TL0=0x47;
}
/**************************************************************
A/D_chang()
写入的数据为A/D_order;读出的数据为A/D_data
**************************************************************/ unsigned int a_d_chang(unsigned int a_d_order)
{
unsigned char idata count;
unsigned int idata a_d_data; /*A/D_CS=0*/
ad_cs=0;
delay(20);
a_d_data=0;
for (count=0;count<16;count++)
{
delay(1);
a_d_data=a_d_data<<1;
clk=0;
delay(1);
if ((a_d_order&0x8000))
din=1;
else din=0;
a_d_order=a_d_order<<1;
delay(1);
clk=1;
delay(1);
if (dout)
a_d_data++;
}
clk=0;
delay(20);
ad_cs=1;
return(a_d_data);
}
/************************************************************** /************************************************************** ;IIC总线写一个字节
;VSDA IIC总线数据口
;VSCL IIC总线时钟口
*************************************************************** ;**************************************************************/ void IIC_write(unsigned int w_data)
{
unsigned char data i;
unsigned int data temp;
temp=w_data;
clk=1;
din=1;
CS=0;
for (i=0;i<16;i++)
{
delay(5);
if ((temp&0x8000))
din=1;
else
din=0;
temp=temp<<1;
delay(5);
clk=0;
delay(5);
clk=1;
}
clk=1;
delay(5);
CS=1;
}
/*************************************************************/ /************************************************************** 定时器0中断处理
void time_a/d()
求第N路输出的值=计算它的实际值
**************************************************************/ void time_a_d()
{
unsigned char idata i;
unsigned int data a_d_order,a;
a_d_order=0x0c00;
a=a_d_chang(a_d_order);
in_data=in_data+a;
ad_read_time++;
if (ad_read_time>=16)
{
ad_read_time=0;
ad_read_val[ad_time]=(in_data>>4);
in_data=0;
ad_time++;
if (ad_time>=16)
{
ad_all=0;
for (i=0;i<16;i++)
{
ad_all=ad_all+ad_read_val[i];
}
ad_all=ad_all>>4;
adj=1;
}
}
}
/************************************************************** ***************************************************************/ main()
{
unsigned char data i;
SP=0x5f;
delay(255);
delay(255);
delay(255);
delay(255);
system_init();
i8155_init();
led_w=0x01;
for(i=0;i<6;i++)
{
led_buf[0]=0x0a;
led_buf[1]=0x00;
led_buf[2]=0x00;
led_buf[3]=0x05;
led_buf[4]=0x00;
led_buf[5]=0x00;
ad_set_buf[i]=led_buf[i];
}
TR0=1;
ET0=1;
EA=1;
for(;;)
{
if (timer_int==1)
{
show_reg++;
if (show_reg<=1000)
{
for (i=0;i<6;i++)
led_buf[i]=ad_set_buf[i];
led_buf[5]=0x10;
}
else if (show_reg<=2000)
{
for (i=1;i<5;i++)
led_buf[i]=ad_all;
led_buf[5]=0x15;
}
else show_reg=0;
timer_int=0;
led_sum=(led_buf[2]+led_buf[3]*10+led_buf[4]*100)-20;
dac_out_data=d_a_code[led_sum];
IIC_write(dac_out_data|0x8000); /*计算当前显示位*/
port_b=0xff;
led_w=(led_w<<1);
if (led_reg==6)
{
led_w=0x01;
led_reg=0;
port_c_buf=0xff;
}
port_a=led_show_code[led_buf[led_reg]]; /*送段码*/
i=led_show_code[led_buf[led_reg]];
if (led_w==0x10)
port_a=(i|0x80);
if (!set_flag)
port_b=~(led_w); /*送位码*/
if (led_reg==0) /*形成16位按键数据*/
port_c_buf=(0x0f&port_c);
else if ((led_reg>=1)&&(led_reg<=3))
port_c_buf=(port_c&0x0f)+(port_c_buf<<4);
if (led_reg==4)
{ /*判断按键是否有抖动*/
if (port_c_buf==port_c_buf_1)
{
if ((kj==0)&&(port_c_buf!=0xffff)) /*判断按键是否处理按键是否按下*/
{
kj_time++;
if (kj_time>=5)
{
kj=1;
kj_time=0;
switch (port_c_buf)
{
case 0xdfff:
{
ad_set_buf[1]=ad_set_buf[1]+10;
if(ad_set_buf[4]>=2)
{
for(max_min=0;max_min<6;max_min++) ad_set_buf[max_min]=max_buf[max_min];
}
if(ad_set_buf[1]>=0x0a)
{
ad_set_buf[1]=0;
ad_set_buf[2]++;
if(ad_set_buf[2]>=0x0a)
{
ad_set_buf[2]=0;
ad_set_buf[3]++;
if(led_buf[3]>=0x0a)
{
ad_set_buf[3]=0;
ad_set_buf[4]++;
}
}
}
}
break;
case 0xefff:
{
ad_set_buf[1]=ad_set_buf[1]-10;
if(ad_set_buf[1]>=0x0a)
{
ad_set_buf[1]=0;
ad_set_buf[2]--;
if(ad_set_buf[2]>=0x0a)
{
ad_set_buf[2]=9;
ad_set_buf[3]--;
if(ad_set_buf[3]>=0x0a)
{
ad_set_buf[3]=9;
ad_set_buf[4]--;
}
if(ad_set_buf[3]<0x02)
{
for(max_min=0;max_min<6;max_min++)
ad_set_buf[max_min]=min_buf[max_min];
}
}
}
}
break;
default:
break;
}
}
}
}
else
{
kj=0;
kj_time=0; /*两次读按键不同清按键处理标志为下次读按键做准备*/
port_c_buf_1=port_c_buf;
port_c_buf=0xff;
}
}
led_reg++;
}
}
}。

相关文档
最新文档