单片机可预设电压的数控电源程序
基于单片机的数控直流稳压电源

AT89C51的管脚排列如上图所示,9管脚接复位电路,18、19管脚为晶振的两个输入端,20管脚接地,40管脚接+5V。
晶振Y1和两个电容C2、C3构成自激震荡,连接到单片机的X1和X2端,电解电容C4、电阻R5和按键S5构成复位电路,连接到单片机的复位端。当按键S5按下后,复位端通过R5与+5V电源接通,电容迅速放电,使RST管脚为高电平;当复位按键S5弹起后,+5V电源通过R6对电容C4重新充电,RST管脚出现复位正脉冲。
3、显示模块:本来准备使用液晶显示,可是想想我们的层次不够,液晶现实的额程序不会写,只能退而其次,选择使用单片机通过锁存器控制8段LED数码管直接显示,这样可以精确的显示输出电压。
系统结构设计图如上图所示。该系统主要由单片机最小控制系统、显示电路、独立按键、D/A转换电路、放大电路和稳压电路组成。单片机设定预输出值,并可以通过独立键盘改变单片机的预设值。然后通过DAC0832转化为模拟量,再经过运算放大和稳压稳流电路最后输出预设电压值,通过LED显示能够直观的看到预设值。因为器材原因,我们设计的稳压电源采用的是外部稳压器提供的电源。这样虽然算不上是一个完整的数控直流稳压电源,但是,除了这点,我们设计的电源基本已经复合要求。
方案论证:
1、输出模块:使用运算放大器做前级的运算放大器,由于运算放大器具有很大的电源电压抑制比,可以减少输出端的纹波电压。使用LM317做电流稳压器,把电流稳定到0.5A。
2、数控模块:采用AT89C51单片机完成整个数控部分的功能,同时,AT89C51作为一个智能化的可编程器件,便于系统功能的扩展。
如上图所示,本设计中将DAC0832的Iout2接地,采用Iout1输出,然后接运算放大LM358P将输出电流转化为电压。经过LM358P转化后的电压值也为5V。为了达到与单片机预设电压范围2~15V同步,输出端电压需要经过二级放大。第一级不放大,直接将D/A输出的电流转化为电压,第二级放大,放大倍数 =R2/R1=5.5K/1.1K=5。这里的R2由于找不到5.5K的电阻,所以用电位器代替。因为DA0832转换后的电压的范围为0~5V,即DA0832的8位输入端全为高电平1时,输出电压为5V,输入端全为低电平0时,输出电压为0V,且呈线性变化。为此为了使输出与LED显示同步,必须经过放大倍数 =5的二级放大。再经过运放放大后的电压已经复合要求,可是电流却没有复合要求,这就要用到了三段稳压器LM317。在这里,LM317作为电流稳压器,其应用电路如下图所示,其中 ,所以R1的值应该为2.5Ω。可是,我们在实验室能找到的最小电阻是200Ω,这还是远远大于2.5Ω。所以我们的输出电流才6ma。这里还要说的是,本来我们采用的运算放大器是Lm324n,可是,因为我的不小心,在测试运放放大的时候,把芯片烧坏了。并且我们手头没有多余的芯片,幸亏和我们做同一方案的同学有运放Lm358p,所以我们也采用了Lm358p。
基于单片机的数控直流稳压电源设计方案

