液压伺服系统设计 液压伺服系统设计 在液压伺服系统中采用液压伺服阀作为输入信号的转换与放大元件。液压伺服系统能以小功率的电信号输入,控制大功率的液压能(流量与压力)输出,并能获得很高的控制精度和很快的响应速度。位置控制、速度控制、力控制三类液压伺服系统一般的设计步骤如下: 1)明确设计要求:充分了解设计任务提出的工艺、结构及时系统各项性能的要求,并应详细分析负载条件。 2)拟定控制方案,画出系统原理图。 3)静态计算:确定动力元件参数,选择反馈元件及其它电气元件。 4)动态计算:确定系统的传递函数,绘制开环波德图,分析稳定性,计算动态性能指标。 5)校核精度和性能指标,选择校正方式和设计校正元件。 6)选择液压能源及相应的附属元件。 7)完成执行元件及液压能源施工设计。 本章的内容主要是依照上述设计步骤,进一步说明液压伺服系统的设计原则和介绍具体设计计算方法。由于位置控制系统是最基本和应用最广的系统,所以介绍将以阀控液压缸位置系统为主。 全面理解设计要求 全面了解被控对象 液压伺服控制系统是被控对象—主机的一个组成部分,它必须满足主机在工艺上和结构上对其提出的要求。例如轧钢机液压压下位置控制系统,除了应能够承受最大轧制负载,满足轧钢机轧辊辊缝调节最大行程,调节速度和控制精度等要求外,执行机构—压下液压缸在外形尺寸上还受轧钢机牌坊窗口尺寸的约束,结构上还必须保证满足更换轧辊方便等要求。要设计一个好的控制系统,必须充分重视这些问题的解决。所以设计师应全面了解被控对象的工况,并综合运用电气、机械、液压、工艺等方面的理论知识,使设计的控制系统满足被控对象的各项要求。 明角设计系统的性能要求 1)被控对象的物理量:位置、速度或是力。 2)静态极限:最大行程、最大速度、最大力或力矩、最大功率。 3)要求的控制精度:由给定信号、负载力、干扰信号、伺服阀及电控系统零飘、非线性环节(如摩擦力、死区等)以及传感器引起的系统误差,定位精度,分辨率以及允许的飘移量等。 4)动态特性:相对稳定性可用相位裕量和增益裕量、谐振峰值和超调量等来规定,响应的快速性可用载止频率或阶跃响应的上升时间和调整时间来规定; 5)工作环境:主机的工作温度、工作介质的冷却、振动与冲击、电气的噪声干扰以及相应的耐高温、防水防腐蚀、防振等要求; 6)特殊要求;设备重量、安全保护、工作的可靠性以及其它工艺要求。 负载特性分析 正确确定系统的外负载是设计控制系统的一个基本问题。它直接影响系统的组成和动力元件参数的选择,所以分析负载特性应尽量反映客观实际。液压伺服系统的负载类型有惯性负载、弹性负载、粘性负载、各种摩擦负载(如静摩擦、动摩擦等)以及重力和其它不随时间、位置等参数变化的恒值负载等。 拟定控制方案、绘制系统原理图 在全面了解设计要求之后,可根据不同的控制对象,按表6所列的基本类型选定控制方案并拟定控制系统的方块图。如对直线位置控制系统一般采用阀控液压缸的方案,方块图如图36所示。图36 阀控液压缸位置控制系统方块图表6 液压伺服系统控制方式的基本类型伺服系统 控制信号 控制参数 运动类型 元件组成机液电液气液电气液 模拟量数字量位移量 位置、速度、加速度、力、力矩、压力 直线运动摆动运动旋转运动 1.阀控制:阀-液压缸,阀-液压马达2.容积控制:变量泵-液压缸;变量泵-液压马达;阀-液压缸-变量泵-液压马达3.其它:步近式力矩马达 动力元件参数选择 动力元件是伺服系统的关键元件。它的一个主要作用是在整个工作循环中使负载按要求的速度运动。其次,它的主要性能参数能满足整个系统所要求的动态特性。此外,动力元件参数的选择还必须考虑与负载参数的最佳匹配,以保证系统的功耗最小,效率高。 动力元件的主要参数包括系统的供油压力、液压缸的有效面积(或液压马达排量)、伺服阀的流量。当选定液压马达作执行元件时,还应包括齿轮的传动比。 供油压力的选择 选用较高的供油压力,在相同输出功率条件下,可减小执行元件——液压缸的活塞面积(或液压马达的排量),因而泵和动力元件尺寸小重量轻,设备结构紧凑,同时油腔的容积减小,容积弹性模数增大,有利于提高系统的响应速度。但是随供油压力增加,由于受材料强度的限制,液压元件的尺寸和重量也有增加的趋势,元件的加工精度也要求提高,系统的造价也随之提高。同时,高压时,泄漏大,发热高,系统功率损失增加,噪声加大,元件寿命降低,维护也较困难。所以条件允许时,通常还是选用较低的供油压力。 常用的供油压力等级为7MPa到28MPa,可根据系统的要求和结构限制条件选择适当的供油压力。 伺服阀流量与执行元件尺寸的确定 如上所述,动力元件参数选择除应满足拖动负载和系统性能两方面的要求外,还应考虑与负载的最佳匹配。下面着重介绍与负载最佳匹配问题。 (1)动力元件的输出特性 将伺服阀的流量——压力曲线经坐标变换绘于υ-FL平面上,所得的抛物线即为动力元件稳态时的输出特性,见图37。 图37 参数变化对动力机构输出特性的影响a)供油压力变化;b)伺服阀容量变化;c)液压缸面积变化 图中 FL——负载力,FL=pLA; pL——伺服阀工作压力; A——液压缸有效面积; υ——液压缸活塞速度, ; qL——伺服阀的流量; q0——伺服阀的空载流量; ps——供油压力。 由图37可见,当伺服阀规格和液压缸面积不变,提高供油压力,曲线向外扩展,最大功率提高,最大功率点右移,如图37a。 当供油压力和液压缸面积不变,加大伺服阀规格,曲线变高,曲线的顶点A ps不变,最大功率提高,最大功率点不变,如图37b。 当供油压力和伺服阀规格不变,加大液压缸面积A,曲线变低,顶点右移,最大功率不变,最大功率点右移,如图37c。 (2)负载最佳匹配图解法 在负载轨迹曲线υ-FL平面上,画出动力元件输出特性曲线,调整参数,使动力元件输出特性曲线从外侧完全包围负载轨迹曲线,即可保证动力元件能够拖动负载。在图38中,曲线1、2、3代表三条动力元件的输出特性曲线。曲线2与负载轨迹最大功率点c相切,符合负载最佳匹配条件,而曲线1、3上的工作点α和b,虽能拖动负载,但效率都较低。 (3)负载最佳匹配的解析法 参见液压动力元件的负载匹配。 (4)近似计算法在工程设计中,设计动力元件时常采用近似计算法,即按最大负载力FLmax选择动力元件。在动力元件输出特性曲线上,限定 FLmax≤pLA= ,并认为负载力、最大速度和最大加速度是同时出现的,这样液压缸的有效面积可按下式计算: (37) 图38 动力元件与负载匹配图形 按式37求得A值后,可计算负载流量qL,即可根据阀的压降从伺服阀样本上选择合适的伺服阀。近似计算法应用简便,然而是偏于保守的计算方法。采用这种方法可以保证系统的性能,但传递效率稍低。 (5)按液压固有频率选择动力元件 对功率和负载很小的液压伺服系统来说,功率损耗不是主要问题,可以根据系统要求的液压固有频率来确定动力元件。 四边滑阀控制的液压缸,其活塞的有效面积为 (38) 二边滑阀控制的液压缸,其活塞的有效面积为 (39) 液压固有频率ωh可以按系统要求频宽的(5~10)倍来确定。对一些干扰力大,负载轨迹形状比较复杂的系统,不能按上述的几种方法计算动力元件,只能通过作图法来确定动力元件。 计算阀控液压马达组合的动力元件时,只要将上述计算方法中液压缸的有效面积A换成液压马达的排量D,负载力FL换成负载力矩TL,负载速度换成液压马达的角速度 ,就可以得到相应的计算公式。当系统采用了减速机构时,应注意把负载惯量、负载力、负载的位移、速度、加速度等参数都转换到液压马达的轴上才能作为计算的参数。减速机构传动比选择的原则是:在满足液压固有频率的要求下,传动比最小,这就是最佳传动比。 伺服阀的选择 根据所确定的供油压力ps和由负载流量qL(即要求伺服阀输出的流量)计算得到的伺服阀空载流量q0,即可由伺服阀样本确定伺服阀的规格。因为伺服阀输出流量是限制系统频宽的一个重要因素,所以伺服阀流量应留有余量。通常可取15%左右的负载流量作为伺服阀的流量储备。 除了流量参数外,在选择伺服阀时,还应考虑以下因素: 1)伺服阀的流量增益线性好。在位置控制系统中,一般选用零开口的流量阀,因为这类阀具有较高的压力增益,可使动力元件有较大的刚度,并可提高系统的快速性与控制精度。 2)伺服阀的频宽应满足系统频宽的要求。一般伺服阀的频宽应大于系统频宽的5倍,以减小伺服阀对系统响应特性的影响。 3)伺服阀的零点漂移、温度漂移和不灵敏区应尽量小,保证由此引起的系统误差不超出设计要求。 4)其它要求,如对零位泄漏、抗污染能力、电功率、寿命和价格等,都有一定要求。 执行元件的选择 液压伺服系统的执行元件是整个控制系统的关键部件,直接影响系统性能的好坏。执行元件的选择与设计,除了按本节所述的方法确定液压缸有效面积A(或液压马达排量D)的最佳值外,还涉及密封、强度、摩擦阻力、安装结构等问题。 反馈传感器的选择 根据所检测的物理量,反馈传感器可分为位移传感器、速度传感器、加速度传感器和力(或压力)传感器。它们分别用于不同类型的液压伺服系统,作为系统的反馈元件。闭环控制系统的控制精度主要决定于系统的给定元件和反馈元件的精度,因此合理选择反馈传感器十分重要。 传感器的频宽一般应选择为控制系统频宽的5~10倍,这是为了给系统提供被测量的瞬时真值,减少相位滞后。传感器的频宽对一般系统都能满足要求,因此传感器的传递函数可近似按比例环节来考虑。 确定系统方块图 根据系统原理图及系统各环节的传递函数,即可构成系统的方块图。根据系统的方块图可直接写出系统开环传递函数。阀控液压缸和阀控液压马达控制系统二者的传递函数具有相同的结构形式,只要把相应的符号变换一下即可。 绘制系统开环波德图并确定开环增益 系统的动态计算与分析在这里是采用频率法。首先根据系统的传递函数,求出波德图。在绘制波德图时,需要确定系统的开环增益K。 改变系统的开环增益K时,开环波德图上幅频曲线只升高或降低一个常数,曲线的形状不变,其相频曲线也不变。波德图上幅频曲线的低频段、穿越频率以及幅值增益裕量分别反映了闭环系统的稳态精度、截止频率及系统的稳定性。所以可根据闭环系统所要求的稳态精度、频宽以及相对稳定性,在开环波德图上调整幅频曲线位置的高低,来获得与闭环系统要求相适应的K值。 由系统的稳态精度要求确定K 由控制原理可知,不同类型控制系统的稳态精度决定于系统的开环增益。因此,可以由系统对稳态精度的要求和系统的类型计算得到系统应具有的开环增益K。 由系统的频宽要求确定K 分析二阶或三阶系统特性与波德图的关系知道,当ζh和K/ωh都很小时,可近似认为系统的频宽等于开环对数幅值曲线的穿越频率,即ω-3dB≈ωc,所以可绘制对数幅频曲线,使ωc在数值上等于系统要求的ω-3dB值,如图39所示。由此图可得K值。 图39 由ω-3dB绘制开环对数幅频特性a)0型系统;b)I型系统 由系统相对稳定性确定K 系统相对稳定性可用幅值裕量和相位裕量来表示。根据系统要求的幅值裕量和相位裕量来绘制开环波德图,同样也可以得到K。见图40。 实际上通过作图来确定系统的开环增益K,往往要综合考虑,尽可能同时满足系统的几项主要性能指标。 系统静动态品质分析及确定校正特性 在确定了系统传递函数的各项参数后,可通过闭环波德图或时域响应过渡过程曲线或参数计算对系统的各项静动态指标和误差进行校核。如设计的系统性能不满足要求,则应调整参数,重复上述计算或采用校正环节对系统进行补偿,改变系统的开环频率特性,直到满足系统的要求。 仿真分析 在系统的传递函数初步确定后,可以通过计算机对该系统进行数字仿真,以求得最佳设计。目前有关于数字仿真的商用软件,如Matlab软件,很适合仿真分析。
进我空间有答案,这东西嘛,很义贼。
天下没有免费的午餐
我给你一个题目,如果你写出来了,我保你论文得优秀。因为当年我就是选这个题目得的优秀。刚才我在网上搜了一下,网上还是没有与这个系统相关的论文。 《高考最低录取分数线查询系统》基本思想很简单,现在的高考分数线查询是很繁琐的,需要先把分数查出来,然后根据录取指南再找你的分数能被录取的学校,高考过的都知道,高考报考指南是一本多么厚的书。所以,这个系统的思想就是:你用所有高校近十年的录取分数线建立一个数据库,然后开发一个系统,当你输入查询命令的时候(查询命令可以用1,2,3这三个数来代替,用flog实现;输入1,查询的是符合你所输入的分数以下的所有高校信息;输入2,查询的是符合你所输入分数段之间的所有高校信息;输入3,查询大于你所给的分数线的高校信息。)当然,你可以再加上一些附加的功能。大致思想就这些。 郑州今迈网络部竭诚为你解答,希望我的答案能帮到你!
我这里有两篇。加我QQ1255324803
摘 要:由于普通LED点阵显示屏动态显示通常采用硬件扫描驱动,这在一些需要特殊显示的场合显得不够灵活。文中提出了一种利用PC机和单片机的通讯来实现显示屏灵活的动态显示和远程监控的设计方法,同时该方法还可以将显示内容在PC机上进行预览。 关键词:LED;动态显示;远程控制;显示预览 1引言 LED 点阵电子显示屏是集微电子技术、计算机技术、信息处理技术于一体的大型显示屏系统。它以其色彩鲜艳,动态范围广,亮度高,寿命长,工作稳定可靠等优点而成为众多显示媒体以及户外作业显示的理想选择。同时也可广泛应用到军事、车站、宾馆、体育、新闻、金融、证券、广告以及交通运输等许多行业。 目前大多数的LED点阵显示系统自带字库。其显示和动态效果(主要是显示内容的滚动)的实现主要依靠硬件扫描驱动,该方法虽然比较方便,但显示只能按照预先的设计进行。而实际上经常会遇到一些特殊要求的动态显示,比如电梯运行中指示箭头的上下移动、某些智能仪表幅值的条形显示、广告中厂家的商标显示等。这时一般的显示系统就很难达到要求。另外,由于受到存储器本身的局限,其特殊字符或图案也往往难以显示,同时显示内容也不能随意更改。本文提出一种利用PC机和单片机控制的LED显示系统通讯方法。该方法可以对显示内容(包括汉字和特殊图符)进行实时控制,从而实现诸如闪动、滚动、打字等多种动态显示效果。该方法同时还可以调节动态显示的速度,同时用户也可以在PC机上进行显示效果的预览,显示内容亦可以即时修改。另外,通过标准的RS232/485 转换模块还可以实现对显示系统的远程控制。2系统硬件设计 本 系统主要的硬件设计是下位机单片机的显示 控制部分。而上位机(PC机)与单片机显示控制部分的接口为标准RS232通讯方式。若需实现远程监控,只需增加RS232/485转换模块即可,该部分已有成熟的电路设计,故不再详细叙述。 具体的LED显示屏控制电路如图1所示。整个电路由单片机89C52、点阵数据存储器6264、列驱动电路ULN2803、行驱动电路TIP122、移位寄存器4094及附属电路组成。该电路所设计的电子屏可显示10个汉字,需要40个8×8 LED点阵模块,可组成16×160的矩形点阵。由于AT89C52仅有8k存储空间,而显示的内容由PC机控制,因此不可能预先把需要显示的内容做成点阵存在单片机中,而只能由PC机即时地把所需显示的点阵数据传给单片机并存入缓冲区6264。 该电路的显示采用逐行扫描方式。工作时,由单片机从缓冲区取出第一行需要显示的20字节点阵数据,再由列点阵数据输入端P1.2口按位依次串行输入至列移位寄存器,其数据输入的顺序与显示内容的顺序相反。然后置行点阵选通端P1.3为1,即置行移位寄存器的D为高电平,STR使能(所有4094的OE 引脚接+5V电平),从而使列移位寄存器中的数据同时并行输出以选通该行。经延时一段时间后再进行下一行点阵数据的显示。需要注意的是,每次只能选通一行数据,即要通过不断的逐行扫描来实现汉字或字符的显示。3显示与控制的设计 在笔者设计的PC机控制多单片机显示系统中,用PC机实现的主要功能包括单片机显示子系统的选择,显示方式选择(包括静态、闪动、滚动、打字等),滚动方向选择(包括上下滚动和左右滚动),动态显示速度调节(即文字闪动频率、滚动速度、打字显示速度等),显示内容输入及显示预览等。单片机一般通过 RS232/485串行接收PC机发出的显示指采用定时器中断方式进行行扫描,每次中断显示一行,定时中断时间为1.25ms,这样整屏的刷新率为 50Hz,因而无闪烁感。实现动态显示速度调节的方法通常是改变定时器的中断时间,但是当显示速度很慢的时候,该方法容易使整屏的刷新率降低,从而使显示内容出现闪烁。因此,本设计采用一种“软定时”方法,即在程序中命名一变量作为“软定时器”,以用来设定两次动态显示的时间间隔。在对定时中断调用计数时,如果调用次数达到设定值,则改变显示内容。为保证能够正常显示,“软定时器”的设定值必须大于整屏显示周期。由于显示屏每行显示1.25ms,整屏显示周期为20ms,考虑到余量的情况,可将软定时器的设定值定在大于30ms。如此循环计数,即可实现动态显示。“软定时器”的设定值可以通过上位机PC机来改变,这样既可实现 LED动态显示的速度调节,又可保持显示内容的流畅和无闪烁感。3.1单片机动态显示控制 以上提到的静态、闪动、滚动和打字等4种显示方式,实际上是单片机定时中断程序进行行扫描处理的不同方法。下面将分别说明如何实现这4种显示方式。 静态显示只需在定时中断处理程序中从显示缓冲区调入相应的一行显示数据,然后选中该行即可实现该行的显示,如此循环,便可显示整个内容。闪动显示与此类似,不同的是要间隔一个“软定时器”的定时时间,在行扫描时,行移位寄存器的D端打入的全为0,可使得整屏不显示,以确保黑屏时间与显示时间相等,从而实现汉字或图符的闪动显示。 滚动显示要求需要显示的内容每隔一定时间向指定方向(这里以从右向左为例)移动一列,这样显示屏可以显示更多的内容。为此,需要在下次移动显示之前对显示缓冲区的内容进行更改,从而完成相应点阵数据的移位操作。具体操作方法是: 设置一个显示缓冲区(如图2所示),该区应包括两部分:一部分用来保存当前LED显示屏上显示的10个汉字点阵数据;另一部分为点阵数据预装载区,用来保存即将进入LED显示屏的1个汉字的点阵数据。滚动指针始终指向显示屏的最右边原点。当滚动指针移动到需要显示的点阵数据存储区的第1个汉字的首地址时,显示缓冲区LED显示区为空白,而预装载区已保存了第1个待显示汉字的点阵数据。当需要滚动显示时,则可在接下来的扫描周期的每个行扫描中断处理程序中,将对显示缓冲区的相应行点阵数据左移一位,同时更改显示缓冲区的内容。(需要注意的是,要确保该操作能在1.25ms的中断时间内完成。这里89C52采用22MHz晶振,实验证明可以实现该操作)。这样,在一个扫描周期后,整个汉字将左移一列,而显示缓冲区的内容也同时更改。由于预装载区保存了1个汉字点阵数据,即16×16点阵,所以当前显示缓冲区的内容只能移动16列。当下一个滚动到来时,滚动指针将移动到点阵数据存储区的下一个汉字的首地址,并在预装载区存入该汉字的点阵数据。然后重复执行上述操作便可实现滚动显示。特殊字符或图形的显示与此类似,这里不再赘述。打字显示要求汉字在显示屏上按从左到右的顺序一个个的出现,如同打字的效果。设计时可采用如下方法:首先将LED显示屏对应的显示缓冲区全部清零,即 LED显示空白,然后每间隔一个“软定时器”设定的动态显示时间,显示缓冲区依次加入一个汉字点阵数据并进行扫描显示,这样就可达到打字显示的效果。3.2 PC机控制程序 a.通讯功能的实现 在Windows环境下,实现PC与单片机的通讯可利用Windows的通讯API函数或者利用VC++(或其它语言)的标准通讯函数_inp、_outp来实现。但上述两种方法比较繁琐,而采用ActiveX控件MSComm32来实现则非常方便。该控件用事件的方式简化了对串口操作的编程,并可设置串行通信的数据发送和接收,还可对串口状态及串口通信的信息格式和协议进行设置。其初始化程序如下: 一般情况下,PC要与多个单片机89C51系统进行主从式通讯,为了区分各单片机系统,可以使89C51采用串口工作方式3,即11位异步接收/发送方式,该方式的有效数据为9位,其中第9位为地址/数据信息的标志位,其作用是使从机据此判断发送的数据是否为地址,从而实现多机操作。但现在由于采用的是MSCOMM控件来实现PC机和单片机之间的通讯,这是一种标准的10位串口通信方式,即8位标准数据位和该数据的起始位、停止位各1位。因此二者格式不相符,故很难利用上述方案。因此可考虑将单片机串口设为工作方式1,即改为10位异步接收/发送方式来解决,其通讯流程如下: 首先发通信开始标志,接着发送需要操作的单片机系统地址,然后发送显示工作命令字,该命令包括2个字节,前一字节用于设定显示方式和滚动方向,后一字节则用于设定显示速度。再往下是传送显示内容的点阵数据,最后对数据进行校验。该通讯规约非常简便,能够较好的解决上述问题,从而实现PC机与多单片机之间的主从式通讯及对显示的控制。 需要注意的是,当显示内容需要改变时,为了避免在单片机串行中断接收数据时,显示屏出现乱码,应使显示屏暂不显示(处于“黑屏”状态),直到数据接收完全,串行中断处理结束时再显示。 汉字字模的提取非常关键,本文的字模数据取自UCDOS下的字库文件HZK16。关于这方面的介绍较多,文献〔2〕给出了较为具体的在VC下提取汉字字模的方案,这里不再赘述。对于特殊字符或图形点阵数据的提取,简便的方法可以先做一个BMP文件,然后用一些取模软件(如字模提取v2.1)来获得。为了显示方便,点阵数据的格式应为n×(16×8),不足要求的则应以0数据补充。 b.动态效果模拟显示 为了方便调节LED的显示效果,笔者在PC机的控制界面上设计了LED显示屏的模拟显示,它同实际的显示效果完全一样。用户可以设定显示的模式,并调节显示速度,然后在界面上对显示效果进行预览,同时还可以随时修改和设定参数,因而十分方便简捷。 为此,可先在界面上描绘出虚拟的LED显示屏,由于实际的显示屏为160×16点阵,故须在界面 上设定相同的区域。 实现动态显示效果的方法和以上几种基本类似,这里以滚动显示为例作一说明。对于需要滚动的文字,可以将其设置为位图格式,暂存于内存中,然后利用VC 提供的位图拷贝函数BitBlt将位图复制到显示位置。对于特殊字符或图形,则可以直接利用BitBlt函数调用到显示位置。然后在类CLEDDlg的 OnTimer函数中调用该函数,以实现文字的滚动显示。另外,也可以通过设定不同的响应时间间隔来改变文字的滚动速度。汉字显示屏广泛应用与汽车报站器,广告屏等。本文介绍一种实用的汉字显示屏的制作,考虑到电路元件的易购性,没有使用8*8的点阵发光管模块, 而是直接使用了256个高量度发光管,组成了16行16列的发光点阵。同时为了降低制作难度, 仅作了一个字的轮流显示,实际使用时可根据这个原理自行扩充显示的字数。1汉字显示的原理:我们以UCDOS中文宋体字库为例,每一个字由16行16列的点阵组成显示。即国标汉字库中的每一个字均由256点阵来表示。我们可以把每一个点理解为一个像素,而把每一个字的字形理解为一幅图像。事实上这个汉字屏不仅可以显示汉字, 也可以显示在256像素 范围内的任何图形。用8位的AT89C51单片机控制, 由于单片机的总线为8位,一个字需要拆分为2个部分。软件打开后输入汉字,点“检取”,十六进制数据的汉字代码即可自动生成,把我们所需要的竖排数据复制到我们的程序中即可。 我们把行列总线接在单片机的i0口,然后把上面分析到的扫描代码送入总线, 就可以得到显示的汉字了。 在这个例子里,由于一共用到16行,16列, 如果将其全部接入89c51单片机, 一共使用32条io口,这样造成了io资源的耗尽,系统也再无扩充的余地。 实际应用中我们使用4-16线译码器74ls154来完成列方向的显示。 而行方向16条线则接在p0口和p2口。程序清单:ORG 00HLOOP: MOV A,#0FFH ;开机初始化,清除画面MOV P0,A ;清除P0口 ANL P2,#00 ;清除P2口MOV R2,#200 D100MS: MOV R3,#250 ;延时100毫秒 DJNZ R3,$ DJNZ R2,D100MS MOV 20H,#00H ;取码指针的初值l100: MOV R1,#100 ;每个字的停留时间L16: MOV R6,#16 ;每个字16个码 MOV R4,#00H ;扫描指针清零 MOV R0,20H ;取码指针存入R0L3: MOV A,R4 ;扫描指针存入A MOV P1,A ;扫描输出 INC R4 ;扫描指针加1,扫描下一个 MOV A,R0 ; 取码指针存入A MOV DPTR,#TABLE ;取数据表的上半部分的代码 MOVC A,@A+DPTR MOV P0,A ; 输出到P0 INC R0 ;取码指针加1,取下一个码。 MOV A,R0 MOV DPTR,#TABLE ;取数据表下半部份的代码 MOVC A,@A+DPTR MOV P2,A ;输出到P2口 INC R0MOV R3,#02 ;扫描1毫秒DELAY2: MOV R5,#248 ; DJNZ R5,$ DJNZ R3,DELAY2 MOV A,#00H ;清除屏幕 MOV P0,A ANL P2,#00H DJNZ R6,L3 ;一个字16个码是否完成? DJNZ R1,L16 ;每个字的停留时间是否到了? MOV 20H,R0 ;取码指针存入20H CJNE R0,#0FFH,L100 ;8个字256个码是否完成? JMP LOOP ;反复循环 TABLE :;汉字“倚”的代码db 01H,00H,02H,00H,04H,00H,1FH,0FFHdb 0E2H,00H,22H,00H,22H,0FCH,26H,88Hdb 2AH,88H,0F2H,88H,2AH,0FAH,26H,01Hdb 63H,0FEH,26H,00H,02H,00H,00H,00H;以下分别输入天,一,出, 宝,刀,屠,龙,的代码,略。end 电路中行方向由p0口和p2口完成扫描,由于p0口没有上拉电阻,因此接一个*8的排阻上拉。 如没有排阻,也可用8个普通的 1/8w电阻。为提供负载能力,接16个2n5551的NPN三极管驱动。列方向则由4—16译码器74LS154完成扫描,它由89C51的控制。同样,驱动部分则是16个2N5401的三极管完成的。电路的供电为一片LM7805三端稳压器,耗电电流为100Ma左右。采用一块12*20cm的万能电路板,应当选用质量好些的发光管,(否则有坏点现象, 更换起来较麻烦)首先将256个发光管插入电路板,注意插入方向,同时使高度一致,行方向直接焊接起来, 列方向则搭桥架空焊接,完成后用万用表测试一下如有不亮的更换掉。 然后找一个电脑硬盘的数据线, 截取所需的长度,分别将行,列线引出至电路的相关管脚即可。原理图为了简洁,故只画出了示意图,行列方向只画出了2个三极管,屏幕只画出4个发光管, 实际上发光管为256只,三极管行列方向各16只,一共32只。焊接过程认真仔细一天时间即可完成全部制作。将程序编译后烧写入89c51, 插入40pin Ic座,即可看到屏幕轮流显示:“倚天一出宝刀屠龙”。 当然,你可将程序的汉字代码部分更换为您所需要的代码即可显示你所需要的汉字元件清单:名称 数量 规格4.7k 1/8w 32 电阻*8排阻 1 2n5551 16 小功率NPN三极管2n5401 16 小功率PNP三极管led 256 3mm白发红高亮度22P 2 瓷片电容10uf/50v 1 电解电容100uf/25v 2 电解电容AT89C51 1 或AT89S5140pin Ic座 1 插89c51用12M 1 晶体74LS154 1 或74HC154LM7805 1 稳压IC电源插座 1 稳压电源 1
有必要上这儿来吗,去图书馆的数据库,这样类型的文章多得不得了啊
正好我刚做好了,过两天也要交了,论文,仿真,还有PPt,不是一个学校的话可以发给你QQ1255324803
电子信息工程毕业论文题目参考
论文写作,简单的说,就是大专院校毕业论文的写作,包含着本科生的学士论文,研究生的硕士论文,博士生的博士论文,延伸到了职称论文的写作以及科技论文的写作。论文的题目是论文的关键,有画龙点睛之效。下面是我为大家整理的电子信息工程毕业论文题目,大家不妨多加参考。
1.基于单片机的火灾报警器设计
2.基于NE555的触摸式报警器
3.数字密码锁设计
4.基于单片机智能电子时钟设计及应用
5.流水灯控制电路设计
6.简易单片机控制电路实验开发板
7.全自动洗衣机自动控制电路部分设计
8.基于单片机的八路抢答器的设计及PCB板的设计
9.基于单片机的数字温度计的设计
10.仓库温湿度的监测系统
11.直流稳压电源的制作
12.步进电机的单片机控制系统
13.单片机交通灯管理系统
单片机交通灯控制系统制作
15.基于单片机的步进电机系统设计
16.基于WML的学生网站开发
17.基于单片机的电子密码锁
18.单片机驱动步进电机控制系统的设计
19.基于单片机的流水灯设计
显示屏动态显示及其远程控制
21.基于DSP的高速多通道同步数据采集系统
22.篮球竞赛30S计时器
位数字抢答器
24.一种实用型心率计的设计
25.温度测控系统的设计
26.药品生产线上的药丸控制电路设计
27.基于选修课程的网站设计
28.基于单片机的交通灯设计
29.单片机控制的数字触发器
30.温度测控系统
31.基于单片机的数字时钟设计
32.篮球30秒定时器
33.电子万年历
34.基于单片机的智能节水控制器设计
35.嵌入式通用I/O键盘应用设计
36.数码显示的八路抢答器设计
37.基于PLC的四路抢答器设计
38.基于单片机的数字电子钟的`设计
39.超外差中波调幅收音机的组装及调试
40.基于单片机的无线电数字发射系统设计
41.基于80C51的智能汽车自控系统的设计
实现十字路交通灯自动控制
43.智能型充电器的电源和显示设计
44.基于单片机的电子时钟设计及应用
45.基于单片机的智能电子时钟的设计及应用
46.超外差中波调幅收音机组装及调试
47.基于USB接口的步进电机控制的研究与实现
48.基于单片机的电子琴设计
49.基于FPGA的直序扩频通信研究与设计
50.基于单片机的发射机控制系统
51.声光报警器的设计与研究
52.单片机电源
53.基于P87LPC768的电机控制系统
54.基于单片机的LCD电子钟设计
55.音响放大器的设计
56.超外差收音机制作及分析研究
频带传输系统的设计与实现
58.基于单片机智能电子钟的设计
与串行接口转换器的设计
60.基于FPGA的数字频率计的设计
1.卷积编码和维特比译码的FPGA实现
音频编译码算法研究与FPGA实现
调制解调技术研究及FPGA仿真实现
4.基于FPGA的高斯白噪声发生器设计与实现
5.无线通信系统选择分集技术研究
系统空时分组编码的性能研究
7.基于量子烟花算法的认知无线电频谱分配技术研究
8.基于量子混沌神经网络的鲁棒多用户检测器
9.无线紫外光多址通信关键技术研究
10.认知无线电网络的频谱分配算法
11.基于软件无线电的多制式通信信号产生器设计与实现
12.开关电源EMI滤波器的设计
13.反激式电源传导噪声模态分离技术的研究
14.核电磁脉冲源辐射的数值仿真
15.基于MATLAB的扩频通信系统及同步性能仿真
16.一种多频带缝隙天线的设计
调制解调器及同步性能的仿真分析
18.跳频频率合成器的设计
系统子载波间干扰性能分析
20.复合序列扩频通信系统同步方法的研究
21.基于DDS+PLL的频率源设计
22.基于训练序列的OFDM系统同步技术的研究
23.正交频分复用通信系统设计及性能研究
技术研究及其性能比较
25.基于蓝牙的单片机无线通信研究
26.物联网智能温室控制系统中远程信息无线传输的研究
27.船载AIS通信系统调制器的设计与实现
28.基于FPGA的16QAM调制器设计与实现
29.基于多载波通信的信道化技术研究
30.简易无线通信信号分析与测量装置
一 课题任务:以FPGA适配板为核心,设计并制作一款数字万年历。此数字万年历以“日”为基本计时单位,用8只数码管适时显示“年、月、日”。此万年历具有区分大小月、调整日期、生日提醒等功能。 二 课题研究现状及发展趋势:在当代繁忙的工作与生活中,时间与我们每一个人都有非常密切的关系,每个人都受到时间的影响。为了更好的利用我们自己的时间,我们必须对时间有一个度量,因此产生了钟表。钟表的发展是非常迅速的,从刚开始的机械式钟表到现在普遍用到的数字式钟表,即使现在钟表千奇百怪,但是它们都只是完成一种功能——计时功能,只是工作原理不同而已,在人们的使用过程中,逐渐发现了钟表的功能太单一,没有更大程度上的满足人们的需求。因此在这里,我想能不能把一些辅助功能加入钟表中。在此设计中所设计的钟表不但具有普通钟表的功能,它还能实现额外的功能:世界时、农历显示。人类不断研究,不断创新纪录。发展到现在人们广泛使用的万年历。万年历是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,但是所有这些,都是以钟表数字化为基础的。因此,研究万年历及扩大其应用,有着非常现实的意义。它可以对年、月、日、周日、时、分、秒进行计时,对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒等信息,还具有时间校准等功能。综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。三 设计方案:1.工作原理...................有做好的设计可以给你参阅的!!!!!!
可以联系我的,有作好的防真,去我的百度空间看看。然后联系我,空间有我的联系方式
#include<>#include""#define uint unsigned int#define uchar unsigned charuchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;//flag用于读取头文件中的温度值,和显示温度值#define yh 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)#define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)//液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)sbit rs=P1^0;sbit en=P1^2;sbit rw=P1^1; //如果硬件上rw接地,就不用写这句和后面的rw=0了sbit led=P3^7; //LCD背光开关//DS1302时钟芯片与C51之间的引脚连接定义sbit IO=P2^2;sbit SCLK=P2^1;sbit RST=P2^2;sbit ACC0=ACC^0;sbit ACC7=ACC^7;/************************************************************ACC累加器= 就是ACC的第0位。Acc可以位寻址。累加器ACC是一个8位的存储单元,是用来放数据的。但是,这个存储单元有其特殊的地位,是单片机中一个非常关键的单元,很多运算都要通过ACC来进行。以后在学习指令时,常用A来表示累加器。但有一些地方例外,比如在PUSH指令中,就必须用ACC这样的名字。一般的说法,A代表了累加器中的内容、而ACC代表的是累加器的地址。 ***************************************************************///校时按键与C51的引脚连接定义sbit key1=P2^4; //设置键sbit key2=P2^5; //加键sbit key3=P2^6; //减键sbit buzzer=P2^0;//蜂鸣器,通过三极管9012驱动,端口低电平响/**************************************************************/uchar code tab1[]={"20 - - "}; //年显示的固定字符uchar code tab2[]={" : : "};//时间显示的固定字符//延时函数,后面经常调用void delay(uint xms)//延时函数,有参函数{ uint x,y; for(x=xms;x>0;x--) for(y=120;y>0;y--);}/********液晶写入指令函数与写入数据函数,以后可调用**************//*在这个程序中,液晶写入有关函数会在DS1302的函数中调用,所以液晶程序要放在前面*/write_1602com(uchar com)//****液晶写入指令函数****{ rs=0;//数据/指令选择置为指令 rw=0; //读写选择置为写 P0=com;//送入数据 delay(1); en=1;//拉高使能端,为制造有效的下降沿做准备 delay(1); en=0;//en由高变低,产生下降沿,液晶执行命令}write_1602dat(uchar dat)//***液晶写入数据函数****{ rs=1;//数据/指令选择置为数据 rw=0; //读写选择置为写 P0=dat;//送入数据 delay(1); en=1; //en置高电平,为制造下降沿做准备 delay(1); en=0; //en由高变低,产生下降沿,液晶执行命令}lcd_init()//***液晶初始化函数****{ write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据 write_1602com(0x0c);//开显示不显示光标 write_1602com(0x06);//整屏不移动,光标自动右移 write_1602com(0x01);//清显示 write_1602com(yh+1);//日历显示固定符号从第一行第1个位置之后开始显示 for(a=0;a<14;a++) { write_1602dat(tab1[a]);//向液晶屏写日历显示的固定符号部分 //delay(3); } write_1602com(er+2);//时间显示固定符号写入位置,从第2个位置后开始显示 for(a=0;a<8;a++) { write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号 //delay(3); }}/*********************over***********************//***************DS1302有关子函数********************/void write_byte(uchar dat)//写一个字节{ ACC=dat; RST=1; for(a=8;a>0;a--) { IO=ACC0; SCLK=0; SCLK=1; ACC=ACC>>1; }}uchar read_byte()//读一个字节{ RST=1; for(a=8;a>0;a--) { ACC7=IO; SCLK=1; SCLK=0; ACC=ACC>>1; } return (ACC);}//----------------------------------------void write_1302(uchar add,uchar dat)//向1302芯片写函数,指定写入地址,数据{ RST=0; SCLK=0; RST=1; write_byte(add); write_byte(dat); SCLK=1; RST=0;}uchar read_1302(uchar add)//从1302读数据函数,指定读取数据来源地址{ uchar temp; RST=0; SCLK=0; RST=1; write_byte(add); temp=read_byte(); SCLK=1; RST=0; return(temp);}uchar BCD_Decimal(uchar bcd)//BCD码转十进制函数,输入BCD,返回十进制{ uchar Decimal; Decimal=bcd>>4; return(Decimal=Decimal*10+(bcd&=0x0F));}//--------------------------------------void ds1302_init() //1302芯片初始化子函数(2010-01-07,12:00:00,week4){RST=0;SCLK=0;write_1302(0x8e,0x00); //允许写,禁止写保护 write_1302(0x80,0x00); //向DS1302内写秒寄存器80H写入初始秒数据00write_1302(0x82,0x00);//向DS1302内写分寄存器82H写入初始分数据00write_1302(0x84,0x12);//向DS1302内写小时寄存器84H写入初始小时数据12write_1302(0x8a,0x04);//向DS1302内写周寄存器8aH写入初始周数据4write_1302(0x86,0x07);//向DS1302内写日期寄存器86H写入初始日期数据07write_1302(0x88,0x01);//向DS1302内写月份寄存器88H写入初始月份数据01write_1302(0x8c,0x10);//向DS1302内写年份寄存器8cH写入初始年份数据10write_1302(0x8e,0x80); //打开写保护}//------------------------------------//温度显示子函数void write_temp(uchar add,uchar dat)//向LCD写温度数据,并指定显示位置{ uchar gw,sw; gw=dat%10;//取得个位数字 sw=dat/10;//取得十位数字 write_1602com(er+add);//er是头文件规定的值0x80+0x40 write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码 write_1602dat(0xdf);//显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码 write_1602dat(0x43); //显示"C"符号,0x43是液晶屏字符库里大写C的地址码 }//------------------------------------//时分秒显示子函数void write_sfm(uchar add,uchar dat)//向LCD写时分秒,有显示位置加、现示数据,两个参数{ uchar gw,sw; gw=dat%10;//取得个位数字 sw=dat/10;//取得十位数字 write_1602com(er+add);//er是头文件规定的值0x80+0x40 write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码 }//-------------------------------------//年月日显示子函数void write_nyr(uchar add,uchar dat)//向LCD写年月日,有显示位置加数、显示数据,两个参数{ uchar gw,sw; gw=dat%10;//取得个位数字 sw=dat/10;//取得十位数字 write_1602com(yh+add);//设定显示位置为第一个位置+add write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码 }//-------------------------------------------void write_week(uchar week)//写星期函数{ write_1602com(yh+0x0c);//星期字符的显示位置 switch(week) { case 1:write_1602dat('M');//星期数为1时,显示 write_1602dat('O'); write_1602dat('N'); break; case 2:write_1602dat('T');//星期数据为2时显示 write_1602dat('U'); write_1602dat('E'); break; case 3:write_1602dat('W');//星期数据为3时显示 write_1602dat('E'); write_1602dat('D'); break; case 4:write_1602dat('T');//星期数据为4是显示 write_1602dat('H'); write_1602dat('U'); break; case 5:write_1602dat('F');//星期数据为5时显示 write_1602dat('R'); write_1602dat('I'); break; case 6:write_1602dat('S');//星期数据为6时显示 write_1602dat('T'); write_1602dat('A'); break; case 7:write_1602dat('S');//星期数据为7时显示 write_1602dat('U'); write_1602dat('N'); break;}}//****************键盘扫描有关函数**********************void keyscan(){ if(key1==0)//---------------key1为功能键(设置键)-------------------- { delay(9);//延时,用于消抖动 if(key1==0)//延时后再次确认按键按下 { buzzer=0;//蜂鸣器短响一次 delay(20); buzzer=1; while(!key1); key1n++; if(key1n==9) key1n=1;//设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环 switch(key1n) { case 1: TR0=0;//关闭定时器 //TR1=0; write_1602com(er+0x09);//设置按键按动一次,秒位置显示光标 write_1602com(0x0f);//设置光标为闪烁 temp=(miao)/10*16+(miao)%10;//秒数据写入DS1302 write_1302(0x8e,0x00); write_1302(0x80,0x80|temp);//miao write_1302(0x8e,0x80); break; case 2: write_1602com(er+6);//按2次fen位置显示光标 //write_1602com(0x0f); break; case 3: write_1602com(er+3);//按动3次,shi //write_1602com(0x0f); break; case 4: write_1602com(yh+0x0e);//按动4次,week //write_1602com(0x0f); break; case 5: write_1602com(yh+0x0a);//按动5次,ri //write_1602com(0x0f); break; case 6: write_1602com(yh+0x07);//按动6次,yue //write_1602com(0x0f); break; case 7: write_1602com(yh+0x04);//按动7次,nian //write_1602com(0x0f); break; case 8: write_1602com(0x0c);//按动到第8次,设置光标不闪烁 TR0=1;//打开定时器 temp=(miao)/10*16+(miao)%10; write_1302(0x8e,0x00); write_1302(0x80,0x00|temp);//miao数据写入DS1302 write_1302(0x8e,0x80); break; }} }//------------------------------加键key2---------------------------- if(key1n!=0)//当key1按下以下。再按以下键才有效(按键次数不等于零) { if(key2==0) //上调键 { delay(10); if(key2==0) { buzzer=0;//蜂鸣器短响一次 delay(20); buzzer=1; while(!key2); switch(key1n) { case 1:miao++;//设置键按动1次,调秒 if(miao==60) miao=0;//秒超过59,再加1,就归零 write_sfm(0x08,miao);//令LCD在正确位置显示"加"设定好的秒数 temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00); //允许写,禁止写保护 write_1302(0x80,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码 write_1302(0x8e,0x80); //打开写保护 write_1602com(er+0x09);//因为设置液晶的模式是写入数据后,光标自动右移,所以要指定返回 //write_1602com(0x0b); break; case 2:fen++; if(fen==60) fen=0; write_sfm(0x05,fen);//令LCD在正确位置显示"加"设定好的分数据 temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x82,temp);//向DS1302内写分寄存器82H写入调整后的分数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置 break; case 3:shi++; if(shi==24) shi=0; write_sfm(2,shi);//令LCD在正确的位置显示"加"设定好的小时数据 temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x84,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(er+3);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; case 4:week++; if(week==8) week=1; write_1602com(yh+0x0C);//指定'加'后的周数据显示位置 write_week(week);//指定周数据显示内容 temp=(week)/10*16+(week)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x8a,temp);//向DS1302内写周寄存器8aH写入调整后的周数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+0x0e);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; case 5:ri++; if(ri==32) ri=1; write_nyr(9,ri);//令LCD在正确的位置显示"加"设定好的日期数据 temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x86,temp);//向DS1302内写日期寄存器86H写入调整后的日期数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; case 6:yue++; if(yue==13) yue=1; write_nyr(6,yue);//令LCD在正确的位置显示"加"设定好的月份数据 temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x88,temp);//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+7);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; case 7:nian++; if(nian==100) nian=0; write_nyr(3,nian);//令LCD在正确的位置显示"加"设定好的年份数据 temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x8c,temp);//向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+4);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break;} } } //------------------减键key3,各句功能参照'加键'注释--------------- if(key3==0) { delay(10);//调延时,消抖动 if(key3==0) { buzzer=0;//蜂鸣器短响一次 delay(20); buzzer=1; while(!key3); switch(key1n) { case 1:miao--; if(miao==-1) miao=59;//秒数据减到-1时自动变成59 write_sfm(0x08,miao);//在LCD的正确位置显示改变后新的秒数 temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00); //允许写,禁止写保护 write_1302(0x80,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码 write_1302(0x8e,0x80); //打开写保护 write_1602com(er+0x09);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置 //write_1602com(0x0b); break; case 2:fen--; if(fen==-1) fen=59; write_sfm(5,fen); temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x82,temp);//向DS1302内写分寄存器82H写入调整后的分数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置 break; case 3:shi--; if(shi==-1) shi=23; write_sfm(2,shi); temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x84,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(er+3);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; case 4:week--; if(week==0) week=7; write_1602com(yh+0x0C);//指定'加'后的周数据显示位置 write_week(week);//指定周数据显示内容 temp=(week)/10*16+(week)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x8a,temp);//向DS1302内写周寄存器8aH写入调整后的周数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+0x0e);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; case 5:ri--; if(ri==0) ri=31; write_nyr(9,ri); temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x86,temp);//向DS1302内写日期寄存器86H写入调整后的日期数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; case 6:yue--; if(yue==0) yue=12; write_nyr(6,yue); temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x88,temp);//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+7);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; case 7:nian--; if(nian==-1) nian=99; write_nyr(3,nian); temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x8c,temp);//向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+4);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break;} } } }}//-------------------------------void init() //定时器、计数器设置函数{ TMOD=0x11; //指定定时/计数器的工作方式为3 TH0=0; //定时器T0的高四位=0 TL0=0; //定时器T0的低四位=0 EA=1; //系统允许有开放的中断 ET0=1; //允许T0中断 TR0=1; //开启中断,启动定时器}//*******************主函数**************************//***************************************************void main(){ lcd_init(); //调用液晶屏初始化子函数 ds1302_init(); //调用DS1302时钟的初始化子函数 init(); //调用定时计数器的设置子函数 led=0; //打开LCD的背光电源 buzzer=0;//蜂鸣器长响一次 delay(80); buzzer=1; while(1) //无限循环下面的语句: { keyscan(); //调用键盘扫描子函数 }}void timer0() interrupt 1 //取得并显示日历和时间{ //Init_DS18B20();//温度传感器DS18b2初始化子函数,在头文件中 flag=ReadTemperature();//将18b2头文件运行返回的函数结果送到变量FLAG中,用于显示 //读取秒时分周日月年七个数据(DS1302的读寄存器与写寄存器不一样):miao = BCD_Decimal(read_1302(0x81)); fen = BCD_Decimal(read_1302(0x83)); shi = BCD_Decimal(read_1302(0x85)); ri = BCD_Decimal(read_1302(0x87)); yue = BCD_Decimal(read_1302(0x89)); nian=BCD_Decimal(read_1302(0x8d)); week=BCD_Decimal(read_1302(0x8b)); //显示温度、秒、时、分数据: write_temp(12,flag);//显示温度,从第二行第12个字符后开始显示 write_sfm(8,miao);//秒,从第二行第8个字后开始显示(调用时分秒显示子函数) write_sfm(5,fen);//分,从第二行第5个字符后开始显示 write_sfm(2,shi);//小时,从第二行第2个字符后开始显示 //显示日、月、年数据: write_nyr(9,ri);//日期,从第二行第9个字符后开始显示 write_nyr(6,yue);//月份,从第二行第6个字符后开始显示 write_nyr(3,nian);//年,从第二行第3个字符后开始显示 write_week(week);}
可以用FPGA内嵌的MCU来完成,不过我猜你的老师应该是为了让你们做除法吧(,所以还是用counter适合些
到看一下吧,这里有讲解51单片机的
电子信息工程毕业论文题目参考
论文写作,简单的说,就是大专院校毕业论文的写作,包含着本科生的学士论文,研究生的硕士论文,博士生的博士论文,延伸到了职称论文的写作以及科技论文的写作。论文的题目是论文的关键,有画龙点睛之效。下面是我为大家整理的电子信息工程毕业论文题目,大家不妨多加参考。
1.基于单片机的火灾报警器设计
2.基于NE555的触摸式报警器
3.数字密码锁设计
4.基于单片机智能电子时钟设计及应用
5.流水灯控制电路设计
6.简易单片机控制电路实验开发板
7.全自动洗衣机自动控制电路部分设计
8.基于单片机的八路抢答器的设计及PCB板的设计
9.基于单片机的数字温度计的设计
10.仓库温湿度的监测系统
11.直流稳压电源的制作
12.步进电机的单片机控制系统
13.单片机交通灯管理系统
单片机交通灯控制系统制作
15.基于单片机的步进电机系统设计
16.基于WML的学生网站开发
17.基于单片机的电子密码锁
18.单片机驱动步进电机控制系统的设计
19.基于单片机的流水灯设计
显示屏动态显示及其远程控制
21.基于DSP的高速多通道同步数据采集系统
22.篮球竞赛30S计时器
位数字抢答器
24.一种实用型心率计的设计
25.温度测控系统的设计
26.药品生产线上的药丸控制电路设计
27.基于选修课程的网站设计
28.基于单片机的交通灯设计
29.单片机控制的数字触发器
30.温度测控系统
31.基于单片机的数字时钟设计
32.篮球30秒定时器
33.电子万年历
34.基于单片机的智能节水控制器设计
35.嵌入式通用I/O键盘应用设计
36.数码显示的八路抢答器设计
37.基于PLC的四路抢答器设计
38.基于单片机的数字电子钟的`设计
39.超外差中波调幅收音机的组装及调试
40.基于单片机的无线电数字发射系统设计
41.基于80C51的智能汽车自控系统的设计
实现十字路交通灯自动控制
43.智能型充电器的电源和显示设计
44.基于单片机的电子时钟设计及应用
45.基于单片机的智能电子时钟的设计及应用
46.超外差中波调幅收音机组装及调试
47.基于USB接口的步进电机控制的研究与实现
48.基于单片机的电子琴设计
49.基于FPGA的直序扩频通信研究与设计
50.基于单片机的发射机控制系统
51.声光报警器的设计与研究
52.单片机电源
53.基于P87LPC768的电机控制系统
54.基于单片机的LCD电子钟设计
55.音响放大器的设计
56.超外差收音机制作及分析研究
频带传输系统的设计与实现
58.基于单片机智能电子钟的设计
与串行接口转换器的设计
60.基于FPGA的数字频率计的设计
1.卷积编码和维特比译码的FPGA实现
音频编译码算法研究与FPGA实现
调制解调技术研究及FPGA仿真实现
4.基于FPGA的高斯白噪声发生器设计与实现
5.无线通信系统选择分集技术研究
系统空时分组编码的性能研究
7.基于量子烟花算法的认知无线电频谱分配技术研究
8.基于量子混沌神经网络的鲁棒多用户检测器
9.无线紫外光多址通信关键技术研究
10.认知无线电网络的频谱分配算法
11.基于软件无线电的多制式通信信号产生器设计与实现
12.开关电源EMI滤波器的设计
13.反激式电源传导噪声模态分离技术的研究
14.核电磁脉冲源辐射的数值仿真
15.基于MATLAB的扩频通信系统及同步性能仿真
16.一种多频带缝隙天线的设计
调制解调器及同步性能的仿真分析
18.跳频频率合成器的设计
系统子载波间干扰性能分析
20.复合序列扩频通信系统同步方法的研究
21.基于DDS+PLL的频率源设计
22.基于训练序列的OFDM系统同步技术的研究
23.正交频分复用通信系统设计及性能研究
技术研究及其性能比较
25.基于蓝牙的单片机无线通信研究
26.物联网智能温室控制系统中远程信息无线传输的研究
27.船载AIS通信系统调制器的设计与实现
28.基于FPGA的16QAM调制器设计与实现
29.基于多载波通信的信道化技术研究
30.简易无线通信信号分析与测量装置
这是当时我做的一个小小的课题,希望对你有所帮助#include""/*RequiredforMS-DOSuse*/#defineENTER0x1C0D/*Enterkey*/intyear,month,day;staticchar*days[8]={"","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};structTIMEDATE{intyear;/*year1980..2099*/intmonth;/*month1=Jan2=Feb,etc.*/intday;/*dayofmonth0..31*/inthours;/*hour0..23*/intminutes;/*minute0..59*/intseconds;/*second0..59*/inthsecs;/*1/100thsofsecond0..99*/chardateline[47];/*date&timetogether*/};staticstructTIMEDATEtoday;main(){charcmonth[3];charcday[3];charcyear[5];doublegetdays();doubledaynumb,numbnow;intweekday,retcode,dayer,i;dayer=datetime(&today);clrscn();for(i=0;i<3;++i)cmonth[i]='\0';for(i=0;i<3;++i)cday[i]='\0';for(i=0;i<5;++i)cyear[i]='\0';putstr(5,8,14,"EnterdateinMMDDYYYYformat:");while(retcode!=ENTER){retcode=bufinp(5,41,13,2,cmonth);if(retcode!=ENTER)retcode=bufinp(5,44,13,2,cday);if(retcode!=ENTER)retcode=bufinp(5,47,13,4,cyear);}year=atoi(&cyear);month=atoi(&cmonth);day=atoi(&cday);daynumb=getdays(year,month,day);numbnow=getdays();weekday=weekdays(daynumb);if(numbnow-daynumb==0)printf("\n\n%02d-%02d-%dis",month,day,year);if(numbnow-daynumb>0)printf("\n\n%02d-%02d-%dwas",month,day,year);if(numbnow-daynumb<0)printf("\n\n%02d-%02d-%dwillbe",month,day,year);printf("a%s\n",days[weekday]);}/*endMAIN*//*************************************************************GETDAYS-Fromintegervaluesofyear(YYYY),month**(MM)andday(DD)thissubroutinereturnsa**doublefloatnumberwhichrepresentsthe**numberofdayssinceJan1,1980(day1).**ThisroutineistheoppositeofGETDATE.*************************************************************/doublegetdays(year,month,day)intyear,month,day;{inty,m;doublea,b,d,daynumb;doublefloor(),intg();/************************************makecorrectionfornoyear0************************************/if(year<0)y=year+1;elsey=year;/***********************************************************JanandFebaremonths13and14inthiscalculation***********************************************************/m=month;if(month<3){m=m+12;y=y-1;}/****************************calculateJuliandays****************************/d=floor(*y)+intg(*(m+1))+;/************************************************useJuliancalendarifbeforeOct5,1582************************************************/if(d<)daynumb=d;/***************************************otherwiseuseGregoriancalendar***************************************/else{a=floor(y/);b=2-a+floor(a/);daynumb=d+b;}return(daynumb);}/*endGETDAYS*//*********************************************************GETDATE-Thisroutinetakesadoublefloatnumber**representingthenumberofdayssinceJan1,**1980(day1)andreturnstheyearmonthand**dayaspointerintegers**ThisroutineistheoppositeofGETDAYS*********************************************************/getdate(numb)doublenumb;{doublea,aa,b,c,d,e,z;doubledate;date=numb;z=intg(date+);if(date<)a=z;else{aa=floor(()/);a=z+1+aa-floor(aa/);}b=a+;c=intg(()/);d=intg(*c);e=intg((b-d)/);day=b-d-intg(*e);if(e>)month=;elsemonth=;if(month>2)year=;elseyear=;if(year<1)--year;return;}/*endGETDATE*//*********************************************************WEEKDAYS-Thisroutinetakesadoublefloatnumber**representingthenumberofdayssinceJan1,**1980(day1)andreturnsthedayoftheweek**where1=Sunday,2=Tuesday,etc.*********************************************************/intweekdays(numb)doublenumb;{doubledd;intday;dd=numb;while(dd>)dd=;while(dd<0)dd=dd+;day=dd;day=((day+1)%7)+1;return(day);}/*********************************************************FRACT-Thisroutinetakesadoublefloatnumber**andreturnsthefractionalpartasadouble**floatnumber*********************************************************/doublefract(numb)doublenumb;{intinumb;doublefnumb;while(numb<-32767)numb+=32767;while(numb>32767)numb-=32767;inumb=numb;fnumb=inumb;return(numb-fnumb);}/*endFRACT*//*********************************************************FLOOR-Thisroutinetakesadoublefloatnumber**andreturnsthenextsmallestinteger*********************************************************/doublefloor(numb)doublenumb;{doublefract(),intg();doubleout;out=intg(numb);if(numb<0&&fract(numb)!=0)out-=;return(out);}/*endFLOOR*//*********************************************************INTG-Thisroutinetakesadoublefloatnumber**andreturnstheintegerpartasadouble**floatnumber*********************************************************/doubleintg(numb)doublenumb;{doublefract();return(numb-fract(numb));}/*endINTG*/
前段时间写的,部分有注释,你参考参考,不懂的问我./* * * * Createdon:2013-3-11 * Author:jw */#include<>#include<>//三维数组存放日期,每年12月,日历中最多排6行(星期),每星期7天intdays[12][6][7];//平年,闰年每个月的天数intds[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29, 31,30,31,30,31,31,30,31,30,31}};//标题chartitle[]="SUMMONTUEWEDTHUFRISAT";//月份intm[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};//月份charmt[][4]={"JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"};//根据蔡勒公式计算日期星期几intwd(intyear,intm,intd){ intc,y,w; if(m<=2){ year--; m+=12; } c=year/100; y=year%100; w=(c/4-2*c+y+y/4+13*(m+1)/5+d-1); return(w%7+7)%7;}//闰年平年intleapYear(intyear){ return(year%4==0&&year%100!=0)||(year%400==0);}intmain(){ inti,j,k,leap,fd,year; scanf("%d%*c",&year); //初始三维数组为0 for(i=0;i<12;i++){ for(j=0;j<6;j++){ for(k=0;k<7;k++){ days[i][j][k]=0; } } } fd=wd(year,1,1); leap=leapYear(year); //三维数组赋值 for(i=0;i<12;i++){ for(k=0,j=1;j<=ds[leap][i];j++){ days[i][k][fd]=j; fd=(++fd)%7; if(fd==0){ k++; } } } //输出数据 for(i=0;i<4;i++){ printf("%13s %27s %27s\n",mt[m[i][0]-1],mt[m[i][1]-1], mt[m[i][2]-1]); printf("%s %s %s\n",title,title,title); for(j=0;j<6;j++){ //1,4,7 for(k=0;k<7;k++){ if(days[m[i][0]-1][j][k]) printf("%4d",days[m[i][0]-1][j][k]); else printf(" "); } printf(" "); //2,5,8 for(k=0;k<7;k++){ if(days[m[i][1]-1][j][k]) printf("%4d",days[m[i][1]-1][j][k]); else printf(" "); } printf(" "); //3,6,9 for(k=0;k<7;k++){ if(days[m[i][2]-1][j][k]) printf("%4d",days[m[i][2]-1][j][k]); else printf(" "); } printf("\n"); } } return0;}-------------------------------------------------打印结果--------------------------------------------------------------------
1、 高压软开关充电电源硬件设计2、 自动售货机控制系统的设计3、 PLC控制电磁阀耐久试验系统设计4、 永磁同步电动机矢量控制系统的仿真研究5、 PLC在热交换控制系统设计中的应用6、 颗粒包装机的PLC控制设计7、 输油泵站机泵控制系统设计8、 基于单片机的万年历硬件设计 9、 550KV GIS中隔离开关操作产生的过电压计算10、 时滞网络化控制系统鲁棒控制器设计11、 多路压力变送器采集系统设计12、 直流电机双闭环系统硬件设计 13、 漏磁无损检测磁路优化设计14、 光伏逆变电源设计15、 胶布烘干温度控制系统的设计16、 基于MATLAB的数字滤波器设计与仿真17、 电镀生产线中PLC的应用18、 万年历的程序设计19、 变压器设计20、 步进电机运动控制系统的硬件设计21、 比例电磁阀驱动性能比较