方波信号发生器频率漂移及跟踪校正控制_第1页
方波信号发生器频率漂移及跟踪校正控制_第2页
方波信号发生器频率漂移及跟踪校正控制_第3页
方波信号发生器频率漂移及跟踪校正控制_第4页
方波信号发生器频率漂移及跟踪校正控制_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

1、重庆大学本科学生计算机控制技术课程设计方波信号发生器频率漂移及跟踪校正控制采用51单片机教学实验平台专业:自动化指导教师:班级:2011重庆大学自动化学院任务书(1)已知参数和设计要求1) 用单片机产生一个一定频率的方波;在按下漂移按键后人为给一个频率漂移;在按下频率控制按键后PID控制发挥作用并纠正频率漂移。2) 要求能实时显示(LED)(在LCD上显示加分)频率值。3) 要求在10秒内PID算法纠正频率漂移。(2)实现方法采用单片机教学实验系统实现(限<=4人选做)(3)学生应完成的工作:1) 硬件设计:要求完成控制系统框图;绘制完整的控制系统电路原理图;说明各功能模块的具体功能和参

2、数;结合实验室现有的单片机教学实验系统进行系统组成,对整个系统的工作原理进行全面分析,论述其机构特点、工作原理、优、缺点和使用场合。分析和论述系统采用的主要单元的工作原理和特性。2) 软件设计:要求合理分配系统资源,完成实现方波信号发生器频率漂移及跟踪校正控制的程序设计(如:系统初始化;主程序;A/D转换;D/A转换;标度变换;显示与键盘管理;控制算法;输出等)。3) 对设计控制系统进行系统联调。4) 编写课程设计报告:按统一论文格式、统一报告纸和报告的各要素【封面、任务书、目录、摘要、序言、主要内容(包括设计总体思路、设计步骤、原理分析和相关知识的引用等)、总结、各组员系的体会、参考书及附录

3、(包括系统框图、程序流程图、电路原理图和程序源代码)】进行编写,字数要求不少于4000字,要求设计报告理论正确,逻辑性强,文理通顺,层次分明,表达确切。(4)目前资料搜集情况(含指定参考资料)计算机硬件技术基础课程黄勤等编著重庆大学出版社单片机微型计算机与接口技术李群芳等编著电子工业出版社计算机控制技术王建华等编著高等教育出版社计控课设方波信号发生器频率漂移及跟踪校正控制目录摘要1ABSTRACT2一、系统设计思路31.1系统设计方案31.2人员及任务分配4二、芯片选择及硬件接口连线42.1芯片选择42.2硬件接口连线4三、各功能模块原理63.1键盘模块63.1.1键盘的工作原理63.2LCD

4、1602显示模块73.2.1各个管脚的功能73.2.2显示原理83.3方波频率发生器模块93.3.1单片机中定时器的工作原理93.3.2定时器0的功能93.3.3定时器1的功能103.4频率检测模块103.5频率扰动模块113.6频率矫正模块113.6.1 方波信号发生器的模型建立123.6.2 MATLAB整定PID参数程序133.6.3PID参数整定仿真14四、软件设计流程164.1初始化流程图:164.2主程序流程图:174.3增量式PID算法流程图:184.4给定扰动流程图:19五、问题总结及解决办法205.1定时器0发出方波脉冲的频率检测205.1.1 问题详述205.1.2 问题解

5、决205.2频率检测误差的处理205.2.1 问题详述205.2.2 问题解决215.3 问题二中的matlab程序(修改段)22六、设计总结23七、操作说明25八、程序清单26九、参考文献43计控课设方波信号发生器频率漂移及跟踪校正控制摘要本文主要介绍基于单片机的方波信号发生器频率漂移及跟踪控制的实现,包括给定频率方波信号的产生,方波频率检测,方波频率增减以及根据检测信号调整方波频率。方波频率产生主要运用单片机定时0的定时中断功能实现,即通过定时器计时不断调整输出引脚高低电平的变化;对给定频率的实时跟踪控制利用定时器0计时检测方波脉冲宽度并转换为脉冲频率,以给定频率为基准,将所得频率对输出频

