基于单片机的数控开关电源设计_第1页
基于单片机的数控开关电源设计_第2页
基于单片机的数控开关电源设计_第3页
基于单片机的数控开关电源设计_第4页
基于单片机的数控开关电源设计_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

成绩评定表学生姓名张丽班级学号1203060101专业通信工程课程设计题目基于单片机的数控开关电源设计评语组长签字:成绩日期20年月日课程设计任务书学院信息科学与工程专业通信工程学生姓名张丽班级学号1203060101课程设计题目基于单片机的数控开关电源设计实践教学要求与任务:要求:分别对硬件系统的配置予以评估,使其能够对转速进行测量。对单片机定时器/计数器进行配置,设计和说明定时器/计数器在“M〞法测量中的作用和使用方法,讨论测量精度的问题。任务:1、设计电路图。2、利用软件画原理图3、熟悉软件编程语言,编写程序4、系统调试工作方案与进度安排:1.查找资料。〔2天〕2.设计电路,画电路图。〔2天〕3.软件编程与调试。〔2天〕4.系统调试。〔2天〕5.撰写报告。〔2天〕指导教师:201年月日专业负责人:201年月日学院教学副院长:201年月日摘要智能仪器是含有微型计算机或者微型处理器的测量仪器,拥有对数据的存储运算逻辑判断及自动化操作等功能。传感器拾取被测参量的信息并转换成电信号,经滤波去除干扰后送入多路模拟开关;由单片机逐路选通模拟开关将各输入通道的信号逐一送入程控增益放大器,放大后的信号经A/D转换器转换成相应的脉冲信号后送入单片机中;单片机根据仪器所设定的初值进行相应的数据运算和处理(如非线性校正等);运算的结果被转换为相应的数据进行显示和打印;同时单片机把运算结果与存储于片内FlashROM(闪速存储器)或E?2PROM(电可擦除存贮器)内的设定参数进行运算比较后,根据运算结果和控制要求,输出相应的控制信号(如报警装置触发、继电器触点等)。此外,智能仪器还可以与PC机组成分布式测控系统,由单片机作为下位机采集各种测量信号与数据,通过串行通信将信息传输给上位机——PC机,由PC机进行全局管理。关键词:数控开关电源;AMPIRE;AT89C52目录TOC\o"1-3"\h\u175781摘要5207712智能仪器仪表的简介7253211.1智能仪器仪表简介7244422.2智能仪器仪表的作用835353系统设计简介10106643.1PWM波产生简介10268203.2设计要求1176573.3设计方案论证11265593.4硬件设计电路14195464.系统硬件设计1677804.1主控制器选择1656664.2显示电路16238184.3ADC0804A/D转换器与单片机的接口电路17222374.4系统总体电路图20130415设计语言及软件介绍21252125.1C语言介绍21264215.2KEIL软件介绍21171356系统软件设计22179806.1概述22154476.2系统程序设计模块22204016.2.1程序框图2250116.2.2主程序22290086.2.2显示数据刷新子程序30128966.3.2程序清单3674346.4调试及仿真3723918结论3815690参考文献381摘要仪器仪表〔英文:instrumentation〕仪器仪表是用以检出、测量、观察、计算各种物理量、物质成分、物性参数等的器具或设备。真空检漏仪、压力表、测长仪、显微镜、乘法器等均属于仪器仪表。广义来说,仪器仪表也可具有自动控制、报警、信号传递和数据处理等功能,例如用于工业生产过程自动控制中的气动调节仪表,和电动调节仪表,以及集散型仪表控制系统也皆属于仪器仪表。开关电源是一种采用开关方式控制的直流稳压电源。它以小型、高效、轻量的特点被广泛应用于各种电子设备中。开关电源控制局部绝大多数是按模拟信号来设计和工作的,其抗干扰能力不太好,信号有畸变。电源作为各种电子设备必不可少的重要组成局部,其性能优劣直接影响到整个电子系统的性能指标。随着科技的开展,电子设备不断更新换代,其种类越来越多,对电源的性能指标的要求越来越高,加之不同的电子设备对电源的要求又不尽相同,这样,给电源的研究带来了许多新的研究课题。在传统功率电子技术中,DC/DC变换器控制局部是按模拟信号进行设计和工作的。在六、七十年代,功率电子技术完全建立在模拟电路的根底上。但是近年来,随着数字信号处理技术的日益完善、成熟,微处理器/微控制器和数字信号处理器的性价比不断提高,数字控制在功率变换器中得到广泛应用。它使得开关电源向数字化、智能化、多功能化方向开展。这无疑提高了开关电源的性能和可靠性。例如电机、不间断电源〔UPS〕的控制电路都选用各种数字信号处理器或微处理器作为其核心控制部件。功率变换器已由模拟控制、模数混合控制,进入全数字化控制阶段。相对于模拟控制,数字控制有许多优点[1]:〔1〕数字控制可以实现各种复杂的控制策略,提高控制系统的性能。由于开关器件的存在,功率变换器是强非线性系统。传统的模拟控制是在功率变换器近似线性模型的根底上,利用线性系统的各种设计方法来设计补偿网络,这种方法设计简单且容易实现。但随着对电源性能指标的要求不断提高,这种设计方法很难提高系统的控制性能。而数字控制可以实现各种非线性控制策略,使得控制系统的性能大大提高。〔2〕数字控制系统具有很强的抗干扰能力。模拟元器件易受环境和温度的变化影响,所以模拟控制器稳定性差。数字控制器较少受到器件老化、环境或参数变化的影响,比模拟控制器更稳定可靠,具有很强的抗干扰能力。〔3〕数字控制系统灵活性高,数字化极大地简化了变换器控制的硬件。采用数字控制技术可以设计统一的硬件平台,适用不同的变换器系统,只通过软件的改变就可以改变控制策略,无须硬件更改,同时,数字控制系统更容易实现过压、过流保护、输出电压调节、故障监测及通讯等功能,使电源“智能化〞。总之,对功率变换器采用数字控制方法大大提高了变换器的控制性能、灵活性等,变换器的性能主要由软件来决定,而不是在于大量离散元器件的参数,这就意味着本钱和空间的节省以及实现复杂算法的能力。数字控制的这些优点大大提高了功率变换器的综合性能,由模拟控制向数字控制的转变是电力电子功率变换器的一大开展趋势。2智能仪器仪表的简介1.1智能仪器仪表简介功能特点随着微电子技术的不断开展,集成了CPU、存储器、定时器/计数器、并行和串行接口、看门狗、前置放大器甚至A/D、D/A转换器等电路在一块芯片上的超大规模集成电路芯片(即单片机)出现了。以单片机为主体,将计算机技术与测量控制技术结合在一起,又组成了所谓的“智能化测量控制系统〞,也就是智能仪器。与传统仪器仪表相比,智能仪器具有以下功能特点:①操作自动化。仪器的整个测量过程如键盘扫描、量程选择、开关启动闭合、数据的采集、传输与处理以及显示打印等都用单片机或微控制器来控制操作,实现测量过程的全部自动化。②具有自测功能,包括自动调零、自动故障与状态检验、自动校准、自诊断及量程自动转换等。智能仪表能自动检测出故障的部位甚至故障的原因。这种自测试可以在仪器启动时运行,同时也可在仪器工作中运行,极大地方便了仪器的维护。③具有数据处理功能,这是智能仪器的主要优点之一。智能仪器由于采用了单片机或微控制器,使得许多原来用硬件逻辑难以解决或根本无法解决的问题,现在可以用软件非常灵活地加以解决。例如,传统的数字万用表只能测量电阻、交直流电压、电流等,而智能型的数字万用表不仅能进行上述测量,而且还具有对测量结果进行诸如零点平移、取平均值、求极值、统计分析等复杂的数据处理功能,不仅使用户从繁重的数据处理中解放出来,也有效地提高了仪器的测量精度。④具有友好的人机对话能力。智能仪器使用键盘代替传统仪器中的切换开关,操作人员只需通过键盘输入命令,就能实现某种测量功能。与此同时,智能仪器还通过显示屏将仪器的运行情况、工作状态以及对测量数据的处理结果及时告诉操作人员,使仪器的操作更加方便直观。⑤具有可程控操作能力。一般智能仪器都配有GPIB、RS232C、RS485等标准的通信接口,可以很方便地与PC机和其他仪器一起组成用户所需要的多种功能的自动测量系统,来完成更复杂的测试任务。2.2智能仪器仪表的作用微型化微型智能仪器指微电子技术、微机械技术、信息技术等综合应用于仪器的生产中,从而使仪器成为体积小、功能齐全的智能仪器。它能够完成信号的采集、线性化处理、数字信号处理,控制信号的输出、放大、与其他仪器的接口、与人的交互等功能。微型智能仪器随着微电子机械技术的不断开展,其技术不断成熟,价格不断降低,因此其应用领域也将不断扩大。它不但具有传统仪器的功能,而且能在自动化技术、航天、军事、生物技术、医疗领域起到独特的作用。例如,目前要同时测量一个病人的几个不同的参量,并进行某些参量的控制,通常病人的体内要插进几个管子,这增加了病人感染的时机,微型智能仪器能同时测量多参数,而且体积小,可植入人体,使得这些问题得到解决。多功能多功能本身就是智能仪器仪表的一个特点。例如,为了设计速度较快和结构较复杂的数字系统,仪器生产厂家制造了具有脉冲发生器、频率合成器和任意波形发生器等功能的函数发生器。这种多功能的综合型产品不但在性能上〔如准确度〕比专用脉冲发生器和频率合成器高,而且在各种测试功能上提供了较好的解决方案。人工智能化人工智能是计算机应用的一个崭新领域,利用计算机模拟人的智能,用于机器人、医疗诊断、专家系统、推理证明等各方面。智能仪器的进一步开展将含有一定的人工智能,即代替人的一局部脑力劳动,从而在视觉〔图形及色彩辨读〕、听觉〔语音识别及语言领悟〕、思维〔推理、判断、学习与联想〕等方面具有一定的能力。这样,智能仪器可无需人的干预而自主地完成检测或控制功能。显然,人工智能在现代仪器仪表中的应用,使我们不仅可以解决用传统方法很难解决的一类问题,而且可望解决用传统方法根本不能解决的问题。网络化融合ISP和EMIT技术,实现仪器仪表系统的Internet接入。伴随着网络技术的飞速开展,Internet技术正在逐渐向工业控制和智能仪器仪表系统设计领域渗透,实现智能仪器仪表系统基于Internet的通讯能力以及对设计好的智能仪器仪表系统进行远程升级、功能重置和系统维护。在系统编程技术〔In-SystemProgramming,简称ISP技术〕是对软件进行修改、组态或重组的一种最新技术。它是LATTICE半导体公司首先提出的一种使我们在产品设计、制造过程中的每个环节,甚至在产品卖给最终用户以后,具有对其器件、电路板或整个电子系统的逻辑和功能随时进行组态或重组能力的最新技术。ISP技术消除了传统技术的某些限制和连接弊病,有利于在板设计、制造与编程。ISP硬件灵活且易于软件修改,便于设计开发。由于ISP器件可以像任何其他器件一样,在印刷电路板〔PCB〕上处理,因此编程ISP器件不需要专门编程器和较复杂的流程,只要通过PC机,嵌入式系统处理器甚至INTERNET远程网进行编程。EMIT嵌入式微型因特网互联技术是emWare公司创立ETI〔eXtendtheInternet〕扩展Internet联盟时提出的,它是一种将单片机等嵌入式设备接入Internet的技术。利用该技术,能够将8位和16位单片机系统接入Internet,实现基于Internet的远程数据采集、智能控制、上传/下载数据文件等功能。目前美国ConnectOne公司、emWare公司、TASKING公司和国内的P&S公司等均提供基于Internet的Device?Networking的软件、固件〔Firmware〕和硬件产品。虚拟仪器是智能仪器开展的新阶段测量仪器的主要功能都是由数据采集、数据分析和数据显示等三大局部组成的。在虚拟现实系统中,数据分析和显示完全用PC机的软件来完成。因此,只要额外提供一定的数据采集硬件,就可以与PC机组成测量仪器。这种基于PC机的测量仪器称为虚拟仪器。在虚拟仪器中,使用同一个硬件系统,只要应用不同的软件编程,就可得到功能完全不同的测量仪器。可见,软件系统是虚拟仪器的核心,“软件就是仪器〞。传统的智能仪器主要在仪器技术中用了某种计算机技术控制工程网版权所有,而虚拟仪器那么强调在通用的计算机技术中吸收仪器技术。作为虚拟仪器核心的软件系统具有通用性、通俗性、可视性、可扩展性和升级性,能为用户带来极大的利益,因此,具有传统的智能仪器所无法比较的应用前景和市场。3系统设计简介3.1PWM波产生简介PWM信号产生芯片采用KA3525,它是一个典型的性能优良的开关电源控制芯片。其内部包括误差放大器、比较器、振荡器、触发器、输出逻辑控制电路和输出三极管等环节。KA3525的1和2脚是内部运算放大器的输入端,系统中单片机的D/A转换接口的一个引脚与KA3525的2脚连接,实现KA3525的数字控制与步进调整。11和14脚输出交替的两路控制信号,经驱动电路与功率开关管的门极相连接。本文采用的驱动电路如图6所示。当11脚输出高电平、14脚输出低电平时,N1、P2导通,耦合变压器原边电流流向如图6(a)所示。当14脚输出高电平、11脚输出低电平时,N2、P1导通,耦合变压器原边电流流向如图6(b)所示。图7为驱动电路耦合变压器的输出波形。图1图1图2图2表1表1经过计算KA3525的2脚所需要输入的电压并将其转化成单片机所需要的10位数字量,最后SPCE061A单片机将10位数字量左移6位写入P_DAC1单元的高10位,进行D/A转换成相应的3525芯片2脚给定电压,实现对开关电源的步进调整。采样电压经A./D转换后送LCD显示,显示精度可达0.01V。经屡次测试,本电源输出电压可以0V~40V连续调整,歩进值0.1V,最大输出电流可达I0MAX=2.5A,电压调整率Su=0.1%,负载调整率SI=0.2%,效率η=90%,试验结果说明本数控电源方案切实可行。3.2设计要求现今的可调式开关电源通常采用专用芯片,具有开发时间短、可控性强等优点;同时也具有功能受芯片限制等缺点。本文提出的可控式开关电源方案通过软件控制改变数字电位器阻值来改变反激式开关电源反应电压从而改变输出电压的大小,使电源的输出电压范围调整极其方便。本开关电源输出电压可通过按键、USB总线等控制,并且输出电压可断电记忆,控制方式也很容易扩展(如扩展RS232总线控制方式等)。输出电压范围15~30V,最大电流可达5A,最小调节值1V。3.3设计方案论证一.DC-DC主回路拓扑的方案选择DC-DC变换有隔离和非隔离两种。输入输出隔离的方式虽然平安,但是由于隔离变压器的漏磁和损耗等会造成效率的降低,而此题没有要求输入输出隔离,所以选择非隔离方式,具体有以下几种方案:方案一:buck电路形式。开关管V1受占空比为D的PWM波的控制,交替导通或截止,再经L和C滤波器在负载R上得到稳定直流输出电压Uo。只要电感电容选择合理,能到达题目要求的3-9.9V,且输出电压Uo呈现连续平滑的特性。〔见图3〕方案二:boost电路形式。并联开关电路原理与串联开关电路类似,但此电路为升压型电路,开关导通时电感储能,截止时电感能量输出。该电路属于升压型电路,达不到题目要求的3-9.9V的输出电压。〔见图4〕?方案三:串并联开关电路形式。实际上此电路是在串联开关电路后接入一个并联开关电路〔BUCK结合BOOST实现既可以升压又可以降压〕。用电感的储能特性来实现升降压,电路控制复杂。〔见图5〕以上三种方案属开关电源。采用纯开关电源〔AC-DC变换器〕。开关稳压电路控制功率晶体管或MOS-FET工作在开关状态,截止时无电流,导通时饱和压降很小,所以管耗也很低,大大提高了电源的效率,其效率可达70%~95%。但其纹波电压较高,控制电路复杂,制作难度高、周期长。方案四:使用纯线性稳压电源。这种电源的输出以线性调整晶体管为根底,利用晶体管的电流放大作用增大负载电流,在电路中引入深度电压负反应,是输出电压稳定。通过改变反应网络设定参数使输出电压可调,在次根底上引入电流设定和电流反应电路既可实现稳流功能。该方案结构简单、技术成熟、调节方便,但调整管集电极始终消耗功率。特别是在负载电流较大且输出电压较低时,调整管自身的功耗很大、效率很低,既浪费能源,又使调整管产生很高的温度。总之,线性电源调整管工作在放大状态,发热量较大,效率低〔35%左右〕,需要加体积庞大的散热片。此题只需要降压,考虑到效率问题,采用开关buck稳压电路,同时为了减小纹波可引入线性稳压方法,即采用开关型稳压电路和线性稳压电路相结合的方法。直流电源的前级采用降压式开关电源〔DC—DC变换器〕,提高其工作效率,后级采用线性稳压电路以减小纹波电流、提高电路的稳定性,而且便于控制。这样还可以减少设计制作难度。最终确定电路:图73.4硬件设计电路硬件电路由主控单片机、数控开关电路、控制电路、显示电路组成。其中主控单片机使用AT89c51,转换电路使用ADC0809,显示电路使用LCD液晶屏,其中包括一些简单震荡电路等,根本模电电路。如图8图84.系统硬件设计4.1主控制器选择由于经常学习并解除AT89C52单片机,对其有一定了解。因此,主控器选择AT89C52单片机。AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器〔RAM〕,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。4.2显示电路图9显示电路显示电路基于AMPIRE128*64显示器。液晶显示器件〔LCD〕独具的低压、微功耗特性他在单片机系统中特得到了广泛的应用,常用的液晶显示模块分为数显液晶模块、点阵字符液晶模块和点阵图形液晶模块,其中图形液晶模块在我国应用较为广泛,因为汉字不能像西文字符那样用字符模块即可显示,要想显示汉字必须用图形模块。本课设所选择的LCD是AMPIRE128×64的汉字图形型液晶显示模块,可显示汉字及图形,图形液晶显示显示器接如图8所示。4.3ADC0804A/D转换器与单片机的接口电路ADC0804引脚图如下:图10ADC0804引脚图图10ADC0804引脚图引脚功能及应用特性如下:

