找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6695|回复: 2
收起左侧

51单片机直流电压源Proteus仿真电路程序设计

[复制链接]
ID:667152 发表于 2020-7-2 12:28 | 显示全部楼层 |阅读模式
整体电路
1.png

电源模块
2.png
文件有仿真图,程序和文档

本设计以直流电压源为核心,STC89C52单片机为主控制器,单片机系统是数控电源的核心。它通过软件的运行来控制整个仪器的工作,从而完成设定的功能。通过数字键盘来设置直流电源的输出电压,输出电压范围为0V—9.9V,最大电流为1A,并可由液晶屏 LCD1602显示实际输出电压值。本设计由单片机程 控输出数字信号,经过 D/A转换器(DAC0832 )输出模拟量,同时输出采用 ADC0832 对采样的电压、电流转换为数字信号,再经过运算放大器隔离放大,最后通过单片机实现闭环控制输出各种设备所需要的电压。实际测试结果表明,本系统实际应用于需要高稳定度小功率恒压源的领域。

  数控直流电压源是与普通直流电压源相比,具有输出电压不连续变化的特点并且能由数码管显示,可以由“+”、“-”两键分别控制输出电压步进增减输出电压。本例设计的电压源输出电压的范围:0~+9.9V,步进0.1V,纹波不大于10mV,除具有以上显示控制功能外还能实现输出电压可预置在0~9.9V之间的任意一个值;用自动扫描代替人工按键,实现输出电压变化(步进0.1V不变),以及通过接入单稳态电路,可以克服按键抖动引起的误动作,运用计数器的反馈清零接法,起到防止误操作的作用。
(1)输出电压:范围0~+9.9V,步进0.1V,纹波不大于10mV;(2)输出电流:500mA;(3)输出电压值由数码管显示;(4)由“+”、“-”两键分别控制输出电压步进增减;(5)为实现上述几部件工作,自制一稳压直流电源,输出±15V,+5V。


2.1 工作方案选择和论证

根据对现状的分析,以及选题的指导,本课题的主要任务是220V的市电输入到电路中,经过变压、桥堆整流、滤波电路;经稳压调整模块数据采集后输出系统所需电压,同时单片机通过软件的运行来控制整个仪器的工作,从而完成设定的功能。通过数字键盘来设置直流电源的输出电压,通过A/D转换、并可由数码管显示实际输出电压值。

2.1.1 主控芯片分析选择

芯片的控制模块主要靠单片机来实现,单片机有有多种型号,比较常见的有两种,分别是:52系列单片机和凌阳系列单片机。52系列单片机的优势是价格便宜,有较强的算术计算能力,而且逻辑控制算法的实现比较灵活,同时功耗较低、技术比较成熟,有很好的抗干扰性能。凌阳系列单片机可以看作是专业版的52系列单片机,其可以实现更加复杂的逻辑控制,进行了更高层次的聚合,体积进一步减小,运算速度进一步提高,常用于大规模系统的控制,但价格比较昂贵。因为52单片机价格低于凌阳系列,且本次设计需要的处理速度较低,出于经济和方便的角度考虑,方案1为最佳方案。

2.1.2控制方案比较

方案一:采用各类数字电路来组成键盘控制系统,进行信号处理,如选用CPLD等可编程逻辑器件。本方案电路复杂,灵活性不高,效率低,不利于系统的扩展,对信号处理比较困难。


方案二:采用STC89C52单片机作为这个系统的控制单元,可以通过DAC0832的数据采样和放大器的电压调整可以改变系统输出电压的大小。 为了能够使系统具备检测实际输出电压值的大小,可以将输出电压经过DAC0832进行模数转换,间接用单片机实时对电压进行采样,然后进行数据处理及送数码管显示。显示的电压值便是输出的电压大小。此系统比较灵活,采用软件方法来解决数据的预置以及电压的大小控制,使系统硬件更加简洁,各类功能易于实现,能很好地满足题目的要求。比较以上两种方案的优缺点,方案一中CPLD可编程逻辑器件控制电路内部接口信号繁琐,中间相互关联多,抗干扰能力差;在方案二中采用单片机完成整个数控部分的功能,也便于系统功能的扩展。

2.1.3 稳压输出方案比较

方案一 采用线性调压电源。以改变其基准电压的方式使输出不仅增加/减少, 这样不能不考虑整流滤波后的纹波对输出的影响。