6、率进行速度式PID动态跟踪控制;方波频率的增减以及检测信号则通过计时初值N的改变实现。实验结果证明,PID控制器对数字信号的控制在实现形式上更为灵活,并且可以在被控系统传递函数模型模糊的情况下很好的完成控制任务,达到了预期的设计目标。关键词:方波;频率漂移AbstractThis paper describes themicrocontroller-basedsquare wavesignal generatorfrequency driftandachievetracking control, including generatinga givenfrequencysquarewave si

7、gnal, square wavefrequency detection,as well aschanges inthe frequency ofthe square wavesignal isadjustedaccording to the detectedfrequencysquare wave. The mainuse ofsquare-wavefrequency generationsingle-chiptimingtimer0interruptfunctions to achieve, namely, by constantly adjustingthe timeroutput pi

8、nhigh and lowchanges; givenfrequency,real-time trackingcontrolusingtimer0countingdetectionsquare wave pulsewidthandis converted toa pulsefrequency ofa givenreferencefrequency, the outputfrequency ofthefrequencyobtainedvelocity-type PIDcontrollingdynamic tracking; increase or decreasethe frequency of

9、the square waveandthe detection signalby changingthe timingofthe initial value ofNisachieved.Experimental results show that, PID controller controlsthe digitalsignalis more flexiblein the realization ofthe form, and can becontrolled systemtransferfunction modelundervaguecircumstancescontrol taskswel

10、l done, to achieve the desireddesign goals.一、系统设计思路1.1系统设计方案图1-1 系统模块框图如上图所示,经过组员的讨论,将本系统设计分为六大模块。这六大模块为:频率给定模块、频率矫正模块、方波发生模块、频率扰动模块、LCD显示模块、频率检测模块。各模块作用如下:频率给定模块:给定一个方波应产生的频率,无论是否在有扰动的情况下,方波最后应产生的频率即为给定频率。方波发生模块:在给定频率的情况下,产生一个与给定方波频率一致的方波。频率扰动模块:即通过键盘按键的按下来达到改变方波原有频率的一个外界扰动。频率检测模块:通过采样以及相关程序,实时检测方波

11、的频率。频率显示模块:通过频率检测模块的实时检测功能,将检测到的数据实时送往LCD显示出相应的数值。频率校正模块:在外界有按键按下的情况,对频率进行校正,校正后的值应为给定频率的数值。二、芯片选择及硬件接口连线2.1芯片选择1)图形液晶显示器LCD16022)SST89E554RC单片机3)TD-NMC+系统51教学实验平台2.2硬件接口连线P0口接LCD;P1接键盘;P24P26分别接Rs、Rw、E;图2-1 硬件连线原理图图2-2硬件实物展示效果图三、各功能模块原理3.1键盘模块3.1.1键盘的工作原理键盘在此作为系统的一个频率漂移的输入设备。设计中采用的是4×4矩阵键盘。其行线

12、、列线分别连接到按键开关的两端,列线通过上拉电阻接到+5v上。无键按下时,列线处于高电平状态;当有键按下时,行列线导通,列线电平将由与它相连的行线电平决定,将行线、列线信号配合起来作适当处理,可唯一确定闭合键所在位置。1) 按键识别按键识别最常用的方法是行扫描法,其基本思想是:第一步,行开放,判断键盘中是否有键按下。将全部行线0-3置为低电平,然后检测列线状态。只要有一列的电平为低,则表示键盘中有键按下,且闭合的键就在低电平列线与4根行线交叉处的4个按键之中。若有列线均为高电平,则键盘中无键按下。第二步,逐行扫描,判断闭合键所在的确切位置。在确认有键按下后,即可进入确定具体闭合键的过程。其方法

13、是:依次将线置为低电平,即在某根线为低电平时,其他行线为高电平。检测各列线的电平状态,若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。2) 键盘的编码在识别到按键的具体位置后,需要进一步知道它是什么键,以便让系统转移到该按键的处理程序中执行相应功能。因此需要对该键盘上的各个按键进行编码,让编码与按键一一对应,这个编码称为键特征值。其具体方法是把扫描各按键按下时的行线状态作为高四位,列线作为低4位拼成一个字节,这样可以形成唯一确定按键的编码。再根据特征值查表得到键代号;判断闭合键是否释放,如果没有释放则继续等待,如果释放就根据键代号转去执行该键的处理程序。图3-1 4×