CS、RD、WR〔引脚1、2、3〕:是数字控制输入端,满足标准TTL逻辑电

平。其中CS和WR用来控制A/D转换的启动信号。CS、RD用来读A/D转换的结

果,当它们同时为低电平时,输出数据锁存器DB0~DB7各端上出现8位并行二进制数

码。

CLKI〔引脚4〕和CLKR〔引脚19〕:ADC0801~0805片内有时钟电路,只要在外

部“CLKI〞和“CLKR〞两端外接一对电阻电容即可产生A/D转换所要求的时钟,其振荡频率为fCLK≈1/1.1RC。其典型应用参数为:R=10KΩ,C=150PF,fCLK≈640KHZ,

转换速度为100μs。假设采用外部时钟,那么外部fCLK可从CLKI端送入,此时不接R、C。

允许的时钟频率范围为100KHZ~1460KHZ。

INTR〔引脚5〕:INTR是转换结束信号输出端,输出跳转为低电平表示本次

转换已经完成,可作为微处理器的中断或查询信号。如果将CS和WR端与INTR端

相连,那么ADC0804就处于自动循环转换状态。CS=0时,允许进行A/D转换。WR由低跳高时A/D转换开始,8位逐次比较

需8×8=64个时钟周期,再加上控制逻辑操作,一次转换需要66~73个时钟周期。