基于单片机的数控直流稳压电源设计方案一、设计方案简介基于单片机的数控直流稳压电源设计方案主要是通过单片机控制开关电源的开关管,控制输出电压的稳定性和精度。
本设计方案采用闭环控制的方式,通过反馈电路将输出电压反馈给单片机,单片机根据反馈信号控制开关电源的开关管进行开关操作,以实现电源输出电压的稳定。
二、设计方案详细介绍1.系统总体设计:本设计方案将开关电源分为输入电源模块、控制模块和输出电源模块。
输入电源模块主要是对输入电压进行滤波和稳压,以保证输入电源的稳定性;控制模块主要是使用单片机进行控制,接收反馈电路的反馈信号,根据设定值进行比较,并控制开关电源的开关管进行开关操作;输出电源模块主要是将开关电源的输出电压经过滤波和稳压处理,以保证输出电压的稳定性和精度。
2.输入电源模块设计:输入电源模块主要是对输入电压进行滤波和稳压处理,保证输入电源的稳定性和安全性。
常用的电源滤波电路有LC滤波电路、RC滤波电路等。
同时,可以使用稳压芯片来实现输入电压的稳压。
3.控制模块设计:控制模块使用单片机进行控制,主要是通过反馈电路将输出电压反馈给单片机,并经过AD转换后与设定值进行比较。
根据比较结果,单片机控制开关电源的开关管进行开关操作,调整输出电压的稳定性。
在控制过程中,可以设置合适的控制算法,如PID控制算法,以提高控制的精度和稳定性。
4.输出电源模块设计:输出电源模块主要是对开关电源的输出电压进行滤波和稳压处理,以保证输出电压的稳定性和精度。
常用的电源滤波电路有LC滤波电路、RC滤波电路等。
可以使用稳压芯片或者反馈调节电路来实现输出电压的稳压。
5.电源保护设计:为了保护电源和设备的安全性,可以设计过压保护、欠压保护、过流保护、短路保护等保护电路。
过压保护可以使用过压保护芯片,欠压保护可以使用欠压保护芯片,过流保护可以通过电流传感器实现,短路保护可以通过保险丝或者短路保护芯片实现。
三、设计方案的优势和应用1.优势:本设计方案采用闭环控制的方式,通过反馈电路将输出电压反馈给单片机,使得输出电压的稳定性和精度得到保证。
51单片机数控步进直流稳压电源程序

文章导读:本程序为51单片机数控步进直流稳压电源程序,实现数控步进直流稳压电源的功能。
//SPI传送数据子程序void SPILED(data){SSPBUF=data;// 启动发送do {;}while(SSPIF==0);SSPIF=0;}//显示子程序void display(){SPIINIT();//spi方式显示初始化RA5=0;//准备锁存for(COUNTW=0;COUNTW<4;COUNTW++) {data=s[COUNTW];if(COUNTW==1) data=table0[data];//第二位需要显示小数点else data=table[data];SPILED(data);//发送显示段码}for(COUNTW=0;COUNTW<4;COUNTW++){data=0xFF;SPILED(data);//连续发送4个DARK,使显示看起来好看一些}RA5=1;//最后给一个锁存信号,代表显示任务完成}//I2C总线输出数据子程序void i2cout(){i2cint();//因为SPI输出和I2C输出不能同时工作,则需要//不断在两种方式见切换SEN=1;//产生I2C启动信号for(i=0x02;--i;) continue;//给予一定的延时,保证启动do {RSEN=1;//产生I2C启动信号}while(SSPIF==0);//如果没能启动,则反复启动,直到启动为止SSPIF=0;//SSPIF标志清0SSPBUF=0X58;//I2C总线发送地址字节do {;}while(SSPIF==0);//等待地址发送完毕SSPIF=0;//SSPIF标志清0SSPBUF=0X01;//I2C总线发送命令字节do {;}while(SSPIF==0);//等待命令发送完毕SSPIF=0;//SSPIF标志清0SSPBUF=TXDATA;//I2C总线发送数据字节do {;}while(SSPIF==0);//等待数据发送完毕SSPIF=0;//SSPIF标志清0PEN=1;//产生停止条件do {;}while(SSPIF==0);//等待停止条件产生SSPIF=0;//SSPIF标志清0}//步进加子程序void BJADD(){R1++;TXDATA=TXDATA+2;if(R1>9) {R1=0;R2++;if(R2>9) {R2=0;R3++;}}if((R3==1)&&(R2==2)&&(R1==1)){R3=0;R2=0;R1=0;//若R3,R2,R1超过120,则又从0计起TXDATA=0;}sfz();//把需要显示的数字装入显示缓冲数组}//步进减子程序void BJSUB(){R1--;TXDATA=TXDATA-2;if(R1==0XFF) {R1=9;R2--;if(R2==0XFF) {R2=9;R3--;if(R3==0XFF) {R3=1;R2=2;R1=0;//若R3,R2,R1小于0,则又从120计起TXDATA=0XF0;}}}sfz();//把需要显示的数字装入显示缓冲数组}//主程序main(){initial();//系统各寄存器初始化display();//调用一次显示子程序while(1) {i2cout();//调用I2C子程序,启动D/A转换KEYSCAN();//键盘扫描keyserve() ;//若确实有键按下,则调用键服务程序if(BJF==0X01) BJADD();//若步进加标志为1,则调用步进加子程序else BJSUB();//若步进加标志为0,则调用步进减子程序display();//调用一次显示子程序}。
基于单片机的数控电压源课程设计说明