14、;4矩阵键盘3)键盘的延时去抖动由于51单片机的运算速度远高于人按下机械键盘的速度,所以为了防止错误输入选择信号,键盘需要去抖动。本设计方案中采用了延时去抖动和键盘释放有效两种方式共同消除抖动,确保了键盘输入更为精准。3.2LCD1602显示模块LCD显示器具有工作电压低,功耗小、寿命长、体积小、重量轻等优点。我们采用的是AMPIRE128×64点阵字符型LCD。3.2.1各个管脚的功能它与CPU 连接的信号线如下:CS1、CS2:片选信号,低电平有效;E:使能信号;RS:数据和指令选择信号,RS1 为RAM 数据,RS0 为指令数据;R/W:读/写信号,R/W1 为读操作,R/W0

15、 为写操作;D7D0:数据总线;LT:背景灯控制信号,LT1 时打开背景灯,LT0 时关闭背景灯。显示控制指令控制着液晶控制器的内部状态,具体如下表所列。图3-2LCD16023.2.2显示原理LCD指令中有开显示指令和关显示指令,LCD显示与否受控于这个软件控制的开关,需要显示时像LCD模块写入开显示指令即可显示。也可通过指令关闭LCD显示。当LCD实时显示子程序被主程序调用时,LCD就会开显示,并显示出实时频率,当扫描的频率足够快时,人的肉眼无法分辨,实现了其实时显示的功能。单片机初始化LCD初始化结束否数据采集数据显示、通讯结束 Y图3-3 LCD显示流程图图3-4 LCD引脚接口3.3

16、方波频率发生器模块3.3.1单片机中定时器的工作原理定时器作为51单片机中的固有元件,对51单片机的拓展应用起到了举足轻重的作用。计时器中的定时中断是为满足定时或计数溢出处理的需要而设置的。当定时/计数器中的加1计数器溢出时,则表明定时时间到或计数值已满,此时便可通过位置溢出标志TFi,向CPU提出中断要求,该中断请求是单片机内部发生的。51单片机中有两个定时器T0与T1,他们分别对应了两个内部中断请求TF0和TF1。TF0定时器/计数器T0溢出中断请求标志。当定时器/计数器T0发生溢出时,置位TF0,并向CPU提出中断请求。TF1定时器/计数器T1溢出中断请求标志。当定时器/计数器T1发生溢

17、出时,置位TF1,并向CPU提出中断请求。在此次试验中,我们对定时器模块采用计时方式1(16位计数器),分别由THi和TLi寄存器各提供8位计数初值,最大计数值为216(65536个脉冲)。开始工作时其计数初值N由THi和TLi寄存器提供,当THi和TLi中的初值计满为零(即到达0x10000)产生溢出中断请求后,程序跳至中断子程序。3.3.2定时器0的功能定时器0主要用来定每次刷新PID算法的时间,我们每0.02s对定时器1进行对初值的PID算法更新并且每1s刷新一次屏幕,于是需要置一个n=40进行一次屏幕的刷新。3.3.3定时器1的功能利用定时器的定时中断功能能够方便的设计出方波频率发生模

18、块。此次设计,利用按键中断程序设定给定的一个方波频率,采用定时方式1(n=13)通过转换子程序变成初值N给定时器1。转换子程序的算法为:(2n-N)*t=tov,其中t为机器周期,t=12/fosc(fosc为振荡频率);tov为所需定时时间;n的取值由工作方式中计数器的位数决定。图3-5定时器13.4频率检测模块利用另一块定时器0和51单片机的外部中断功能可以简单设计出频率检测模块原理。由频率的定义,当频率引脚为低的时候等待,频率引脚为高的时候启动定时器0开始计时,读出计数值,即单高或单低的脉宽,然后用1s除以2倍的计时t即得到检测的频率。图3-6检测原理3.5频率扰动模块由于扰动由单片机内

19、部软件认为给定,即改变定时器1的初值即可完成。在检测到扰动命令按键后,对不同的扰动类型,如正扰动、负扰动、随机扰动(扰动数值大小由随机函数random生成),给予定时器1计数初值不同的变化量即可。具体流程见软件设计流程部分图4-4。3.6频率矫正模块PID控制是控制策略中最常用且行之有效地控制策略,在实现中其各个环节作用如下:比例环节P的作用:增大比例系数Kp虽然可以减小偏差,但不能彻底消除偏差。比例控制作用的大小除与偏差e(t)有关之外,还取决于比例系数Kp的大小。比例系数Kp越小,控制作用越小,系统响应越慢;反之,比例系数Kp越大,控制作用也越强,则系统响应越快。但Kp过大会使系统产生较大