方案二 使用运算放大器对电压的比较放大由于运算放大器具有很大的电源电压抑制比,可以大大减小输出端的纹波电压。在方案一中输出的电压很难跟踪电压的快速变化,而方案二中的输出电压波形与DAC0832的输出波形相同,不仅可以输出直流电平,而且只要预先生成产生波形的量化数据,便可以输出多种波形,使系统产生的信号源有一定的驱动能力。

2.1.4 显示模块的选择

显示模块也有多种备选方案,最常用的有LED数码管和LCD液晶显示屏。两种显示方式各有优缺点,LED价格简单、使用方便而且亮度较高,但能耗大;LCD功耗小、接口简单、显示清晰,但价格昂贵,使用复杂。结合对比权衡以及课题的具体需求,本文决定选用LED作为解决方案。


2.2 方案确立

220V 的市电输入到电路中,经过变压、桥堆整流、滤波电路;经稳压调整模块数据采集后输出系统所需电压,同时单片机通过软件的运行来控 制整个仪器的工作,从而完成设定的功能。通过数字键盘来设置直流电源的输出电压,并可由 LED显示实际输出电压值。 由单片机程 控输出数字信号,经过 D/A 转换器( DAC0832)输出模拟量,再经过运算放大器隔离放大,最后输出各种设备所需要的电压。

2.3总体框图

2.4 总电路图
本章小结

本章主要介绍这次毕业设计的方案选择,包括系统控制核心的选择及确定以及显示模块的选择及确定。在下一章节当中,将对该课题中各单元电路的具体设计方案、元器件的选择作进一步。


第3章 控制电路设计3.1  STC89C52单片机简介

控制部分是系统整机协调工作和智能化管理的核心部分,主要部分包括键盘和 STC89C52RC单片机,而 STC89C52RC单片机实现控制功能是关键,采用单片机不但方便监控,并且大大减少硬件设计。

3.1.1  STC89C52简介

STC89C52为八位单片机,程序存储器为8K,外部可扩展至64K,内部RAM为512B,可扩展至64K,正常工作电压5V,支持最高时钟频率为80MHz,内置看门狗电路,支持ISP/IAP。

3.1.2  STC89C52引脚说明

VCC(40引脚):电源电压;VSS(20引脚):接地P0端口(P0.0~P0.7,39~32引脚):P0口是一个漏极开路的8位双向I/O口。作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以作为高阻抗输入。在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线。此时,P0口内部上拉电阻有效。在Flash ROM编程时,P0端口接收指令字节;而在校验程序时,则输出指令字节。验证时,要求外接上拉电阻。P1端口(P1.0~P1.7,1~8引脚):P1口是一个带内部上拉电阻的8位双向I/O口。P1的输出缓冲器可驱动(吸收或者输出电流方式)4个TTL输入。对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这是可用作输入口。P1口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电流。

此外,P1.0和P1.1还可以作为定时器/计数器2的外部技术输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX)。在对Flash ROM编程和程序校验时,P1接收低8位地址。P2端口(P2.0~P2.7,21~28引脚):P2口是一个带内部上拉电阻的8位双向I/O端口。P2的输出缓冲器可以驱动(吸收或输出电流方式)4个TTL输入。对端口写入1时,通过内部的上拉电阻把端口拉到高电平,这时可用作输入口。P2作为输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流。在访问外部程序存储器和16位地址的外部数据存储器(如执行“MOVX@DPTR”指令)时,P2送出高8位地址。在访问8位地址的外部数据存储器(如执行“MOVX@R1”指令)时,P2口引脚上的内容(就是专用寄存器(SFR)区中的P2寄存器的内容),在整个访问期间不会改变。在对Flash ROM编程和程序校验期间,P2也接收高位地址和一些控制信号。P3端口(P3.0~P3.7,10~17引脚):P3是一个带内部上拉电阻的8位双向I/O端口。P3的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。P3做输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输入一个电流。RST(9引脚):复位输入。当输入连续两个机器周期以上高电平时为有效,用来完成单片机单片机的复位初始化操作。看门狗计时完成后,RST引脚输出96个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。ALE(30引脚):地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。在Flash编程时,此引脚也用作编程输入脉冲。XTAL1(19引脚):振荡器反相放大器和内部时钟发生电路的输入端。XTAL2(18引脚):振荡器反相放大器的输入端。

