1、北京交通大学计算机控制课程设计报告70资料内容仅供参考,如有不当或者侵权,请联系本人改正或者删除。计算机控制课程设计终期报告姓名: 学号: 班级: 指导教师: 周永华 时间: -7-1 目录一、设计题目3二、系统方案31、水温自动控制系统设计任务和要求32、水温自动控制系统部分33、温度控制系统的算法分析4三、系统硬件设计51、总体设计框图及说明52、各个子模块设计52.1 CPU的选择52.2 测量单元选型62.3 水温控制电路设计62.4 键盘设置电路72.5 LCD显示电路82.6 报警电路8五、软件系统设计91、程序框架结构92、主程序模块103、按键程序114、LCD显示程序125、
2、DS18B20采集温度程序126、PID计算和继电器控制程序127、附加时间显示程序14六、MATLAB/SIMULINK仿真部分141、理论分析142、具体传递函数计算153、SIMULINK仿真154、MATLAB仿真18七、PROTEUS仿真部分24八、结论及心得体会251、实验结论252、心得体会26八、参考文献26一、 设计题目基于单片机的水温自动控制系统二、 系统方案1、 水温自动控制系统设计任务和要求该系统为一实验系统, 系统设计任务如下: 设计一个水温自动控制系统, 控制对象为一杯子内水的温度。水温能够在一定范围内由人工设定, 并能在环境温度降低时实现自动调整, 以保持特定的温
3、度不变。 系统设计具体要求: ( 1) 温度设定范围为30-50摄氏度; ( 2) 环境温度降低是控制水温误差小于1摄氏度; ( 3) 采用适当的方法, 使得温度在一定范围内才进行控制, 超过某一范围直接加热或者不加热, 减小系统的调节时间; ( 4) 采用适当方法减少系统的超调量; ( 5) 用LCD1602显示温度与时间。2、 水温自动控制系统部分水温自动控制系统是一个过程控制系统, 组成框图如图1所示, 由输入、 输出、 控制器、 执行器、 被控对象其反馈作用的测量组成。输入控制器执行器受控对象输出测量反馈 图1 计算机控制系统框图本系统中CPU选择为单片机, 执行器为继电器, 控制加热
4、片通断, 检测装置为温度传感器采集温度并反馈给单片机。另外还有键盘输入部分、 显示部分以及报警部分, 总体框图如下( 图2) AT89C52控制器报警显示输入测量执行器加热器 图2 温控箱控制系统总体框图3、 温度控制系统的算法分析本实验的基本思路是采用位置式PID控制算法, 其基本算式为uk=KPek+KIj=0kej+KDek-e(k-1)当然在实际应用中根据具体情况对控制参数做出改进,针对PID控制算法的积分作用, 采用积分分离的控制算法。控制系统在开始工作时必然会有较大的误差, 而且它在短时间内不会消除, 而且经过积分项累积后会使得控制作用u(k)在误差较小时依然保持较大的值, 即进入
5、积分饱和状态, 这使得系统需要经过很长的时间才能恢复正常, 这就大大影响了控制效果。一种比较好的克服积分饱和的方法是采用积分分离法。积分分离法的基本控制思想是在偏差大于某个规定的门限值时, 停止并取消积分作用; 而在误差小于此门限值时才计算并引入积分作用, 来消除稳定误差。其基本算式为uk=KPek+KIj=kikej+KDek-e(k-1)当ek值, =1, 当ek值, =0三、 系统硬件设计1、 总体设计框图及说明本系统是一个简单的单回路控制系统。为了实现水温的自动测量和控制, 根据系统总体方案, 系统由单片机基本系统、 前向通道、 反馈通道和人机对话通道等4个主要的功能模块组成, 总体框
6、图如上面图2所示。单片机系统是整个控制系统的核心, AT89C52能够提供系统控制所需的I/O口、 中断、 定时及存放中间结果的RAM电路; 前向通道是控制执行的通道, 主要包括光耦、 继电器、 加热管; 反馈通道由DS18B20构成, 采集当前实际的温度。键盘设定: 采用4*4矩阵键盘, 用于温度设定、 设定加热开关以及时间的显示。数据采集: 运用DS18B20数字温度传感器采集当前温度并反馈给CPU进行处理, 用于控制和显示。数据显示: 运用LCD1602字符型液晶显示屏显示设定温度、 实际温度以及当前的时间。执行机构: 经过三极管控制继电器来完成对加热管的控制, 为防止强电弱电相互影响,
7、 在单片机与继电器之间加入光电耦合器进行强电弱电的隔离。2、 各个子模块设计2.1 CPU的选择单片机是一种集成在电路芯片, 是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、 只读存储器ROM、 多种I/O口和中断系统、 定时器/计时器等功能( 可能还包括显示驱动电路、 脉宽调制电路、 模拟多路转换器、 A/D转换器等电路) 集成到一块硅片上构成的一个小而完善的计算机系统。其使用起来十分简单灵活方便, 因此选择单片机作为CPU。本系统选择本人较为熟悉的AT89C52单片机作为CPU。如图3所示。图3 AT89C52封装图 2.2 测量单元选型方案1: 采用热敏电
8、阻, 可满足35-95的测量范围, 但热敏电阻精度、 重复性和可靠性都比较差, 对于检测精度小于1的温度信号是不适用的。方案2: 采用温度传感器DS18B20。在本课题中我用的温度传感器是DALLAS公司生产的DS18B20它的体积非常小, 硬件开销也小, 抗干扰能力强, 精度高, 附加功能强。它之因此能够有这些优点, 是因为它把温度检测与数字数据输出全集成于一个芯片之上, 从而抗干扰力更强。其一个工作周期可分为两个部分, 即温度检测和数据处理。这里最后确定使用方案2, 即采用带防水封装的18B20温度传感器。2.3 水温控制电路设计 此部分经过控制继电器的通断从而控制加热片, 采用对加在电热
9、管两端的电压进行通断的方法进行控制, 以实现对水的加热功率的调整, 从而达到对水温控制的目的, 即在闭环控制系统中对被控对象实施控制。另外, 为了防止强电对弱电的影响, 我在继电器与单片机之间加了光耦进行隔离。继电器是一种电控制器件。它具有控制系统( 又称输入回路) 和被控制系统( 又称输出回路) 之间的互动关系。一般应用于自动化的控制电路中, 它实际上是用小电流去控制大电流运作的一种”自动开关”。故在电路中起着自动调节、 安全保护、 转换电路等作用。如图4所示 图4 继电器原理图 图5 实际应用的继电器只要在线圈两端加上一定的电压, 线圈中就会流过一定的电流, 从而产生电磁效应, 衔铁就会在
10、电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯, 从而带动衔铁的动触点与静触点( 常开触点) 吸合。当线圈断电后, 电磁的吸力也随之消失, 衔铁就会在弹簧的反作用力返回原来的位置, 使动触点与原来的静触点( 常闭触点) 释放。这样吸合、 释放, 从而达到了在电路中的导通、 切断的目的。 光电耦合器是以光为媒介传输电信号的一种电一光一电转换器件。它由发光源和受光器两部分组成。把发光源和受光器组装在同一密闭的壳体内, 彼此间用透明绝缘体隔离。发光源的引脚为输入端, 受光器的引脚为输出端。在光电耦合器输入端加电信号使发光源发光, 光的强度取决于激励电流的大小, 此光照射到封装在一起的受光器上后, 因光
11、电效应而产生光电流, 由受光器输出端引出, 这样就实现了电一光一电的转换。2.4 键盘设置电路 本系统选择4*4矩阵键盘作为输入部分, 用来输入预设温度、 开启与关闭加热、 调节时间等。 4*4矩阵键盘内部电路及实物图如图6所示, 每行4个按键的一端连在一起, 每列也连在一起, 经过选择行与列就能判断出究竟是哪个键按下。图6 4*4矩阵键盘其中数字键用于设定温度值。另外4个键分别用来控制加热、 调整时间模式选择键、 时间加、 时间减, 还有两个键暂时保留功能。2.5 LCD显示电路本系统采用LCD1602显示温度值与时间。如图7所示。LCD1602液晶显示模块能够和单片机STC89C52直接接
12、口, 电路如图8所示。经过LCD1602显示预设以及实际的温度, 并能显示加热管现在处于的状态是加热还是停止加热, 并附加显示时间。 图7 LCD1602 图8 LCD proteus仿真图 2.6 报警电路本系统采用简易的报警电路进行报警, 仿真图如图9所示。设计思想为当预设温度不在所期望的范围( 3050度) 内, 则蜂鸣器发出警报, 若实际温度大于50度则亮黄灯进行提醒, 若实际温度小于30度则亮绿灯进行提醒。图9 报警电路的仿真五、 软件系统设计1、 程序框架结构一个整体的系统软件设计是由各个在系统里起着不同作用的模块整合在一起, 从而实现系统的所要实现的功能。本系统包括主控制程序,
13、键盘扫描程序, 温度采集程序, 时间显示与调整程序, PID算法程序, LCD显示程序。结构框架图如图10所示。主程序模块键盘扫描LCD显示DS18B20采集温度PID计算继电器工作图10 系统程序框架主程序模块相当于调度室, 对子程序模块的调用进行管理, 它主要负责初始化IO口; 等待键盘的被按下, 并调用相应的模块进行处理; 显示温度控制过程及时间; 在适当的时候经过DS18B20检测实际温度, 并与所设定的值进行比较, 判断报警并经过调用PID算法处理数据, 处理后来控制继电器的通断, 从而控制热电管达到控制温度的目的。2、 主程序模块由于模块化程序的设计, 经过调用程序即可实现所用功能
14、, 主程序流程图如图11所示。 图11 主程序流程图 图12 键盘扫描流程图主程序见附件一。3、 按键程序本系统采用4*4键盘, 键盘扫描的思想是首先判断是否真的有键按下, 然后开始判断究竟是哪一个键按下。具体思路是先给P1口置成0xf0,若有键按下, 则P0口的电平发生变化, 然后依次置P1口为0xfe,0xfd,0xfb,0xf7,找出是哪一行有键按下, 行找到后再确定是该行的哪列被按下, 最终找到键值。程序流程图如图12所示。按键程序见附件一。4、 LCD显示程序1602液晶模块内部的控制器共有11条控制指令, 如表1所示: 序号指令RSR/WD7D6D5D4D3D2D1D01清显示00
15、000000012光标返回000000001*3置输入模式00000001I/DS4显示开/关控制0000001DCB5光标或字符移位000001S/CR/L*6置功能00001DLNF*7置字符发生存贮器地址0001字符发生存贮器地址8置数据存贮器地址001显示数据存贮器地址9读忙标志或地址01BF计数器地址10写数到CGRAM或DDRAM) 10要写的数据内容11从CGRAM或DDRAM读数11读出的数据内容表1: 控制命令表由于LCD1602比较常见, 编程序是按照时序写入即可, 这里不再赘述。LCD显示程序见附件一。5、 DS18B20采集温度程序 DS18B20数字温度传感器对时序的
16、要求十分严格, 延时大多是us级的, 因此该子程序中的延时程序需要区别于LCD显示的延时程序。只要严格按照时序图写程序, DS18B20即可运行。DS18B20温度采集程序间附件一。6、 PID计算和继电器控制程序 前面已经提到PID是一种线性控制器, 因此本系统PID控制的思路是在第一次PID调节时记下PID调节器的输出值uk0( 该值为以后PID调节器输出地最大值) ,并以该值为参考, 以后的输出uk与uk0做比值, 假设uk0表示加热a, 那么输出uk与uk0比值表示加热a*uk/uk0时间, 以此类推, 最后算出每次计算应该加热的时间作用于继电器, 控制加热管加热。由于温度变化缓慢,
17、则设置为5s计算PID一次。另外本系统的PID采用了开关量计算积分分离相结合的改进PID算法, 具体思路是当温差大于等于15度时不用PID直接进行开关控制。当温度在0-15度之间时才采用PID计算。 具体程序如下: ( 1) PID计算void PID(void) float ek,ek1,ek2,ek_sum; uint a; ek=K-temp; /计算误差 while(1) if(ON_OFF=1) /温控开关开 if(ek=15) outflag=1;OUT=0;Time_on=100;break; /温差大于15度, 不用PID调节 else if(ek5) a=0;if(ekTim
18、e_on) /模拟迟滞 OUT=1; outflag=0; if(TIM=100) /5s进行一次PID计算 PID(); TIM=0; 7、 附加时间显示程序考虑到实际的温度控制系统如果加上显示时间的功能能够获得更好的应用, 故在此系统中加上了显示时间的功能。主要是运用了AT89C52的定时器的功能, 每50ms中断一次, 进行时间的设置。时间显示程序见附件一。六、 MATLAB/SIMULINK仿真部分1、 理论分析由于经过PID后计算出的控制量控制每次加热棒的加热时间, 即对应所提供的热量。因此主要计算被测温度与供热之间的传递函数。设水温为T ,环境温度(干扰)为T0,供热量Q1=I2R
19、 Q2=KrA(T-T0)式中: Kr 为散热系数;A为散热面积。能量平衡式: Q1-Q2=GCpdTdt (1)式中: G为水的质量; CP 为水的比热。将Q2 代入式(1),整理得: GCpKrAdTdt+T=1KrAQ1+T0 (2)设Tc=GCpKrA为对象的供热时间常数, K1=1KrA为对象的供热比例系数,则对象特性的微分方程为 TcdTdt+T=K1Q1+T0 (3)式(3)表明了对象温度与供热能量及环境温度的关系, 式中T、 T0 为变量。T0 为不变量,则式(3)变为 TcdTdt+T=K1Q1 (4)对式(4)作拉氏变换, 推出被测温度与供热之间的传递函数为W1S=TSQ1
20、S=K11+Tcs (5)由式(5)可知,环节为一阶惯性环节。2、 具体传递函数计算由上面的分析能够看出, 传递函数的计算主要在于, K1=1KrA和Tc=GCpKrA参数的计算。由于Kr( 单位: W/(m2K) 散热系数计算很复杂, 且更多用于大面积水域散热计算, 对我们这次实验意义不大, 因此我将散热系数换为由水本身性质决定的导热系数(单位: W/(mK), 因此KrA换为d, d为水层宽度。查书可得20C时水的导热系数为5.99 W/(mK), 假设水杯内水的高度和宽度约等于12cm, 杯内水质量G约为100g, 水比热Cp为4.2*103J/kg。由此可算出K1=13.9, Tc=5
21、843.05。因此得被测温度与供热之间的传递函数W1S=13.91+5843.05s所用加热棒为150W, 经过PID算法后所得的为一个周期内加热的时间, 设一周期为5秒, 有100个可控高低电平, 故在PID环节之后需乘系数150W*1s100*5=3/10而加热棒加热需要一定时间, 故增加滞后环节。也就是一般所说温度控制被控对象为纯滞后环节G=Ke-sTs+1取延时为5s, 因此最终得到被控对象传递函数: G=310*13.9e-5s5843.05s+13、 SIMULINK仿真由上面计算的传函可得simulink仿真采用试凑法, 先只加入P环节: P=10,I=0,D=0调节时间很长,在
22、1000s以上, 故增大P。P=20,I=0,D=0快速性得到很大改进, 再增大P。P=40,I=0,D=0虽然快速性得到改进, 但出现了较大超调, 经过多次尝试。P=32,I=0,D=0时效果最好此时有1%的稳态误差, 故尝试加入I环节。P=32,I=1,D=0效果很差, 问题出在一开始系统输入的温度差值很大, 导致积分项很大, 积分饱和, 因此会产生很难稳定的现象, 因此减小I。P=32,I=0.01,D=0效果较好, 稳态误差基本消失, 但此时的积分环节作用已经很小。在实际制作中可采取抗饱和积分, 变速积分等方法去掉这个问题。后面matlab仿真部分将对抗饱和积分做更多介绍。后来我继续尝
23、试加入微分控制, 可是没有获得更好的效果, 因此选择PI调节。4、 MATLAB仿真matlab仿真采用了抗饱和积分法, 当系统存在一个方向的误差时, 由于积分的累加作用会使控制量一直增大, 可能会使控制量达到执行器的执行阈值, 如果此时误差的方向发生改变, 控制量会逐渐减小, 控制量也会退出饱和区, 执行器也会在阈值内执行; 如果此时误差方向还是没有改变, 控制量会继续增大可是执行器会一直保持在阈值, 此时控制量就进入了饱和区。进入饱和区越深, 退出饱和区时间就会越长, 在饱和区时执行器会一直在阈值位置, 如果误差发生反向, 执行器不会马上有反应, 控制量会慢慢减小, 等执行器推出饱和区才会
24、有反应。这样就会使控制的动态响应变差, 控制性能变差。抗积分饱和算法的思路为, 在计算u(k)时, 首先判断u(k-1)是否超出范围, 若u(k-1)Umax, 则只累加负的误差; 若u(k-1)=um if error(k)0 alpha=0; else alpha=1; endelseif u(k)0 alpha=1; else alpha=0; endelse alpha=1;end alpha为积分项的系数, 为1时则累加积分项, 为0时不累加。传递函数还用之前计算结果, kp=32;ki=0;kd=0.0上图为温度的输出结果, 中图为控制量, 下图为积分项。可看出与simulink仿
25、真基本一致, 为看出抗饱和积分的效果因此将积分项加大kp=32;ki=5;kd=0.0未加入抗饱和积分 kp=32; ki=5; kd=0.0加入抗饱和积分后可看出加入抗饱和积分后超调量明显下降, 抗饱和积分能够使系统稳定性得到改进。.m源程序: %PID Controler with intergration sturationclear all;close all;ts=1;sys=tf(41.7,58430.5,10,inputdelay,20);dsys=c2d(sys,ts,z);num,den=tfdata(dsys,v);u_1=0.0;u_2=0.0;u_3=0.0;y_1=0
26、;y_2=0;y_3=0;x=0,0,0;error_1=0;um=1000;kp=32;ki=5;kd=0.0; rin=30; %Step Signalfor k=1:1:600time(k)=k*ts;u(k)=kp*x(1)+kd*x(2)+ki*x(3); % PID Controllerif u(k)=um u(k)=um;endif u(k)=um if error(k)0 alpha=0; else alpha=1; endelseif u(k)0 alpha=1; else alpha=0; endelse alpha=1;end elseif M=2 %Not using
27、intergration sturation alpha=1; end%Return of PID parametersu_3=u_2;u_2=u_1;u_1=u(k); y_3=y_2;y_2=y_1;y_1=yout(k);error_1=error(k);x(1)=error(k); % Calculating Px(2)=(error(k)-error_1)/ts; % Calculating Dx(3)=x(3)+alpha*error(k)*ts; % Calculating Ixi(k)=x(3);endfigure(1);subplot(311);plot(time,rin,b
28、,time,yout,r);xlabel(time(s);ylabel(Tempereture tracking);subplot(312);plot(time,u,r);xlabel(time(s);ylabel(Controller output);subplot(313);plot(time,xi,r);xlabel(time(s);ylabel(Integration);七、 PROTEUS仿真部分系统整体仿真图如图13所示 图13 水温控制系统整体proteus仿真图图14 系统开启电源仿真图八、 结论及心得体会1、 实验结论由以上的实验数据和实验对比分析能够得到PID各个环节的作用
29、: 比例系数KP决定控制作用的强弱, KP加大时可减少系统的稳态误差, 提高系统的动态响应速度, 但KP过大会引起振荡或导致系统不稳定。积分项Ki/S用于消除系统的稳态误差, 但积分项会使动态过程变慢, 增大系统的超调量, 使系统的稳定性变坏。微分KdS的控制作用与偏差的变化速度有关。微分能产生超前的校正作用, 有助于减少超调和振荡, 并能减少调整时间, 从而改进系统的动态性能。在实验过程中, 用的是试凑法进行PID参数整定。经过实验大概体验出试凑法进行PID参数整定的步骤, 如下: (1)首先只整定比例部分。比例系数KP由小变大, 观察相应的系统响应, 直到得到反应快, 超调小的响应曲线。系
30、统若无稳态误差或稳态误差已小到允许范围内, 而且响应效果良好, 那么只须用比例调节器即可。(2)若稳态误差不能满足设计要求, 则需加入积分控制。整定时先置积分时间Ti为一较大值, 并将经第1步整定得到的KP减小些, 然后减小Ti, 并使系统在保持良好动态响应的情况下, 消除稳态误差。这种调整可根据响应曲线的状态, 重复改变KP及Ti, 以期得到满意的控制过程。(3)若使用PI调节器消除了稳态误差, 但动态过程仍不能满意, 则可加入微分环节。在第2步整定的基础上, 逐步增大TD, 同时相应地改变KP和Ti, 逐步试凑以获得满意的调节效果。2、 心得体会本次历时近两周的计算机控制课程设计即将画上圆
31、满的句号。从最开始的选题, 原来想选择的是小型无人直升机飞行高度的控制系统设计, 查阅了大量资料, 可是最终因为对直升机模型的不熟悉, 很难进行系统建模分析及仿真, 无奈放弃。最终我选择的是与我们生活非常接近的水温自动控制系统。从确定课题到查阅大量相关资料, 第一次发现自己的所学能有所用, 能够在生活实际中解决问题, 让我兴奋不已。硬件的设计问题并不多, 因为上学期学过单片机课程, 因此整个过程比较顺利。其次是软件系统的搭建, 在编写程序时, 一些子模块都是在网上找的现成的, 为此省去了不少时间和精力。MATLAB的仿真时比较得心应手的, 因为之前的许多课程都是用的MATLAB或者MULTIS
32、IM进行仿真实验的, 自动化专业实验也进行过PID的参数整定, 因此也比较顺利。PROTEUS是我新掌握的一个软件, 对它的学习花去近两天的学习时间, 然后我利用PROTEUS进行了电路的搭接仿真, 可能是没有实物的操作, 仿真结果不是十分正确, 只进行了简单搭接和电源开启检查了一下能否正常工作。最后由于时间有限, 不能进行硬件的焊接调试, 做出实物, 将理论带入实践中去, 是比较遗憾的。总的来说经过这次课程设计我收获到了很多东西, 软件、 硬件、 甚至是对电子课程设计信心倍增, 虽然期间遇到各种问题, 可是最后经过自己的努力都能够解决, 不但提高了自己的技能, 也看到了自己的不足, 这次课程
33、设计定让我进入了电子设计的新阶段。最后, 感谢老师和同学在此次计算机课程设计中给我的帮助。八、 参考文献过程控制系统, 黄德先、 王京春、 金以慧编著, 清华大学出版社。计算机控制系统, 高金源、 夏洁编著, 清华大学出版社。检测原理, 施文康、 余晓芬主编, 机械工业出版社。单片机原理与应用, 戴胜华、 蒋大明主编, 北京交通大学出版社。数字电子技术基础, 侯建军主编, 高等教育出版社。自动控制原理, 蒋大明、 戴胜华主编, 北京交通大学出版社。附件一: 恒温箱控制系统源程序#include#include /空操作_nop_ 头文件#define uchar unsigned char#d
34、efine uint unsigned int#define BUSY 0x80 /lcd忙检测标志#define DATAPORT P0 /定义P0口为LCD通讯端口sbit BUZZER=P34;sbit P1_0=P10; /时钟调整 P0口sbit P1_1=P11; /时钟加 P1口sbit P1_2=P12; /时钟减 P2口sbit led1=P32;sbit led2=P33;sbit DQ = P36; /定义ds18b20通信端口 sbit LCM_RS=P20;/数据/命令端sbit LCM_RW=P21;/读/写选择端sbit LCM_EN=P22; /LCD使能信号s
35、bit OUT=P37;/光耦、 继电器驱动信号uchar seconde=0; /定义并初始化时钟变量uchar minite=0;uchar hour=12;uchar mstcnt=0; /时间计时中断变量uchar idata value2; /存储键盘输入值uchar buff,times,j; /用来处理按键值的全局变量uchar temp1,temp2,temp; /温度显示变量 temp1为整数部分, temp2为小数部分, temp为实际温度uchar set; /定义全局变量 set为工作模式选择float K; /设定的温度bit ON_OFF=0; /加热键控制总开关b
36、it outflag; /温控标志, 为1时表示加热, LCD上用|表示; 为0时表示不加热, LCD上用表示unsigned int TIM; /PID计时中断变量bit start_flag=0; / 开始PID运算标志位bit start_key=0; /设置软件输入设定初值标志位float div,kp=1.5,kd=1;/用于PID计算的变量float ki=0.01;float uk,uk0;uint Time_on;/控制加热片加热时间uchar code str0=- : : - ;/显示字符串uchar code str1=SET: C TP: . C;uchar code
37、digit= ; /显示键值void delay_LCM(uint); /LCD延时子程序void initLCM( void); /LCD初始化子程序void lcd_wait(void); /LCD检测忙子程序void WriteCommandLCM(uchar WCLCM,uchar BusyC); /写指令到LCD子函数void WriteDataLCM(uchar WDLCM); /写数据到LCD子函数void DisplayOneChar(uchar X,uchar Y,uchar DData); /显示指定坐标的一个字符子函数void DisplayListChar(uchar X,uchar Y,uchar code *DData); /显示指定坐标的一串字符子函数void init_timer0(void); /定时器初始化void displayfun1(void); /显示模式子函数void displayfun2(void);void displayfun3(void);void keyscan(void ); /键盘扫描子程序void keydown(void) ; /判断按键按下子程序void set_adj(void);/设定工作模式子程序void inc_key(void); /时钟加子程序v