20、的超调和振荡,导致系统的稳定性能变差。因此,不能将Kp选取过大,应根据被控对象的特性来折中选取Kp,使系统的静差控制在允许的范围内,同时又具有较快的反应速度。积分环节I的作用:积分环节的存在于偏差e(t)的存在时间有关,只要系统存在着偏差,积分环节就会不断起作用,对输入偏差积分,使控制器的输出及执行器的开度不断变化,产生控制作用以减小偏差。在积分时间足够长的情况下,可以完全消除静差,这时积分控制作用将维持不变。Ti越小,积分速度越快,积分作用越强。积分作用太强会使系统超调加大,甚至使系统出现震荡。微分环节D的作用:积分环节的引入虽然可以消除静差,但是降低了系统的响应速度,特别是对于具有较大惯性

21、的被控对象,用Pi控制器很难得到很好的动态调节品质,系统会产生较大的超调和震荡,这时可以引入微分作用。在偏差刚出现的书剑,不仅根据偏差作出及时反应,还可以根据偏差变量的变化趋势提前给出较大的控制作用,将偏差消灭在萌芽状态,这样可以大大减小系统的动态偏差和调节时间,是系统的动态调节品质得以改善。微分环节有助于系统减小超调,克服震荡,加快系统的响应速度,减小系统的调节时间,从而改善了系统的动态性能,但微分时间常数过大,会使系统出现不稳定。3.6.1 方波信号发生器的模型建立方波信号发生器的模型在忽略了其余的不重要的参数的影响之后可以用下面的图表示:图3-8方波信号发生器的模型其中定时器的传递函数模

22、型不是很清楚。于是可以在以上的模型中加入PID环节,用于更好的模糊化控制整个系统,因为PID调节器可以不用知道系统的准确的传递函数。加入PID后的模型可以表示如下:图3-9加入PID算法后的模型解析这个模型最麻烦的就是整定参数,由于检测器的精度原因,所以存在误差。且其传递函数也是未知,所以想要建立精确的模型来分析是不太可能的,只能够通过一些特殊的办法来整定了。除了计算机控制技术里面介绍的几种办法,比如常用的简易工程整定法以及扩充临界比例度法等等。但是本文中的模型显然都不太适合使用这几种方法进行参数整定,于是在此采取了一个比较取巧的办法。根据定时器0和定时器1的作用来分析,首先定时器0和定时器1

23、都工作在定时方式1上。定时器0的作用就是将计数器N值转换成为频率,而定时器1的作用就是将频率转换成为N值,假设定时器1和定时器0的精度都是一样的,那么模型的误差虽然都是叠加的,但是模型叠加最后就变为一个Kp=1的比例环节。据此就可以将后面的模型简化为一个简单的比例环节,忽略误差的前提下反馈的N就等于送入定时器0的N值。这样就可以利用Matlab进行编程,使用速度式的PID算法进行控制,根据多次PID运算后画出的结果图像就可以将参数整定得比较理想。后期再根据具体的实际产品进行微调,结果就会达到预期的效果。3.6.2 MATLAB整定PID参数程序 clear all; Td=0.000001;

24、%设定速度式PID的四个参数 Ti=0.45;Kp=0.96; T=0.02;yuzhiHz=20000; %给定设定的频率xuzhiHz=23000; %频率漂移后的的频率 ek1=0; %给定的初始的ek0和ek1的初值 ek0=0; tu1(1)=20000; tu2(1)=23000;fori=2:1:500 %给定计算次数为500次 b1=Kp*(1+T/Ti+Td/T); %速度式PID的计算过程,理论分析见后面。 b2=-Kp*(1+2*Td/T); b3=Kp*(Td/T); ek=yuzhiHz-xuzhiHz; zengliang=b1*ek+b2*ek1+b3*ek0;