1)8位分辨率;
2)电流型输出,稳定时间为1uS;
3)可双缓冲输入,单缓冲输入或直接数字输入;
4)单一电源供电(+5~+15V);
表1各端口引脚与复用功能表
端口引脚
复用功能
P3.0
TXD(串行输入口)
P3.1
RXD(串行输出口)
P3.2
/INT0(外部中断0)
P3.3
/INT1(外部中断1)
P3.4
T0(记时器0外部输入)
P3.5
T1(记时器1外部输入)
P3.6
/WR(外部数据存储器写选通)
P3.7
/RD(外部数据存储器读选通)
1.1 8051简介
我们采用8051系列的AT89S51作为CPU,AT89S51是一种带4K字节FLASH可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
该口在设计中使用其特殊功能作为D/A,A/D读写信号的控制口。和A/D的中断输入口。
RST:该引脚为复位信号输入端,高电平有效。在振荡器稳定工作情况下,该引脚被置成高电平并持续两个机器周期以上是系统复位。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。该引脚在设计中作为锁存器器和A/D的时钟信号。
1.2 主要特性
1)与MCS-51兼容 ;
2)8位字长的CPU;
3)可在线ISP编程的4KB片FLASH存储器,用于程序存储,可擦写1000次;
单片机制作数控电源

数控电源一、设计要求:我们这次设计的数控电源能够改变电源的大小并通过液晶显示显示出来,按下S1后可以锁定键盘与开启,S2可以打开和关闭电压的输出,S3和S4分别用来调大调小输出电压。
并且我们这次设计的数控电源还有保护功能,当实际输出电流大于设定的保护电流时,电路自动关闭输出高压,并且报警提醒你。
二、设计思路:为了实现我们所要求的功能我们的首先考虑硬件的需要,我们用了液晶显示屏、单片机、按键、晶振、LM324、74LS02、TL431,蜂鸣器、二极管、电容等,然后我们在开始想软件编程,我们首先一开机就让单片机给液晶显示一些数据,让他工作,然后再由单片机控制电压的输出与输入,然后再设计电压电流保护部分,这些完成后在通过按键给单片机发出高低电平,让单片机判断哪个键按下然后在执行哪个键下设定的程序。
三、硬件设计:单片机最小系统:我们的单片机的最小系统有单片机、晶振、电容、复位、组成,我们把晶振的两个管脚接在了单片机的XTAL1、XTAL2上,为了给单片机一个很好的震荡脉冲,我们在晶振的两边分别并了两个电容来滤波,这样能保证单片机有一个很好的工作脉冲,为了使单片机在死机时能够修复,我们给单片机加了个上电复位,我们把按键以电容并联,然后在于电阻串联,他们的一端接高电平,另一端接低电平。
当没按下是RES电位高电平,一旦按下与高电平连接RES立马变成高电平,实现上电复位。
同时为了使单片机的P0口能有大点的驱动能力我们也用排阻接在了P0口,保证了单片机的驱动能力。
(如图1-1)图1-1液晶显示:在液晶显示部分我们是把它接在单片机的P0.1~P0.7口上,并且那里也有上拉电阻,来给单片机提供强大的驱动能力,我们通过单片机执行电压电流那一部分时把它的数据用单片机传给液晶显示器,然后呈现出我们所要的结果,同时为了保证液晶显示器的电压,我们也给它加了外部电压,我们的单片机只是给他高低电平然他显示,我们也把液晶显示器的第三脚与地接起来了,并且在3管脚上加了个电阻,来给第三脚设计一个嵌位电压,保证当有电电流流过时第三脚为高电平(如图所示1-2)。
基于51单片机的数控可调直流稳压电源设计