图 3-1 STC89C52引脚图

3.2 单片机的最小系统3.2.1 时钟电路

STC89C52单片机的时钟信号可以通过内部时钟方式和外部时钟方式两种方式产生。其中内部时钟方式如图3-1所示。在图中可以看出,内部时钟依赖于振荡电路,当XTAL1和XTAL2引脚外接上晶振时,振荡电路就会变成自激振荡器,这样内部的时钟

信号就会不断的产生。图中的两个电容主要用来快速振荡并维持频率稳定,电容值维持在5~30pF之间,典型状况下为30pF。晶振的振荡频率需要控制在1.2~12MHz之间,一般取12MHz或6MHz。

图3-2时钟电路
3.2.2 复位电路

当RST引脚上的高电平在两个机器周期中连续出现时,复位操作就会被触发。若两个周期以后电平的状态还是高电平,那么复位操作就一直被执行下去,直到电平状态恢复到低电平为止。常见的复位电路实现方式有按钮手动复位和上电自动复位两种。最简单的自动复位依赖于复位电容的充放电,只要Vcc的上升时间在1ms之内,就可以实现自动复位;手动复位需要借助人工按按钮的操作,有两种比较常见的方式:脉冲和电容,其中电平复位依靠电源Vcc与RST端的连通来实现,本文选用的就是手动复位方式。图3-4给出了手动复位的电路图,当时钟频率的要求是11.0592MHZ时,电容值取10uF,电阻值取10kΩ。

图 3-3 按钮复位电路

3.3 电源模块

市电是交流电,其电压虽然标识的是220V,但实际上220V只是一个平均值,它存在着波动,因此当需要比较稳定的直流电压时,就需要整流滤波操作。整流滤波的操作有整流滤波电路来实现。本文选用的整流滤波电路是桥式的,因为桥式的实现非常简单,而且能够达到本文的需求。桥式电路的结构如图4-1所示利用放大器产生所需的电源电压以供集成芯片和单片机使用。如图3-14所示为系统电源供电模块图。变压器产生15V左右的交流电,电源的输入端电源由15V变压器的线圈提供,经过整流桥D整流后经电容C1滤成平稳的12V作为Q1的输入电源,输出端经过Q1滤波后就可得到平稳的幅值为12V的直流电。产生的12V直流电压给Q2的正电源端供电。Q2的输入电源直接由U6产生的12V直流电提供,其输出电压也是通过电容C2进行滤波。输出的5V电压作为单片机的供电电源

图 3-4 电源电路
3.4  D/A转换和显示电路的设计

DAC0832是一种D/A转换芯片,具有双通道、8位分辨率的性能,由美国半导体公司生产。DAC0832因为其性价比高、兼容性强、体积小的优势,占据了很大的D/A转换芯片市场份额,是很多单片机用户的首选。学习并熟练使用DAC0832可使我们了解D/A转换器的原理,并提高我们单片机技术的水平。芯片如下所示:

图 3-5 D/A芯片

芯片接口说明如下所示:DO:信号输出接口,主要用于D/A转换的输出;DI:信号输入接口,主要用于命令的输入;CLK:时钟,频率不超过600K赫兹;CH0:频道0,可作为正负输入端使用;CH1:频道1,可作为正负输入端使用;GND:接地Vcc(VREF):电源输入参考电压输入。CS_:片选,只有在低电平时才能发挥作用;DAC0832的工作原理:单片机与DAC0832之间通常需要用四根数据线相连,分别是CLK、CS、DO、DI。但考虑到DI和DI在实际的使用过程中,不会同时同时被占用,而且单片机接口通常也是双向的,因此在实际的使用中DI和DO可以用一根数据线并联连接。当DAC0832的CS端的电平为高电平时DAC0832是无法工作的,此时DIDO端口以及CLK端口的电平不产生任何影响,因此可以任意选择;当DAC0832的CS端的电平为低电平时,DAC0832芯片进入工作状态,此时时钟脉冲通过CLK端输入,数据信号也通过DI端进入,当第1个脉冲行将结束时,DI端必须处于高电平状态,以便信号的启动。DI端使用2位的数据对通道功能的选择进行编码,此步骤完成在第2、3个脉冲下沉之前。这两位编码可以组合出四种情