25、ek0=ek1; ek1=ek;xuzhiHz=xuzhiHz+zengliang; tu1(i)=20000; x(i)=i; tu2(i)=xuzhiHz;endtu2plot(x,tu1,'r');hold on; %画出PID结果图,图像参见下面。plot(x,tu2);3.6.3PID参数整定仿真利用MATLAB软件,采用定二变一的方法对PID三个参数的大小进行调试和确定。首先设定Ti和Td分别为无限大和0,单整定一个Kp,将其由小调到大,最后确定一个最合适的Kp,然后分别加入积分和微分环节,最后就可以得到一组比较合适的参数。首先我们得到第一组参数如下,PI分别为0.

26、95和0.45,发现整定时间25s太长了,如下图:图3-10 整定时间太长然后改变参数PI分别为0.95和0.5,得到第二组参数发现有稳态误差,如下图:图3-11存在稳态误差最后,得到第三组参数发现效果还不错,如下图:图3-12较好的效果根据上面所述的情况,最后我们选择了T=0.02,Kp=0.96,Ti=0.045,Td=0.0000001这一组参数,其MATLAB仿真结果如上图3-8所示,效果是十分好的,在实际中再微调一下,那么效果就十分理想了。四、软件设计流程4.1初始化流程图:图4-1初始化初始化显示器为“enter number”void LCD_Init(void)初始化定时器0和

27、定时器1TMOD=0x21;TH0=0xB1;TL0=0xE0;初始化键盘unsigned char cord_h,cord_l;KeyPort=0x0f;cord_h=KeyPort&0x0f4.2主程序流程图:图4-2 主程序当定时器0检测到当前输出频率的时,检测按键按下的哪个键值然后进入标志位判断程序或者更改计数器1的初值N。若按下1-9键时,相应的键值乘以1000Hz,置方波定时器1的初值N,1s之后刷新屏幕显示;若按下A-E键的时候进入标志位判断程序(本程序定了三个标志位Flag1、Flag2、Flag3),调用增量式PID算法,然后调用漂移子程序,接着置方波定时器1的初值N

28、,1s之后刷新屏幕显示,然后结束。4.3增量式PID算法流程图:图4-3 增量式PID算法采用增量式PID控制算法,计算机运算所得的是控制量的增量u(k),它所对应的是本次采样时刻执行机构(如阀门的开度)的增量,而对应阀门的实际位置的控制量需要用有累积作用的原件(如步进电机)来实现,也可以用软件执行算式u(k)=u(k-1)+u(k)来实现,所以增量式PID控制算法是位置式PID控制算法的优化。4.4给定扰动流程图:图4-4 给定扰动首先扰动子程序定了一个标志位Flag3,然后当其值分别为1、2和3的时候依次进入正漂移、负漂移和初始化时间种子并产生随机产生数值,接着在原计数初值上产生漂移并给定

29、时器1发生相应的方波。五、问题总结及解决办法5.1定时器0发出方波脉冲的频率检测5.1.1 问题详述一个闭环的系统其检测环节是十分重要的。本文是通过定时器0来说输出方波的,同时其方波产生在P2 0口上面,如何检测便是一个十分棘手的问题。我们不能够通过添加更多的硬件来检测,那样势必会带来更多的误差和双机通讯的新问题,反而可能会得不偿失。所以放在我们面前的就只有一种途径,那就是软件的办法来解决。而软件的办法又怎么设计才能够很快速地将输出频率检测回来又不失精度呢?5.1.2 问题解决问题现在已经出现了,要想要简单解决就只有通过软件的途径了,而软件解决的办法,通常有以下两个:1、 使用两个定时器,一个

30、用于定时,一个用于计数,这样我们就能够很精确的检测到输出的方波频率了。例如定时器0定时1秒钟时间,同时定时器1对P2 0进行计数,在一秒钟内计数为400次,那么频率就是400Hz了。2、 使用一个定时器,对方波的脉宽进行定时,然后根据脉宽计算出来频率来。事实上一个单片机只有两个定时器,一个用于发出方波了,空闲的只剩下一个了,所以方法1明显被直接排出了。但是方法2在频率较高的时候明显会带来很大的误差,因为单片机中当定时器0的波形由高电平变成低电平的时候,需要执行一个判断语句才能够对定时器1进行关闭计时,而这会带来大概5的计数值的变化。而当频率为6000Hz时,定时器其实只需要计83个计数值就会溢