1概述
稳压 电源是各类 电器必 不可 少的能 源 动力 , 要求有较高 的稳定性和实用性【 1 ] 。 利用 单片机对直流稳压电源进行控制 , 可改善稳 压电源的性 能 , 且使用方便灵活 , 成 本较 低 , 同时通过改进控制系统软件 ,扩展其功能 , 可在不 增加硬件 开销 的壳体 下提高 电源 的 性价 比。本 文利用 5 l 单片机设计数控可调 的直流稳压电源 , 通过系统设计实现数控直 流稳压电源的智 能化 、数字化 和模块化 , 其 中智能 化主要表现 在系统有 可编程模 块能 对 系统进行智能控制 ; 数字化主要表现在系 统 输出 电压通过 L C D液 晶显示 ,并且能通 过 按键 对输 出电压 进行连续 步进数字 化调 节; 模块化主要表现在系统有各个相关模块 组成 , 提高 了系统的可靠性。 2 系统要求与方案选 择
2 . 1 系统 要 求
显 示 电 路 I ・ 堕 D 来自 A 转 . 换 l I l
’ r
按键
茂 机 放大 电路
输 出
电 路
1 r
{ 变 压 器 } _ - ◆ 整 流 滤 波卜 + 。 褪 压 电 路 l
图 1总体设计框图
第二个和第三个加减 1 V, 第 四个确认 输出。4 * 4 本文设 计的数控稳压 电源要求如下 :当输入交 流电压为 2 2 0 v 和十位 电压 的加减 , 的矩阵键 盘 , 可 以设 置 0 — 9和步进 , 小数 点等按键 , 可以快速 的输 时, 输出 电压连续可调 ; 使 用按 键调节电压 , 在0 - 9 . 9 V范 围内可调 , 入 。但是 4 * 4 键盘 占用的 P C B面积较 大 , 增加 了 P C B的成本 , 增加 调 整幅度为 0 . 1 V ; 采用 4 按键方 式 , 第一个 选择个位和十位 电压的 了 P C B的布线 难度 , 并且得 占用 8 个单片机 I / 0口; 采用 4 按 键虽 加减 , 第二 个和第三个加 减 1 v, 第 四个确认输 出 ; 显 示设定 电压 和 不 能直接 输入 0 — 9 , 但 是可 以通过 “ + ” 和“ 一 ” 来实现 0 - 9数 字 的输 测量 电压 , 显示精度为 0 . 1 v, 显 示方式 L C D液 晶显示 ; 利用单 片机 入, 这样只 占用 了 5 个单片机 I / O口, 节约 3 个I / O 口, 同时 P C B的 作为控制芯片 。 面积和成本也进一步缩小 。综上所述 , 本文选择方案二。 2 . 2方案选择 2 . 2 . 4控制 电路芯片的选 择 2 . 2 . 1 D A的选择 本设计 以 5 l 单片机为核心 ,因为它能实现对其他外 部电路实 方 案一 :8位 D A C 0 8 3 2芯片 ;方案二 : l 0位 D A, T L C 5 6 1 5芯 现简单 的控制 , 使其电路相较于使用模拟器件连接更 为简单 。 片 ;方 案 三 :采 用 内 部 自带 基准 源 的 l 2 位D A , M A X 5 3 1 芯片。 3 系统设计思路及原理 D A C 0 8 3 2 芯片其 价格低廉 、 接 口简单 、 转换控制容易 , 早 已在单 片机 3 . 1系统框 图结构的设计 应用系统 中得到广泛 的应用 ; T L C 5 6 1 5芯片为 l 0位 D A,虽然输 出 本设计包括硬件 、 软件两 部分 。硬件设 计主要包括单 片机 最小 精度高 , 但接 口稍复杂 , 同时该 D A芯片价格 昂贵 ; MA X 5 3 1 芯 片内 系统模块 、 变压器 、 稳压 电路 、 放大电路 、 D / A转换 、 显示 电路几个部 部 自带 2 . 0 4 8 V基准源 , 输 出精 度高。综 合考虑成本等因素 , 本文选 分组成 的稳压电源。 软件设计主要包括初始化程序 、 中断程序 、 按键 择D A C 0 8 3 2芯片 , 即方案~。 扫描控制程序。系统 的框 图结构如图 1 所示 。 2 . 2 . 2 显 示 电路 的选 择 3 . 2 系统工作原理 方案一 : 采用 四位共 阳极数码管显示 , 动态扫描显 示方 式 ; 方案 如 图1 所示 , 该稳压 电源 系统最终 要实现电压准确且稳定 的输 二: 采 用液晶显示屏 L C D显示。四位共 阳极数码管成本低廉 , 但显 出。 具体设计思路 : 外接 2 2 0 V的交流电源经过整流滤波后得到稳定 示灵活性及可调性较差 , 硬件驱动 电路复杂 ; 而液 晶显示屏 L C D显 的给上述各 部分单元提供工作 电源 , 其 中整 流电路是利用二极 管的 示 方便 清晰 , 可变性和可调性突 出, 与单 片机硬件 电路 的连 接简单 , 单 向导电性将正 负变化 的交流电压变为单 向脉动电压的电路 。 在交 程序设 计也较为灵 活 , 成为单片机输 出显示 的首选 。随着其成本 的 流 电源 的作用下 , 整流二极 管周 期性地导通和截止 , 使 负载得到脉 不断降低 , 模块化程度不断提高 , 应用领域 E t 益增 多。综上 所述 , 本 动直流电。 在电源的正半周 , 二级管导通 , 使负载上的电流与电压波 文选择 方案二。 形形状完全相 同 ; 在电源 电压 的负半周 , 二极管处于反 向截止状态 , 2 . 2 . 3输入按键 的选择 承受电源负半周 电压 , 负载电压几乎 为零 。然后再利用独立键盘给 方 案一 : 采用 4 * 4键盘 ; 方案二 : 采用 4按键 , 第一个选择 个位 单片机设定 预输 出值 , 并通过 D A C 0 8 3 2芯片转化为模拟量 , 再 经过
基于单片机的数控直流稳压电源设计