在典型应用fCLK=640KHZ时,转换时间约为103μs~114μs。当fCLK超过640KHZ,转

换精度下降,超过极限值1460KHZ时便不能正常工作。

VIN

〔+〕〔引脚〕和VIN

〔-〕〔引脚7〕:被转换的电压信号从VIN

〔+〕和VIN

〔-〕输

入,允许此信号是差动的或不共地的电压信号。如果输入电压VIN的变化范围从0V

到Vmax,那么芯片的VIN

〔-〕端接地,输入电压加到VIN

〔+〕引脚。由于该芯片允许差动

输入,在共模输入电压允许的情况下,输入电压范围可以从非零伏开始,即Vmin至

Vmas。此时芯片的VIN

〔-〕端应该接入等于Vmin的恒值电码坟上,而输入电压VIN仍然加到VIN

〔+〕引脚上。

AGND〔引脚8〕和DGND〔引脚10〕:A/D转换器一般都有这两个引脚。模拟地

AGND和数字地DGND分别设置引入端,使数字电路的地电流不影响模拟信号回路,

以防止寄生耦合造成的干扰。

VREF/2〔引脚9〕:参考电压VREF/2可以由外部电路供应,从“VREF/2〞端直接送

入,VREF/2端电压值应是输入电压范围的二分之一。所以输入电压的范围可以通过