31、出,这样带来的误差是巨大的,根据公式反算出的频率为5681Hz,这带来的误差达到了319Hz之巨。虽然在低频的时候这个方法带来的误差只有1Hz-2Hz,这可以通过程序进行修正,但是高频这明显不能,因为每次计数的值的误差也不一定一样,在1-5之间变化,这在低频最多只能带来1Hz的偏差,但是在6000Hz时却能带来100Hz的误差,所以需要另想办法消除它带来的影响。5.2频率检测误差的处理5.2.1 问题详述如上一个问题最后所述,在低频段10-90Hz的时候带来的误差只有1Hz,所以在程序中将测得的结果进行手动加1便可以抵消了。但是在高频段1000Hz-9000Hz时却不能这样,因为测脉冲宽度带来

32、的误差是不定的。所以需要其它的办法来消除。5.2.2 问题解决高频段的频率检测会存在不定的误差,所以误差的消除办法需要结合MATLAB的简化模型进行仔细的分析。假设现在有两个误差值被交替引进,分别为14Hz和20Hz。在matlab中进行分析结果如下:可以看出,原系统根本已经不再收敛了,并且还出现了巨大的稳态误差。这时肯定需要进行处理了之后才能引进,不然就会使原系统出现巨大的问题。所以我们采取了一种延迟检测处理的办法:原来的程序是每次进行PID之后都将检测值作为下次的输入值,在此就只能够使原来的系统的检测时间延长,在多次PID之后再进行一次检测,这样检测带来的误差影响就可以被多次PID的效果所

33、抵消,使得结果变得比较理想,如下图所示(取40次PID之后检测一次):可以看到这样的误差带来的影响便被抵消到了最小。再调调参数,那么就可以有了很好的效果。5.3问题二中的matlab程序(修改段)1)、两个误差值被交替引进,分别为14Hz和20Hz:if mod(i,2)=0xuzhiHz=xuzhiHz+zengliang+14;else xuzhiHz=xuzhiHz+zengliang+20;end2)、40次PID之后检测一次频率:if mod(i,40)=0xuzhiHz=xuzhiHz+zengliang+14;elseif mod(i,41)=0;xuzhiHz=xuzhiHz+

34、zengliang+20;else xuzhiHz=xuzhiHz+zengliang;endend六、设计总结七、操作说明键盘功能介绍:以LCD显示器显示的正常阅读方向为基准,4*4键盘的功能编号如下:无用PID功能关闭设置初始频率70Hz设置初始频率30Hz给输出赋予随机漂移PID功能开启设置初始频率60Hz设置初始频率20Hz给输出赋予负漂移设置初始频率90Hz设置初始频率50Hz设置初始频率10Hz给输出赋予正漂移设置初始频率80Hz设置初始频率40Hz无用八、程序清单401)、低频段:/*-函数名称:低频编写:huangyongcan日期:2014 09 13修改:版本1内容:定义所

35、有的需要的变量,外部变量-*/ #include <reg52.h>#include <stdio.h>#include <stdlib.h>#include <intrins.h>/*-定义全局变量和预定义数据-*/ /动态显示的预定义sbit RS = P24; /定义端口sbit RW = P25;sbit EN = P26;#define RS_CLR RS=0 #define RS_SET RS=1#define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0#define EN_

36、SET EN=1#define DataPort P0/引脚的定义sbit pinlv=P20;/数据定义的预定义typedef unsigned char uchar;typedef unsigned int uint;/键盘读入程序的预定义#define KeyPort P1sbit Key=P32;/整个程序公用的数据uint yuzhiHz; /预置的频率uint xuzhiHz; /需置的频率/uint xuzhiHzz;uint n,q,w;uchar *p; uchar fre6; int flag1=0,flag2=0,flag3=0,flag4=0;/ pid程序所用的数据#

37、define Td 0.000001#define Ti 0.45#define Kp 0.96#define T 0.02int ek,ek1=0,ek0=0;/*- uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下 T=tx2+5 uS -*/void DelayUs2x(unsigned char t) while(-t);/*- mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符

38、号字符变量,其值的范围是 0255 这里使用晶振12M,精确延时请使用汇编-*/void DelayMs(unsigned char t) while(t-) /大致延时1mS DelayUs2x(245); DelayUs2x(245); /*-判忙函数-*/ bit LCD_Check_Busy(void) DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80); /*-写入命令函数-*/ void LCD_Write_Com(unsigned char com)