基于单片机的数控直流稳压电源设计一、概述随着科技的飞速发展,电子设备在我们的日常生活和工业生产中扮演着越来越重要的角色。
这些设备的稳定运行离不开一个关键的组件——电源。
在各种电源类型中,直流稳压电源因其输出电压稳定、负载调整率好、效率高等优点,被广泛应用于各种电子设备和精密仪器中。
传统的直流稳压电源通常采用模拟电路设计,但这种方法存在着电路复杂、稳定性差、调整困难等问题。
为了解决这些问题,本文提出了一种基于单片机的数控直流稳压电源设计方案。
本设计采用单片机作为控制核心,通过编程实现对电源输出电压的精确控制和调整。
相比于传统的模拟电路设计,基于单片机的数控直流稳压电源具有以下优点:单片机具有强大的计算和处理能力,能够实现复杂的控制算法,从而提高电源的稳定性和精度单片机可以通过软件编程实现各种功能,具有很强的灵活性和可扩展性单片机的使用可以大大简化电路设计,降低成本,提高系统的可靠性。
本文将详细介绍基于单片机的数控直流稳压电源的设计原理、硬件电路和软件程序。
我们将介绍电源的设计原理和基本组成,包括单片机控制模块、电源模块、显示模块等我们将详细介绍硬件电路的设计和实现,包括电源电路、单片机接口电路、显示电路等我们将介绍软件程序的设计和实现,包括主程序、控制算法、显示程序等。
1. 数控直流稳压电源的应用背景与意义随着科技的快速发展,电力电子技术广泛应用于各个行业和领域,直流稳压电源作为其中的关键组成部分,其性能的稳定性和可靠性直接影响着整个系统的运行效果。
传统的直流稳压电源多采用模拟电路实现,其调节精度、稳定性以及智能化程度相对较低,难以满足现代电子设备对电源的高性能要求。
开发一种高性能、智能化的数控直流稳压电源具有重要意义。
数控直流稳压电源通过引入单片机控制技术,实现了对电源输出电压和电流的精确控制。
它可以根据实际需求,通过编程灵活调整输出电压和电流的大小,提高了电源的适应性和灵活性。
同时,数控直流稳压电源还具备过流、过压、过热等多重保护功能,有效提高了电源的安全性和可靠性。
基于单片机的数控直流稳压电源设计与制作