形如下:当编码为“11”时,只有CH1通道起作用;当编码为“10”时,进队CH0通道起作用;当编码为“01”时,CH1被当成正输入端使用,而CH0责备当成负输入端使用;当编码为“00”时,CH1被当做负输入端使用,而CH0则被当作正输入端使用。当第三个脉冲结束以后DI端的使命就完成了,DO端开始发挥作用,将转换的数据读取过来并进行输出。从第四个脉冲完成,一直到第十一个脉冲完成,DO端会按照从高到低的顺序依次输出一个字节的8位转换结果,从第十一个脉冲下沉完成后,开始输出下一个相反字节,此时一直到第19个脉冲之间都不需做处理,直接输出,这样的过程就是一个完整的DA转换过程。DA转换完成以后,将CS端的电平调整到高电平,芯片停止工作,对转换后的数据进行处理。若要同时使用多个7段LED数码管,就必须应用扫描式的显示。硬件电路方面,首先将每个7段LED数码管的a,b,c,g都连接到一起,然后使用晶体管对他们的共同引脚进行逐个驱动。最后的显示是通过将第一个7段LED数码管需要显示的数据发送到发送到a,b,c,g总线上,并把扫描信号发送到公共端来实现的。图中LED1,LED2分别连接89C52的P2.0 ,P2.1 管脚,根据89C52的输出信息来判断驱动哪一个数码管,即哪一个数码管亮,而A~G和DP连接89C52单片机的P0.0~P0.7管脚,根据89C52的输出的数字信息从而判断数码管的哪一段亮,显示出所输出的电压值。

3.5键盘控制子系统

键盘控制子系统如图 3-6 所示。本设计中,采用独立按键 K11-K44共16个对单片机核心芯片STC89C52进行输入控制。各按键分别一端接地,一端接单片机引脚。实现功能:按键 K11-K23为对应的数字0-9,K14,K24分别是加减0.1,K34表示位选择键(十位或各位),K33是确定键。选择电压后,按确定键,便可输出所需的电压。

图 3-6键盘控制子系统

本章小结

本章内容主要对各类硬件设计进行了说明,包括单片机最小系统的设计,时钟电路的设计,复位电路的设计,电源模块的设计,显示电路的设计,。一一阐述了设计思路以及设计方法,在下一章,主要对系统的软件部分的设计进行详细阐述。



第4章 软件程序设计4.1 系统主程序设计流程及说明

首先对系统进行初始化,读取预存储的电压值,本次设计中预存储电压值为9.9V,并将其发送给 LED显示电压值;之后在判断是否有键按下,当有键盘有按键按下时,接收来自键盘的电压输入值,并通过 D/A把输入的数字量转换成模拟电压值,控制输出电压的大小。然后采样输出电压的大小,并与输入电压值进行比较放大,由电压调整电路调整输出电压的大小,直到输出电压与输入电压相等。通过比较从LED显示更新的电压值。主程序流程图如所示

图 4-1主程序流程图
4.2 数码管显示子程序流程图

程序实现的功能是将单片机从AD0832读取的数字信号转换为七段码在LED上显示出来。显示方式采用的是动态扫描的方式,先给位选信号,再给段选信号,然后延时一下。结束延时10ms显示第四位送形第四位送位选给低复位冲4s<t<960us第三位送形第三位送位选给低延时10ms显示第二位送形第二位送位选给低第一位送形第一位送位选给低延时10ms显示。

图 4-2数码管显示子程序流程图
本章小结

本章主要系统的软件进行了分析和设计,包括参数设置,软件开发环境,程序初始化设计,显示模块程序设计。绘制了各个程序的框图。下一章将对系统的电路安装与调试过程展开论述。

第5章 系统调试与测试结果
5.1 系统软件调试

用电压表在运算放大器输出端上测量电压;将所得的结果与数字显示值和LED显示值进行比对,如果误差超过了合理的范围,那么就需要对软件部分进行调试。调试的重点应该放在采样模块和D/A转换模块的代码,使用软件调试的常用方法,逐步排查,找到问题所在。

5.2 系统硬件调

系统可能出现的偏差有两类,一是输出的电压不够稳定,有波动,二是数字的显示与数码管的显示存在不一致。如果出现上面的两类偏差,就需要对系统进行硬件调试。硬件调试的方法是对系统进行各类检查,检查主要从以下几个方面进行:(1)各部件是否都是完好无损的;(2)电阻的选择是否科学;(3)电压的供应是否正常。硬件调试是解决问题的有效手段。

