AT89S52单片机数控直流电源原理图程序数控直流电源.doc

AT89S52单片机数控直流电源原理图程序数控直流电源.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PAGE PAGE 6 数控直流电源 方案论证与选择 方案一:原理框图如图1所示,采用数字逻辑控制。通过“+”、“-”两键操作,控制可逆计数器分别作加、减计数,可逆计数器的二进制数字输出一路用于驱动数显电路,指示电源输出电压的大小值;另一路进入D/A转换电路,将数字量按比例转换成模拟电压,然后经过射极跟随器控制调整输出级输出所需的稳定电压。该方案能够完成基本要求,发挥部分受到限制。 图一 方案一示意图 方案二:原理框图如图2所示,采用8051单片机产生波形,D/A转换器将其转化为模拟电压,再经过放大器放大。由单片机的软件实现电压的步进增减、对键盘的自动扫描等功能。该方案灵活性大,易于扩展,需要专用的译码驱动芯片。 图二 方案二示意图 方案三:数控部分同方案二,原理框图如图三。用74LS164作驱动器,由单片机软件控制数码显示,软件还附有显示器的自动刷新及电路的过零保护等功能。该方案具有方案二的所有优点,而降低了对芯片的要求,提高了系统的可靠性。 图三 方案三示意图 综上所述,选用方案三。 二.理论分析与参数计算 1. DAC0832简介 DAC0832是一款采用CMOS工艺制成的单片电流输出型8位数 / 模转换器,图四是它的逻辑框图和引脚排列。DAC0832有三种工作方式:不带缓冲工作方式,单缓冲工作方式,双缓冲工作方式。 图四 DAC0832的逻辑框图和引脚排列 2.步进01.V的实现 因为输出电压量程为10V,VREF基准电压范围为-10V+10V,基准电压可以为5.12V,这样在DAC0832的8脚输出电压的分辨率为: 即D/A输入数据端每增加1,电压增加0.02V。D/A的电压输出端接放大器OP27 的输入端,放大器的放大倍数为5 ,才能得到输出电压的电压分辨率: 0.02V×5=0.1V 这样当调节电压的时候,以每次0.1V的梯度增加或者降低电压。 三.硬件电路图 1.波形转换与放大部分 选用51系列的单片机产生和控制波形。数模转换器用的是DAC0832,本方案中DAC0832采用单缓冲模式。 电路如图五所示,P0口和DAC0832的数据口直接相连, 和 接地,DAC数据寄存器处于直通状态,ILE=1,和连接后接P2.0。在选中该片的地址(=0)时,写入数字量,该数字信号就立即传送到DAC输入寄存器,并直通至DAC数据寄存器,经过短暂的建立时间,即可以获得相应的模拟电压。 写入操作结束, 和立即变为高电平,写入的数据被输入寄存器锁存,直到再次写入刷新。 图五 波形产生与转换电路 图六 电流放大电路 2.键盘与数码显示部分 电路如图七 图七 键盘与显示电路 3.稳压电源部分 电源部分输出+5V,+15V,-15V电压供给系统,另外还制作+5.12V直流稳压电源做DAC0832的VERF的基准电压。 四.软件设计与流程图 1.软件介绍 软件部分采用模块化程序设计的方法编写,系统软件由主控制程序、数码显示子程序、键盘服务子程序组成。还添加了自动扫描键盘、显示器的自动刷新、过零保护的功能。编程中C函数和汇编函数相互调用。 2.程序流程图 如图九所示 图九 软件流程图 五.程序如下 #includereg51.h #define uchar unsigned char sbit dp=P1^4; sbit sh=P1^5; void delay(unsigned int t); uchar Getkey(void); void Disp(uchar n); uchar Disptab[10]={0x11,0x7d,0x23,0x29,0x4d,0x89,0x81,0x3d,0x1,0x9}; main() { uchar key; char Vol1=0x00,Vol2=0x00; Disp(Disptab[Vol2]); Disp(Disptab[Vol1]-1); P0=0x00; while(1) { key=Getkey(); switch(key) { case 0x01:break; case 0x02:break; case 0x04:if(Vol1==0Vol2==0)break; Vol2--; if(Vol20) { Vol2=9;Vol1--; } Disp(Disptab[Vol2]); Disp(Disptab[Vol1]-1); P0=4.3*(Vol1*10+Vol2); bre

文档评论(0)

勤劳的小厮 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档