基于单片机的数控直流稳压电源设计与制作数控直流稳压电源是一种能够稳定输出直流电压的电源装置。
它通常由一块单片机控制,并通过反馈回路来实现对输出电压的稳定调节。
本文将介绍基于单片机的数控直流稳压电源的设计和制作过程。
首先,我们需要选择合适的硬件设备。
单片机选择常见的51系列单片机,如STC89C52,因为该系列单片机性能稳定且价格相对较低。
稳压电路中的关键元件包括电源变压器、整流电路、滤波电路、稳压电路和输出电路。
电源变压器用于将市电的交流电转换为所需的直流电级。
整流电路将交流电转换为直流电,滤波电路用于滤除电路中的杂波和纹波。
稳压电路根据单片机反馈信息来调节输出电压,并通过输出电路提供稳定的电压给负载。
接下来,我们需要进行电路设计。
根据所需输出电压和电流,选择合适的电源变压器和稳压集成电路。
通过计算得到电路中各个电阻、电容和二极管的参数,以保证电路的稳定性和可靠性。
在电路设计中,还需要考虑到过流保护、过压保护和温度保护等功能,以确保设备的安全使用。
设计完成后,我们需要进行电路的制作。
根据设计图纸,将电路图转移到电路板上,并通过化学腐蚀或电解腐蚀的方法将电路板制作完成。
然后,将各个元件按照电路图的要求焊接到电路板上。
注意焊接时要保证引脚的正确连接,避免引脚之间的短路和虚焊现象。
接下来,我们需要编写单片机的程序。
程序中需要实现对输入电压和输出电压的采样,通过ADC(模数转换器)将模拟信号转换为数字信号,然后通过PWM(脉冲宽度调制)技术来控制输出电压的调节。
在程序中,还需要实现对电压的稳定调节和保护功能的控制。
需要注意的是,在设计和制作过程中,要遵循电气安全和电磁兼容性的要求,确保设备的正常运行和使用安全。
总结起来,基于单片机的数控直流稳压电源设计与制作涉及到硬件设备的选择、电路的设计、电路的制作、程序的编写和调试测试等方面,需要一定的电子技术和单片机编程知识。
希望本文对读者有所帮助,能够指导大家在实际应用中进行数控直流稳压电源的设计和制作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#ifndef _PWLOCK_H // 防止PWLock.h被重复引用#define _PWLOCK_H#include <reg52.h>#include <absacc.h>#include <stdio.h>#include <math.h>#define uchar unsigned char#define uint unsigned intuchar px;uint a;uint b;uint c; //为0XFFuint i;uchar digbit; // 字位uchar dy;uchar wordbuf[2]; // 字型码缓冲区uchar count; // 位计数uchar pwbuf[2]; // 输入数字存储区bit enterflag; // 确认键按下与否标志bit lh;bit pwflag; // 密码正确与否标志bit showflag; // 数码管显示与否标志sbit P20=P2^0;sbit P21=P2^1;void display(void); // 显示函数#endif//#include "PWLock.h"/* 键消抖延时函数*/void delay(void){uint i;for (i=4000;i>0;i--);}/* 键扫描函数*/uchar keyscan(void){uchar scancode,tmpcode;P1 = 0xf0; // 发全0行扫描码if ((P1&0xf0)!=0xf0) // 若有键按下{delay(); // 延时去抖动if ((P1&0xf0)!=0xf0) // 延时后再判断一次,去除抖动影响{scancode = 0xfe;while((scancode&0x10)!=0) // 逐行扫描{P1 = scancode; // 输出行扫描码if ((P1&0xf0)!=0xf0) // 本行有键按下{tmpcode = (P1&0xf0)|0x0f;/* 返回特征字节码,为1的位即对应于行和列*/return((~scancode)+(~tmpcode));}else scancode = (scancode<<1)|0x01; // 行扫描码左移一位}}}return(0); // 无键按下,返回值为0}/* 定时器0中断服务子程序,2ms定时动态扫描显示*/void time0_int(void) interrupt 1{/* 重置2ms定时*/TH0 = -2000/256;TL0 = -2000%256;px++; //片选if (showflag==1)display(); // 调用显示函数}/* 根据共阴极字型编码表获取0~9,A~B字型代码*/uchar getcode(uchar i){uchar p;switch (i){case 0: p=0x3f; break; /* 0 */case 1: p=0x06; break; /* 1 */case 2: p=0x5B; break; /* 2 */case 3: p=0x4F; break; /* 3 */case 4: p=0x66; break; /* 4 */case 5: p=0x6D; break; /* 5 */case 6: p=0x7D; break; /* 6 */case 7: p=0x07; break; /* 7 */case 8: p=0x7F; break; /* 8 */case 9: p=0x67; break; /* 9 */default: break;}return(p);}void Display(void) //LED数值显示{switch (px%2){case 0:P20 = 1;P21 = 0; P0 = getcode(wordbuf[0]);break; case 1:P21 = 1;P20 = 0; P0 = getcode(wordbuf[1]);break; default: return;}}/* 显示函数*//*void display(void){uchar i;switch (digbit){case 1: i=0; break;case 2: i=1; break;default: break;}P2 = 0x0; // 关闭显示// P20=0;// P21=0;P0 = getcode(wordbuf[i]); // 送字型码P2=digbit; // 送字位码digbit=1;if(digbit==1){digbit=2;P20 = 1;P21 = 0;}digbit=2;P21 = 1;P20 = 0;if (digbit<0x02) // 共2位digbit = digbit*2; // 左移一位elsedigbit = 0x01;}*//* 主程序*/void main(){uchar j,key;uint temp;P20 = 1;P21 = 1; // 关闭数码管显示TMOD = 0x11; // T0,T1工作方式1/* 2ms 定时设置*/TH0 = -2000/256;TL0 = 2000%256;/* 启动计数器0,关闭计数器1 */TR0 = 1;ET0 = 1;TR1 = 0;ET1 = 1;EA = 1;count = 0; // 初始计数器设为0enterflag = 0; // 没有按下确认键lh = 0;pwflag = 0; // 标志先置为0digbit = 0x01; // 从第一位数码管开始动态扫描/* 刚加电时,bu显示*/for (j=0;j<2;j++)wordbuf[j] = 17;showflag = 1; // 打开数码管显while(1){key = keyscan(); // 调用键盘扫描函数switch(key){case 0x11: // 1行1列,数字1 if (count<2){wordbuf[count] = 1; // 对应位上显示“1”pwbuf[count] = 1;if(count==0){a=1;}if(count==1){b=1;}count++;}break;case 0x21: // 1行2列,数字3 if (count<2){wordbuf[count] = 2; // 对应位上显示“2"pwbuf[count] = 2;if(count==0){a=2;}if(count==1){b=2;}count++;}break;case 0x41: // 1行3列,数字3 if (count<2){wordbuf[count] = 3; // 对应位上显示“3"pwbuf[count] = 3;if(count==0){a=3;}if(count==1){b=3;}count++;}break;case 0x12: // 2行1列,数字4 if (count<2){wordbuf[count] = 4; // 对应位上显示“4"pwbuf[count] = 4;if(count==0){a=4;}if(count==1){b=4;}count++;}break;case 0x22: // 2行2列,数字5 if (count<2){wordbuf[count] = 5; // 对应位上显示“5"pwbuf[count] = 5;if(count==0){a=5;}if(count==1){b=5;}count++;}break;case 0x42: // 2行3列,数字6if (count<2){wordbuf[count] = 6; // 对应位上显示“6"pwbuf[count] = 6;if(count==0){a=6;}if(count==1){b=6;}count++;}break;case 0x14: // 3行1列,数字7 if (count<2){wordbuf[count] = 7; // 对应位上显示“7"pwbuf[count] = 7;if(count==0){a=7;}if(count==1){b=7;}count++;}break;case 0x24: // 3行2列,数字8 if (count<2){wordbuf[count] = 8; // 对应位上显示“8"pwbuf[count] = 8;if(count==0){a=8;}if(count==1){b=8;}count++;}break;case 0x44: // 3行3列,数字9 if (count<2){wordbuf[count] = 9; // 对应位上显示“9"pwbuf[count] = 9;if(count==0){a=9;}if(count==1){b=9;}count++;}break;case 0x18: // 4行1列,数字*count = 0;P3=0;px=0; // 显示清零for (j=0;j<2;j++){wordbuf[j] = 17; // 数码管不显示pwbuf[j] = 0; // 用FFFFFF清除已经输入的密码}break;case 0x28: // 4行2列,数字0if (count<2){wordbuf[count] = 0; // 对应位上显示“0"pwbuf[count] = 0;if(count==0){a=0;}if(count==1){b=0;}count++;}break;case 0x48: // 4行3列,数字#enterflag = 1; // 确认键按下if (count==2) // 只有输入2个数后按确认键才有效输出pwflag = 1;break;default:break;}if (enterflag==1) // 如果按下确认键{enterflag = 0; // 标志位置回0count = 0; // 计数器清零c=0xff/6;if (pwflag==1){P3=a*c+b*c/10+12*c/100;temp=a*c+b*c/10+12*c/100;if(temp>=0xff){P3=0xff;}}}}}。