本章小结

了解一个课题的内容熟悉就需要对于电路的整机原理进行学习,所以本章对于整机原理进行介绍。此外,又分别对于电路如何调试以及可能会出现的问题进行了介绍。通过调试然后解决问题可以使此次设计能够更好的达到预期的指标。


单片机源程序如下:

  1. #include<reg51.h>
  2. #include
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar aa,bb,cc,dd,jj,ii,jjj,iii,key,j;
  6. uchar time1=0;
  7. sbit led1=P2^0;
  8. sbit led2=P2^1;
  9. sbit ce=P2^4;
  10. #define timer0_count 0xfc18//定时器初值,设置time0 1/1000秒中断一次
  11. const seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管的显示
  12. const seg_point[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//有小数点的数码管显示
  13. uchar scan1;//用来分别显示2个数码管
  14. uchar scan2;
  15. uchar counter[2]={0xf1,0xf2};
  16. uchar vout=0; //j_片选,vout_电压输出

  17. static void timer0_initialize(void)//timer0的初始化
  18. //定时器的初始化程序
  19. {
  20.         EA=0;        //中断控制器IE--停止接受中断
  21.                 TR0=0;        //停止计时
  22.                 TMOD=0x01;     //设置工作方式为1
  23.                 TL0=(timer0_count & 0x00ff);
  24.             TH0=(timer0_count>>8);  //设置time0 初值      
  25.                 PT0=1;    //设置timer0高优先级
  26.                 ET0=1;          //允许timer0中断
  27.                 TR0=1;           //开始计时
  28.                 EA=1;           //开所有中断
  29. }

  30. void delay(uint t) //tms的延时
  31. {   
  32.         uchar i;
  33.         uint j;
  34.     for(j=0;j<t;j++)
  35.                 for(i=0;i<40;i++);
  36. }
  37. void shuc(void)
  38. {         
  39.          uchar nn;
  40.          vout=2*(scan2*10+scan1);//输出的数字量
  41.         P1=vout;
  42.         for(nn=0;nn<250;nn++)
  43.                 ;
  44.                 nn=0;//输出是存在D/A转换时间差所以要延时

  45. }
  46. void shaom(void)
  47. {
  48.          P3=0x0f;//扫描是否有按键按下
  49.      if((P3&0x0f)!=0x0f)
  50.      dd=0;
  51.          else
  52.          dd=1;
  53. }
  54. void zdbj(void) //自动步进
  55. {
  56.         uchar rr;
  57.         jj=scan2;
  58.         ii=scan1;
  59.         shaom();
  60.         for(;jj<10;jj++)
  61.     {
  62.             for(;ii<10;ii++)
  63.                 {
  64.                          if(dd)
  65.                                  {
  66.                                          scan1=ii;
  67.                                          scan2=jj;
  68.                                         shuc();
  69.                                          for(rr=0;rr<250;rr++)
  70.                                         {
  71.                                                 shaom();
  72.                                                 if(dd)      
  73.                                                  delay(70);
  74.                                                 else
  75.                                                 break;
  76.                                         }
  77.                                          if(jj==9&&ii==9)
  78.                                          {
  79.                                                  ii=0;
  80.                                                  jj=0;
  81.                                          }

  82.                                  }
  83.                         else
  84.                          {
  85.                                  jj=10;
  86.                                  ii=10;
  87.                          }
  88.                 }
  89.                 ii=0;
  90.     }
  91.         jj=0;
  92.         shaom();
  93.         for(;dd==0;)
  94.         shaom();

  95. }

  96. void sjb(void)        //三角波
  97. {
  98.         uchar max;
  99.         max=vout;
  100.         shaom();
  101.         for(;dd;)
  102.          {
  103.                    for(iii=0;iii<=max;iii=iii+2)
  104.                    {
  105.                           P1=iii;
  106.                         shaom();
  107.                          delay(10);
  108.                            if(dd==0)
  109.                  break;
  110.                 }
  111.                 if(dd==0)
  112.             break;
  113.                 for(;iii>0;iii=iii-2)
  114.                 {
  115.                         P1=iii;
  116.                         shaom();
  117.                         delay(5);
  118.                         if(dd==0)
  119.                         break;
  120.                 }
  121.                 if(dd==0)
  122.             break;
  123.           }
  124.            P1=max;
  125.          shaom();
  126.          for(;dd==0;)
  127.         shaom();
  128. }
  129. unsigned char keyscan(void)  //键盘扫描函数,使用行列反转扫描法
  130. {
  131.          unsigned char cord_h,cord_l;//行列值中间变量
  132.         P3=0x0f;          //行线输出全为0
  133.          cord_h=P3&0x0f;     //读入列线值
  134.          if(cord_h!=0x0f)    //先检测有无按键按下
  135.          {
  136.                   delay(70);        //去抖
  137.                   if((P3&0x0f)!=0x0f)
  138.                   {
  139.                     cord_h=P3&0x0f;  //读入列线值
  140.                     P3=cord_h|0xf0;  //输出当前列线值
  141.                     cord_l=P3&0xf0;  //读入行线值                                                                                                   ;;
  142.                         while((P3&0xf0)!=0xf0);//等待松开并输出
  143.                          {
  144.                                  time1=time1+1;
  145.                             return(cord_h+cord_l);//键盘最后组合码值
  146.                          }
  147.                   }
  148.          }return(0);     //返回该值
  149. }
  150. void timer0_isr(void) interrupt 1   //timer0中断
  151. //用于LED数码管的动态显示
  152. {

  153.          TR0=0;    //停止时钟0
  154.         P2=counter[j];
  155.         switch(j)
  156.         {
  157.                  case 0:P0=seg[scan1];break;                                                                                
  158.                  case 1:P0=seg_point[scan2];break;
  159.                          default:break;        //j为其他情况是跳出循环
  160.         }
  161.         j++;
  162.         if(j==2)
  163.         j=0;
  164.     TL0=(timer0_count & 0x00ff);
  165.         TH0=(timer0_count>>8);  //设置time0 初值
  166.         TR0=1;         //开时钟                                       
  167. }

  168. void main(void)
  169. {               
  170.         ce=0;
  171.         delay(5);   
  172.         scan1=(P3/2)%10;
  173.         scan2=P3/20;
  174.         ce=1;
  175.         delay(5);
  176.         shuc();

  177.         timer0_initialize();        //定时器初始化用于LED显示
  178.     do
  179.    {   
  180.             key=keyscan();
  181.                 if(time1==1)
  182.                 switch( key)
  183.         {      

  184.                         case 0xee:aa=1;break;//1 按下相应的键显示相对应的码值
  185.                  case 0xed:aa=2;break;
  186.                  case 0xeb:aa=3;break;
  187.                  case 0xe7:aa=4;break;//4
  188.                  case 0xde:aa=5;break;//5
  189.                        case 0xdd:aa=6;break;//5
  190.                           case 0xdb:aa=7;break;//6
  191.                             case 0xd7:aa=8;break;//7
  192.                           case 0xbe:aa=9;break;//8
  193.                           case 0xbd:aa=0;break;//9
  194.                      case 0xbb:time1--;break;//确认
  195.                            case 0xb7: //三角波
  196.                         {
  197.                         time1=0;
  198.                         sjb();
  199.                         }
  200.                         break;
  201.                            case 0x7e:                //加
  202.                     {
  203.                                 time1=0;
  204.                              scan1++;
  205.                         if(scan1==10)
  206.                                 {
  207.                                         scan1=0;
  208.                                     scan2++;
  209.                                         if(scan2==10)
  210.                                         scan2=0;
  211.                                 }
  212.                                 shuc();
  213.                         }break;//c
  214.                           case 0x7d:                //减
  215.                     {
  216.                                 time1=0;
  217.                         scan1--;                                   
  218.                                 if(scan1==-1)
  219.                                 {         
  220.                                         scan1=9;
  221.                                         scan2--;
  222.                                         if(scan2==-1)
  223.                                         scan2=9;
  224.                                 }
  225.                                 shuc();
  226.                         }break;
  227.                               case 0x7b:                //自动步进
  228.                         {
  229.                                 time1=0;
  230.                     zdbj();
  231.                         }break;//e
  232.                           case 0x77: time1--;break;      
  233.                   }

  234.                 if(time1==2)
  235.                 switch( key)
  236.                  {      

  237.                         case 0xee:bb=1;break;//0 按下相应的键显示相对应的码值
  238.                          case 0xed:bb=2;break;//1
  239.                           case 0xeb:bb=3;break;//2
  240.                      case 0xe7:bb=4;break;//3
  241.                      case 0xde:bb=5;break;//4
  242.                      case 0xdd:bb=6;break;//5
  243.                      case 0xdb:bb=7;break;//6
  244.                           case 0xd7:bb=8;break;//7
  245.                           case 0xbe:bb=9;break;//8
  246.                           case 0xbd:bb=0;break;//9
  247.                           case 0xbb:                //确认
  248.                         {
  249.                              scan2=0;
  250.                              scan1=aa;
  251.                                    time1=0;
  252.                                  shuc();
  253.                         }break;
  254.                           case 0xb7://三角波
  255.                         {
  256.                         time1=0;
  257.                         sjb();
  258.                         }
  259.                         break;
  260.                           case 0x7e:                //加
  261.                         {
  262.                                 time1=0;
  263.                         scan1++;
  264.                         if(scan1==10)
  265.                                 {
  266.                                         scan1=0;
  267.                                     scan2++;
  268.                                         if(scan2==10)
  269.                                         scan2=0;
  270.                                 }
  271.                                 shuc();
  272.                         }break;//c
  273.                      case 0x7d:                //减  
  274.                         {
  275.                                 time1=0;
  276.                               scan1--;                                   
  277.                                 if(scan1==-1)
  278.                                 {                 
  279.                                         scan1=9;
  280.                                         scan2--;
  281.                                         if(scan2==-1)
  282.                                          scan2=9;
  283.                                 }
  284.                                 shuc();
  285.                         }break;
  286.                           case 0x7b:                //自动步进
  287.                     {
  288.                                 time1=0;
  289.             zdbj();
  290.                         }break;//e
  291.                           case 0x77: time1--;break;
  292.                  }
  293.                 ;
  294.                 if(time1>2)
  295.                  switch( key)
  296.                  {      

  297.                           case 0xee:time1--;break;//0 按下相应的键显示相对应的码值
  298.                           case 0xed:time1--;break;//1
  299.                           case 0xeb:time1--;break;//2
  300.                           case 0xe7:time1--;break;//3
  301.                           case 0xde:time1--;break;//4
  302.                           case 0xdd:time1--;break;//5
  303.                           case 0xdb:time1--;break;//6
  304.                           case 0xd7:time1--;break;//7
  305.                           case 0xbe:time1--;break;//8
  306.                           case 0xbd:time1--;break;//9
  307.                           case 0xbb:                //确认               
  308.                         {  
  309.                                 time1=0;
  310.                             scan2=aa;
  311.                                   scan1=bb;
  312.                                   time1=0;
  313.                                 shuc();
  314.                         }break;
  315.                           case 0xb7://三角波
  316.                         {
  317.                         time1=0;
  318.                     sjb();
  319.                         }
  320.                         break;
  321.                           case 0x7e:                //加
  322.                     {
  323.                         scan1++;
  324.                         if(scan1==10)
  325.                                 {
  326.                                          scan1=0;
  327.                                     scan2++;
  328.                                         if(scan2==10)
  329.                                         scan2=0;
  330.                                 }
  331.                                 shuc();
  332.                         }break;//c
  333.                          case 0x7d:                //减
  334.                     {
  335.                             time1=0;
  336.                                 scan1--;                                   
  337.                                 if(scan1==-1)
  338.                                 {         
  339.                                         scan1=9;
  340.                                         scan2--;
  341.                                         if(scan2==-1)
  342.                                         scan2=9;
  343.                                 }
  344.                                 shuc();
  345.                         } break;
  346.                           case 0x7b:                //自动步进
  347.                     {
  348.                                 time1=0;
  349.                     zdbj();
  350.                         }break;//e
  351.                           case 0x77: time1--;break;
  352.             }        
  353.     }                     
  354.         while(1);
  355. }
复制代码

51hei.png

全部资料51hei下载地址(仿真+hex):
数字.zip (1.11 MB, 下载次数: 61)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:831073 发表于 2021-12-29 14:38 | 显示全部楼层
请问一下点如果输出电压的范围想改变到0-40V应该怎么设置
回复

使用道具 举报

ID:1064325 发表于 2023-2-26 15:55 | 显示全部楼层
为什么我按了按键没反应
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表