调整VREF/2引脚处的电压加以改变,转换器的零点无需调整。ADC0804转换器的工作时序如图10所示。图11AD转换器的设计接口电路图:图12A/D转换电路图12A/D转换电路图中,ADC0804数据输出线与AT89C51的数据总线直接相连,AT89C51的RD、

WR和INT1直接连到ADC0804,由于用P1.0线来产生片选信号,故无需外加

地址译码器。当AT89C51向ADC0804发WR(启动转换)、RD(读取结果)信号时,

只要虚拟一个系统不占用的数据存储器地址即可。4.4系统总体电路图图13完整图5设计语言及软件介绍5.1C语言介绍C语言是1972年由美国的DennisRitchie设计创造的,并首次在UNIX操作系统的DECPDP-11计算机上使用。它由早期的编程语言BCPL(BasicCombinedProgrammingLanguage)开展演变而来,在1970年,AT&T贝尔实验室的KenThompson根据BCPL语言设计出较先进的并取名为B的语言,最后导致了C语言的问世。而B语言之前还有A语言,取名自世界上第一位女程序员Ada〔艾达〕。5.2KEIL软件介绍KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境〔uVision〕将这些局部组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。6系统软件设计6.1概述开关电源主要由开关管、反应误差放大器,PMW产生一,可以用单片机产生PWM波控制开关管的工作状态,而开关管的开关频率即单片机的PWM频率来产生不同的输出电压,将输出电压反应并进行误差放大后再输给单片机,单片机AD采样,根据电压大小相应改变输出PWM频率与占空比,从而改变开关管开关频率产生对应电压,实现对输出电压的实施监控与跟踪。单片机的PWM主要可通过其定时器实现,设置相关定时器便可产生一定频率与一定占空比的方波信号。6.2系统程序设计模块6.2.1程序框图6.2.2主程序//*************************************************************************************************//* *//* ******************************头文件及宏定义************************** *//* *//*************************************************************************************************#include<reg52.h>#include"includes.h"#defineucharunsignedchar#defineuintunsignedint#defineSCANPORTP2 #defineTIME1H80#defineTIME1L80 //定时器1溢出时间//sbitwr=P3^1;sbitrd=P3^0;sbitP27=P2^7;unsignedlongintshuchu=500;//默认的开机电压//uintzhuhuandata;unsignedlongintch=0;uchari=0;//按键标记//ucharuca_LineScan[3]={0xEF,0xDF,0xBF};voidchuli();//函数定义//uchargetkey();//函数定义////*************************************************************************************************//* *//* ********************************将键值累加并送显示****************************** *//* *//*************************************************************************************************voidqiuhe(uchart){if(i==1){ch=t;vShowOneChar(6,89,uca[t]);}if(i==2){ch=ch*10+t;vShowOneChar(6,103,uca[t]);}if(i==3){ch=ch*10+t;vShowOneChar(6,111,uca[t]);}}//*************************************************************************************************//* *//* ********************************按键功能函数****************************** *//* *//*************************************************************************************************voidkey_chuli(ucharx){uchart;switch(x) { case42:t=0; i++;qiuhe(t); if(i==3) { vShowOneChin(2,49,uca_que); vShowOneChin(2,64,uca_ding); vShowOneChin(4,59,uca_wenhao);} break; //'0' case31:t=1; i++;qiuhe(t); if(i==3) { vShowOneChin(2,49,uca_que); vShowOneChin(2,64,uca_ding); vShowOneChin(4,59,uca_wenhao);} break; //'1' case32:t=2; i++;qiuhe(t); if(i==3) { vShowOneChin(2,49,uca_que); vShowOneChin(2,64,uca_ding); vShowOneChin(4,59,uca_wenhao);} break; //'2' case33:t=3; i++;qiuhe(t); if(i==3) { vShowOneChin(2,49,uca_que); vShowOneChin(2,64,uca_ding); vShowOneChin(4,59,uca_wenhao);} break; //'3' case21:t=4; i++;qiuhe(t); if(i==3) { vShowOneChin(2,49,uca_que); vShowOneChin(2,64,uca_ding); vShowOneChin(4,59,uca_wenhao);} break; //'4' case22:t=5; i++;qiuhe(t); if(i==3) { vShowOneChin(2,49,uca_que); vShowOneChin(2,64,uca_ding); vShowOneChin(4,59,uca_wenhao);} break; //'5' case23:t=6; i++;qiuhe(t); if(i==3) { vShowOneChin(2,49,uca_que); vShowOneChin(2,64,uca_ding); vShowOneChin(4,59,uca_wenhao);} break; //'6' case11:t=7; i++;qiuhe(t); if(i==3) { vShowOneChin(2,49,uca_que); vShowOneChin(2,64,uca_ding); vShowOneChin(4,59,uca_wenhao);} break; //'7' case12:t=8; i++;qiuhe(t); if(i==3) { vShowOneChin(2,49,uca_que); vShowOneChin(2,64,uca_ding); vShowOneChin(4,59,uca_wenhao);} break; //'8' case13:t=9; i++;qiuhe(t); if(i==3) { vShowOneChin(2,49,uca_que); vShowOneChin(2,64,uca_ding); vShowOneChin(4,59,uca_wenhao);} break; //'9' case41:if(i==3)//'ok' { ch=ch*256/512; shuchu=ch;ch=0;TH0=65200; TL0=65200; vShowOneChin(2,49,uca_0); vShowOneChin(2,64,uca_0); vShowOneChin(4,48,uca_SHU); vShowOneChin(4,64,uca_CHU); vShowOneChar(6,88,uca_HEN); vShowOneChar(6,104,uca_HEN); vShowOneChar(6,112,uca_HEN); } i=0; break; } }voidvTimer0(void)interrupt1using2{uchara,d; unsignedlongintc=0; uchardatatab[3]; a=(((zhuhuandata&0xf0)>>4)*100/16);d=((zhuhuandata&0x0f)*100/256);c=(a+d)*5.12;tab[0]=c%10;tab[1]=c/10%10;tab[2]=c/100%10; vShowOneChar(2,89,uca[tab[2]]); vShowOneChar(2,103,uca[tab[1]]); vShowOneChar(2,111,uca[tab[0]]);TH0=TIME1H; TL0=TIME1L;}voidmain(void){SCANPORT=0x8F; ClearLCD(0x00); vShowOneChar(2,89,uca[5]); vShowOneChar(2,96,uca_XIAOSHU); vShowOneChar(2,103,uca[0]); vShowOneChar(2,111,uca[0]); vShowOneChar(2,120,uca_V);vShowOneChin(0,0,uca_DANG); vShowOneChin(0,16,uca_QIAN); vShowOneChin(0,32,uca_GONG); vShowOneChin(0,48,uca_ZUO); vShowOneChin(0,64,uca_DIAN); vShowOneChin(0,80,uca_YA); vShowOneChin(0,96,uca_MAOHAO); vShowOneChin(4,0,uca_QING); vShowOneChin(4,16,uca_SHE); vShowOneChin(4,32,uca_ZHI); vShowOneChin(4,48,uca_SHU); vShowOneChin(4,64,uca_CHU); vShowOneChin(4,80,uca_DIAN); vShowOneChin(4,96,uca_YA); vShowOneChin(4,112,uca_MAOHAO); vShowOneChar(6,96,uca_XIAOSHU); vShowOneChar(6,88,uca_HEN); vShowOneChar(6,104,uca_HEN); vShowOneChar(6,113,uca_HEN); vShowOneChar(6,119,uca_V);//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<外部中断0,用于开启键盘扫描及键码处理标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> TMOD=0X01;TH0=TIME1H; TL0=TIME1L; ET0=1; //T/C0开中断 TR0=1; //开定时器0中断 IT0=1; //外中断方式:下降沿。 EX0=1; //开启外部中断。EA=1;//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<外部中断0,用于开启键盘扫描及键码处理标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>while(1){wr=0;wr=1;chuli(); if(zhuhuandata<=shuchu)P27=0; if(zhuhuandata>shuchu)P27=1;if(zhuhuandata<=shuchu)P27=0;}}voidchuli(){rd=0;zhuhuandata=P0;}//*************************************************************************************************//* *//* ********************************函数实现****************************** *//* *//*************************************************************************************************unsignedchargetkey(){ucharucTemp=0; //扫描状态暂存。 ucharucRow=0,ucLine=0; //行号,列号。 for(ucLine=0;ucLine<3;ucLine++) //列扫描 { SCANPORT=uca_LineScan[ucLine]; //输出扫描电位。 ucTemp=SCANPORT&0x8F; //输入扫描电位,并屏蔽高4位。 if(ucTemp!=0x8F) { //判断该列是否有按键按下。 switch(ucTemp) { case0x8E:ucRow=10;break; //如果有,那么判断行号。 case0x8D:ucRow=20;break; case0x8B:ucRow=30;break; case0x87:ucRow=40;break; default:P2=~P2;break; } break; } }//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢复键扫描处理前初始状态>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> SCANPORT=0x8F; //恢复P2口return(ucRow+ucLine+1);//返回按键编码。格式为2位数,高位为行号,低位为列号。}//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢复键扫描处理前初始状态>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>voidvINT0(void)interrupt0{EX0=0;key_chuli(getkey());while((SCANPORT&0x8F)!=0x8f)//等待按键松开//{};EX0=1;}6.2.2显示数据刷新子程序//*************************************************************************************************//* *//* ******************************LCD12864驱动程序************************** *//* *//*************************************************************************************************//*************************************************************************************************//* *//* ******************************头文件及宏定义************************** *//* *//*************************************************************************************************#include<reg52.h>#define LCDPORTP1sbit E=P3^7;sbit RW=P3^6;sbit DI=P3^5;sbit CS1=P3^3;sbit CS2=P3^4;sbitBUSYSTATUS=P1^7; //忙状态位。//#defineDISONSTATUSP0_5 //显示开关状态位。//#defineRSTSTATUSP0_4 //复位状态位。#defineLCDSTARTROW0xC0 //设置起始行指令。#defineLCDPAGE0xB8 //设置页指令。#defineLCDLINE0x40 //设置列指令。//*************************************************************************************************//* *//* ********************************读忙标志位********************************* *//* *//*************************************************************************************************bitbCheckBusy(){ LCDPORT=0x00; RW=1; DI=0; E=1; E=0; returnBUSYSTATUS;}//*************************************************************************************************//* *//* ********************************写数据********************************* *//* *//*************************************************************************************************voidvWriteData(unsignedcharucData){ while(bCheckBusy()); LCDPORT=0x00; RW=0; DI=1; LCDPORT=ucData; E=1; E=0;}//*************************************************************************************************//* *//* ********************************写指令********************************* *//* *//*************************************************************************************************voidvWriteCMD(unsignedcharucCMD){ while(bCheckBusy()); LCDPORT=0x00;RW=0; DI=0; LCDPORT=ucCMD; E=1; E=0;}//*************************************************************************************************//* *//* ********************************LCD初始化函数******************************* *//* *//*************************************************************************************************/*voidvLCDInitialize(){ CS1=1; CS2=1; vWriteCMD(0x38); //8位形式,两行字符。 vWriteCMD(0x0F); //开显示。 vWriteCMD(0x01); //清屏。 vWriteCMD(0x06); //画面不动,光标右移。 vWriteCMD(LCDSTARTROW); //设置起始行。}*///*************************************************************************************************//* *//* ******************************显示自定义行********************************* *//* *//*************************************************************************************************//在8×128的格子里显示自定义长度的一行voidvShowCustomRow(unsignedcharucPage,unsignedcharucLine,unsignedcharucWidth,unsignedchar*ucaRow){ unsignedcharucCount; //取值范围:ucPage:0~7;ucLine:0~127; if(ucLine<64) //ucWidth:0~127;ucLine+ucWidth<1128。 { CS1=1; CS2=0; vWriteCMD(LCDPAGE+ucPage); vWriteCMD(LCDLINE+ucLine); if((ucLine+ucWidth)<64) { for(ucCount=0;ucCount<ucWidth;ucCount++) vWriteData(*(ucaRow+ucCount)); } else { for(ucCount=0;ucCount<64-ucLine;ucCount++) vWriteData(*(ucaRow+ucCount)); CS1=0; CS2=1; vWriteCMD(LCDPAGE+ucPage); vWriteCMD(LCDLINE); for(ucCount=64-ucLine;ucCount<ucWidth;ucCount++) vWriteData(*(ucaRow+ucCount)); } } else { CS1=0;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论