39、while(LCD_Check_Busy(); /忙则等待 RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; /*-写入数据函数-*/ void LCD_Write_Data(unsigned char Data) while(LCD_Check_Busy(); /忙则等待 RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; /*-清屏函数-*/ void LCD_Clear(void) LCD_Write_Com(0x01); DelayMs(5); /*-写入字符串函

40、数-*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) if (y = 0) LCD_Write_Com(0x80 + x); else LCD_Write_Com(0xC0 + x); while (*s) LCD_Write_Data( *s); s +; /*-写入字符函数- void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) if (y = 0) LCD_Write_Com(0x80 + x); e

41、lse LCD_Write_Com(0xC0 + x); LCD_Write_Data( Data); -初始化函数-*/ void LCD_Init(void) LCD_Write_Com(0x38); /*显示模式设置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); LCD_Write_Com(0x08); /*显示关闭*/ LCD_Write_Com(0x01); /*显示清屏*/ LCD_Write_Com(0x06); /*显示光标

42、移动设置*/ DelayMs(5); LCD_Write_Com(0x0C); /*显示开及光标设置*/ /*-按键扫描函数,返回扫描键值-*/unsigned char KeyScan(void) /键盘扫描函数,使用行列反转扫描法 unsigned char cord_h,cord_l;/行列值中间变量 KeyPort=0x0f; /行线输出全为0 cord_h=KeyPort&0x0f; /读入列线值 if(cord_h!=0x0f) /先检测有无按键按下 DelayMs(10); /去抖 if(KeyPort&0x0f)!=0x0f) cord_h=KeyPort&am

43、p;0x0f; /读入列线值 KeyPort=cord_h|0xf0; /输出当前列线值 cord_l=KeyPort&0xf0; /读入行线值 while(KeyPort&0xf0)!=0xf0);/等待松开并输出 return(cord_h+cord_l);/键盘最后组合码值 return(0xff); /返回该值/*-按键值处理函数,返回扫键值可以根据需要改变返回值| 1 | 5 | 9 | 13 | | 2 | 6 | 10 | 14 | | 3 | 7 | 11 | 15 | | 4 | 8 | 12 | 16 | -*/int KeyPro(void) switch

44、(KeyScan() case 0x7e:return 0x00;break;/0 按下相应的键显示相对应的码值 case 0x7d:return 0x01;break;/1 case 0x7b:return 0x02;break;/2 case 0x77:return 0x03;break;/3 case 0xbe:return 0x04;break;/4 case 0xbd:return 0x05;break;/5 case 0xbb:return 0x06;break;/6 case 0xb7:return 0x07;break;/7 case 0xde:return 0x08;brea

45、k;/8 case 0xdd:return 0x09;break;/9 case 0xdb:return 0x0A;break;/a case 0xd7:return 0x0B;break;/b case 0xee:return 0x0C;break;/c case 0xed:return 0x0D;break;/d case 0xeb:return 0x0E;break;/e case 0xe7:return 0x0F;break;/f default:return 0xff;break; /*-频率漂移函数-*/void piaoyi(void)uint a;uint piaoyilian

46、g,fuzhu;srand(n);a=rand()%500;fuzhu=yuzhiHz;if(flag3=1)piaoyiliang=fuzhu*0.2; /返回漂移的值else if(flag3=0)piaoyiliang=fuzhu*-0.2; else if(flag3=2)piaoyiliang=a;xuzhiHz=yuzhiHz+piaoyiliang;/*- pid函数-*/void pid(void)float b1,b2,b3;long int zengliang;b1=Kp*(1+T/Ti+Td/T);b2=-Kp*(1+2*Td/T);b3=Kp*(Td/T);/算出增量式

47、pid的三个参数ek=yuzhiHz-xuzhiHz;/根据预置数和需置数算出现行的偏差zengliang=b1*ek+b2*ek1+b3*ek0;/算出现行的增量ek0=ek1;ek1=ek;xuzhiHz=xuzhiHz+zengliang;/*-频率到计数初值的转换-*/uint zhuanhuan(void) uint N; /给定时器1的初值 long int i=1,j=1; for(;j<=6;) i=i*10;j+; N=(65536-(i/xuzhiHz)/2); return N;/*-频率发生-*/void INT_timer1(void) interrupt 3/产生一

温馨提示

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

最新文档

评论

0/150

提交评论