51温度PID调节实验报告
pid控制实验报告

pid控制实验报告实验报告:PID控制一、实验目的通过本实验,我们的目的是深入了解PID(比例、积分、微分)控制算法,理解其在实际控制中的应用,掌握PID参数的调整方法。
二、实验原理PID控制是依据被控对象的误差(偏差)与时间的积分、微分关系来确定控制器输出的控制方式。
具体来说,PID控制器输出的控制量=Kp*(当前误差+上次误差*dt+所有误差的积分),其中Kp、Ki和Kd分别为比例系数、积分系数和微分系数。
它通过对偏差的补偿,使得被控对象能够在振荡绕过设定值、稳定达到设定值的过程中快速、准确定位设定值。
三、实验设备本实验采用的设备为PID控制器、液晶显示屏、电压控制电机和传感器。
四、实验步骤1. 首先,我们需要将系统设为手动调节状态,关闭控制器。
2. 然后,我们将传感器和记录仪建立起连接。
3. 将系统调整为自动控制状态,让控制器自行计算控制量、作出相应控制。
4. 调整PID控制器的Kp系数,以调整控制精度。
5. 调整PID控制器的Ki系数,以调整控制的灵敏度。
6. 调整PID控制器的Kd系数,以调整控制器的稳定性。
7. 最终完成调整后,我们可以用振荡器数据展示出来实验结果。
五、实验结果在完成调整后,我们得出的控制器输出的控制量稳定在理论值附近,在控制精度与控制的灵敏度达到较好平衡的情况下,控制器的稳定性得到了保证。
实验结果具有较好指导意义。
六、结论本实验通过掌握PID控制算法的实际应用方法,以及对参数的合理设置为基础,完成了对PID控制器各参数调整技巧的掌握,极大地丰富了实验基础技能。
同时,实验结果为之后的实际应用提供了参考,有着极其重要的现实意义。
pid实验报告

pid实验报告PID实验报告引言:PID控制器是一种常用的自动控制器,它通过调整输出信号来使被控对象的实际值与期望值尽可能接近。
在本次实验中,我们将通过设计一个PID控制器来控制一个温度系统,以验证PID控制器的性能和效果。
实验目的:1. 理解PID控制器的原理和工作方式;2. 掌握PID控制器的参数调节方法;3. 验证PID控制器在温度控制系统中的应用效果。
实验装置:1. 温度传感器:用于测量被控对象的温度;2. 控制器:采用PID控制算法,根据测量值和设定值计算控制信号;3. 加热器:根据控制信号调节加热功率;4. 温度系统:被控对象,通过加热器调节温度。
实验步骤:1. 搭建实验装置:将温度传感器放置在温度系统中,连接到控制器的输入端;将控制器的输出端连接到加热器;2. 参数调节:根据实际情况,初步设定PID控制器的参数,包括比例系数Kp、积分时间Ti和微分时间Td;3. 实验运行:设置温度设定值,观察温度系统的响应,并记录数据;4. 参数优化:根据实验结果,调整PID控制器的参数,使温度系统的响应更加稳定和准确;5. 重复实验:反复进行参数调节和实验运行,直到达到满意的控制效果。
实验结果:通过多次实验和参数调节,我们得到了一个较为理想的PID控制器参数设置,使温度系统的响应速度较快且稳定。
实验结果表明,PID控制器能够有效地控制温度系统,使其实际温度与设定值之间的误差保持在可接受范围内。
讨论与分析:1. 比例系数Kp的调节:较大的Kp值会使系统响应速度快,但可能导致系统震荡;较小的Kp值则会使系统的稳定性提高,但响应速度较慢。
因此,在实际应用中需要根据具体要求进行调节。
2. 积分时间Ti的调节:较大的Ti值可以减小系统的稳态误差,但可能导致系统响应速度变慢和超调现象;较小的Ti值则会使系统的响应速度提高,但可能导致稳态误差增大。
因此,需要在稳态误差和响应速度之间进行权衡。
3. 微分时间Td的调节:较大的Td值可以提高系统的稳定性,减小超调现象,但可能导致系统响应速度变慢;较小的Td值则会使系统的响应速度提高,但可能导致系统震荡。
基于51单片机的水温测控系统实验报告

duty_tem=0;
if(duty_tem>=100)
duty_tem=100;
duty=floor(duty_tem)/2;//u最大值为50
if(duty_tem<0) pout=1;
else pout=0;
return (pout);
}
///////////////////////
uchar num2[13]={0x4E,0x4F,0x57,0x54,0x3A,0,0,0,0x2E,0,0xDF,0x43};
unsigned int settemp=500,nowtemp;
unsigned char timecount=0;
bit adflag,showflag; //ad标志位
{
while(XBYTE[0xa001]&0x80);//等待可写
XBYTE[0xa002]=(data1);//向数据端口写入数据
}
void writeString(uchar data1[],int len)
{
int k=0;
for(k=0;k<len;k++)//写入字符串
writeData(data1[k]);
摘要
本次实验是软硬件相结合的实验,通过传感器得到的阻值与其它电阻,可以搭建一个电桥,将水温转化为电压,然后通过放大器将电压放大到所需要的值,将所得的电压送入单片机的AD转换电路,将模拟信号转换成数字信号,从而在单片机的液晶屏上显示当前的温度。此烧水壶是可控制的,即设定温度,使水加热到设定温度且保温,此控制算法采用PID控制算法来控制继电器的通断,来保证水温恒定在设定温度处。
}
PID实验报告范文

PID实验报告范文PID(Proportional-Integral-Derivative)是一种常用于控制系统的算法,它根据当前的误差值和历史误差值的积累来调整控制量,从而实现系统的稳定性和精确性。
在本次实验中,我们将学习如何使用PID算法来控制一个简单的温度控制系统。
实验步骤:1.实验准备:准备一个温度传感器、一个发热器以及一个温度控制器。
将温度传感器安装在控制对象上,将发热器与温度控制器连接,并将温度控制器连接到计算机。
2.确定控制目标:我们的目标是将系统的温度稳定在一个特定的温度值。
在本次实验中,我们将目标温度设定为50°C。
3.参数调整:调整PID控制器的三个参数,即比例系数Kp、积分系数Ki和微分系数Kd。
开始时,我们可以将这些参数设置为一个合理的初始值,例如Kp=1,Ki=0.1,Kd=0.014.实验记录:记录系统的温度变化过程。
在开始实验之前,将控制对象的温度设定为初始温度,并将PID控制器的输出设定为零。
记录系统的温度、控制量和误差值。
5.PID计算:根据当前的误差值、历史误差值和时间间隔,计算PID控制器的输出。
6.控制实施:根据PID控制器的输出,控制发热器的加热功率。
根据输出值的大小调整发热器的功率大小。
7.实验分析:观察系统的温度变化过程,并分析PID控制器的参数调整对系统性能的影响。
根据实验结果,调整PID参数,使系统的稳态和动态响应性能都较好。
实验结果:我们进行了多组实验,可以观察到系统温度在初始阶段有较大的波动,但随着时间的推移,温度开始逐渐稳定在目标温度附近。
通过对PID参数进行调整,我们发现参数的选择对系统的稳定性和响应速度有很大影响。
当比例系数Kp较大时,系统对误差的响应速度很快,但也容易引起过冲现象,导致系统产生振荡。
因此,我们需要根据实际需求进行调整,找到一个合适的值。
当积分系数Ki较大时,系统对积累误差的反应较快,可以很好地消除稳态误差,但也容易引起系统的超调。
pid控制实验报告

pid控制实验报告PID控制实验报告引言PID控制是一种常用的控制算法,广泛应用于工业自动化系统中。
本实验旨在通过实际的PID控制实验,验证PID控制算法的效果和优势,并对PID控制的原理、参数调节方法等进行探讨和分析。
一、实验目的本次实验的目的是通过一个简单的温度控制系统,使用PID控制算法来实现温度的稳定控制。
通过实验,验证PID控制算法的有效性和优越性,掌握PID控制的基本原理和参数调节方法。
二、实验设备和原理本实验所用的设备为一个温度控制系统,包括一个温度传感器、一个加热器和一个控制器。
温度传感器用于实时检测环境温度,加热器用于调节环境温度,控制器用于实现PID控制算法。
PID控制算法是基于误差的反馈控制算法,其主要原理是通过不断地调整控制器的输出信号,使得系统的实际输出与期望输出之间的误差最小化。
PID控制算法由比例控制、积分控制和微分控制三部分组成。
比例控制通过比例系数调整控制器的输出信号与误差的线性关系;积分控制通过积分系数调整控制器的输出信号与误差的积分关系;微分控制通过微分系数调整控制器的输出信号与误差的微分关系。
通过合理调节这三个系数,可以实现对系统的精确控制。
三、实验步骤1. 搭建温度控制系统:将温度传感器、加热器和控制器连接在一起,确保信号传输的正常。
2. 设置期望温度:根据实验要求,设置一个期望的温度作为控制目标。
3. 调节PID参数:根据实验的具体要求和系统的特性,调节PID控制器的比例系数、积分系数和微分系数,使得系统的响应速度和稳定性达到最佳状态。
4. 开始实验:启动温度控制系统,观察实际温度与期望温度的变化情况,记录实验数据。
5. 数据分析:根据实验数据,分析PID控制算法的效果和优势,总结实验结果。
四、实验结果与讨论通过实验,我们得到了一系列的实验数据。
根据这些数据,我们可以进行进一步的分析和讨论。
首先,我们观察到在PID控制下,温度的稳定性得到了显著的提高。
PID自控原理实验报告范文pid调节实验报告范文

PID自控原理实验报告范文pid调节实验报告范文自动控制原理实验——第七次实验实验目的了解数字PID控制的特点,控制方式。
理解和掌握连续控制系统的PID控制算法表达式。
了解和掌握用试验箱进行数字PID控制过程。
观察和分析在标PID控制系统中,PID参数对系统性能的影响。
实验内容1、数字PID控制一个控制系统中采用比例积分和微分控制方式控制,称之为PID控制。
数字PID控制器原理简单,使用方便适应性强,可用于多种工业控制,鲁棒性强。
可以用硬件实现,也可以用软件实现,也可以用如见硬件结合的形式实现。
PID控制常见的是一种负反馈控制,在反馈控制系统中,自动调节器和被控对象构成一个闭合回路。
模拟PID控制框图如下:U(s)U(s)E(s)KpKiKd输出传递函数形式:其中Kp为调节器的比例系数,Ti为调节器的积分常数,Td是调节器的微分常数。
2、被控对象数学模型的建立1)建立模型结构在工程中遇到的实际对象大多可以表示为带时延的一阶或二价惯性环节,故PID整定的方法多从这样的系统入手,考虑有时延的单容被控过程,其传递函数为:这样的有时延的单容被控过程可以用两个惯性环节串联组成的自平衡双容被控过程来近似,本实验采用该方式作为实验被控对象,如图3-127所示。
2)被控对象参数的确认对于这种用两个惯性环节串联组成的自平衡双容被控过程的被控对象,在工程中普遍采用单位阶跃输入实验辨识的方法确认和τ,以达到转换成有时延的单容被控过程的目的。
单位阶跃输入实验辨识的原理方框如图3-127所示。
对于不同的T1、T2和K值,得到其单位阶跃输入响应曲线后,由和得到和,再利用拉氏反变换公式得到To=To=t2-t1Ln1-Yoτ=t2Ln1-Yot13、采样周期的选择采样周期选择0.05s。
4、数字PID调节器控制参数的工程整定方法虽然PID调节可全面、综合的考虑系统的各项性能,但在工程实际中,考虑到工程造价和调节器的易于实现,长采用PID三个参数来对系统进行校正。
PID温度控制实验

PID 温度控制实验PID(ProportionalIntegralDerivative)控制是最早发展起来的控制策略之一,它根据系统的误差,利用比例、积分、微分计算出控制量对系统进行控制。
当我们不彻底了解一个系统和被控对象,或者不能通过有效的测量手段来获得系统参数时,最适合用 PID 控制技术。
由于其算法简单、鲁棒性好和可靠性高,被广泛应用于工业过程控制。
PID 调节控制是一个传统控制方法,它合用于温度、压力、流量、液位等几乎所有现场,不同的现场,仅仅是 PID 参数应设置不同,只要参数设置得当均可以达到很好的效果。
本实验以 PID 温度控制为例,通过此实验可以加深对检测技术、自动控制技术、过程控制等专业知识的理解。
2、掌握正校实验的方法,并用正交实验法来确定最佳 P、I、D 参数3、会求根据温度变化曲线求出相应的超调量、稳态误差和调节时间的方法二、仪器与用具加热装置、加热控制模块、单片机控制及显示模块、配套软件、电脑。
三、实验原理1、数字 PID 控制原理数字 PID 算法是用差分方程近似实现的,用微分方程表示的 PID 调节规律的理想算式为:1de(t)u(t)KP[e(t)e(t)dtTD] (1)TI0dt 单片机只能处理数字信号,上式可等价于:tTUnKP[enTIeii0nTD(enen1)] (2) TTTenD(en2en1en2)] (3) TIT (2) 式为位置式 PID 算法公式。
也可把(2)式写成增量式 PID 算法形式: UnUnUn1KP[enen1 其中,en 为第 n 次采样的偏差量; en-1 为第 n-1 次采样的偏差量; T 为采样周期; TI 为积分时间;TD 为微分时间; KP 为比例系数。
2、PID 温度控制的框图设定温度(SV)温度偏差(EV)(EV=SV-PV)PID 调节器按周期调节脉冲宽度输出加热装置实际温度(PV)图 1PID 温度控制的框图温度 PID 控制是一个反馈调节的过程:比较实际温度(PV)和设定温度(SV)的偏差,偏差值经过 PID 调节器运算来获得控制信号,由该信号控制加热丝的加热时间,达到控制加热功率的目的,从而实现对系统的温度控制。
51温度PID调节实验报告

成绩:重庆邮电大学自动化学院综合实验报告题目:51系列单片机闭环温度控制实验学生姓名:***班级:0811103学号:**********同组人员:黄酉指导教师:***完成时间:2014年12月一、实验要求及分工情况51系列单片机闭环温度控制实验——基于Protuse仿真实验平台实现要求:1. 设计硬件电路:温度检测:采用热电偶或热电阻温度给定:采用电位器进行模拟电压给定,0——5VAD转采用12位转换显示采用8位LED,或者LCD1602显示键盘4X4,PID等参数通过键盘设置。
2. 软件控制算法:数字PID,参数在线修改。
显示窗口:显示温度的设置值SV、温度的实际值PV。
实际温度值,温度峰值、峰值时间等通过串口上传到上位机(选做)具体分工:黄酉负责系统设计思想导向与编程;霍栋博负责辅助编程与编写报告与Proteus仿真。
二、实验内容(实验原理介绍)1、电路的总体工作原理温度控制系统采用AT89S51八位机作为微处理单元进行控制。
采用4X4键盘把设定温度的最高值和最低值存入单片机的数据存储器,还可以通过键盘完成温度检测功能的转换。
温度传感器把采集的信号与单片机里的数据相比较来控制温度控制器。
机AT89S51为测控系统的核心来完成数据采集、处理、显示、报警等功能。
选用数字温度传感器DS18B20,省却了采样/保持电路、运放、数/模转换电路以及进行长距离传输时的串/并转换电路,简化了电路,缩短了系统的工作时间,降低了系统的硬件成本。
该系统的总体设计思路如下:温度传感器DS18B20把所测得的温度发送到AT89S51单片机上,经过51单片机处理,将把温度在显示电路上显示,本系统显示器为点阵字符LCD,1602液晶模块。
检测范围5摄氏度到60摄氏度。
本系统除了显示温度以外还可以设置一个温度值,对所测温度进行监控,当温度高于或低于设定温度时,开始报警并启动相应程序(温度高于设定温度时,风扇开;当温度低于设定温度时,加热器开)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
成绩:重庆邮电大学自动化学院综合实验报告题目:51系列单片机闭环温度控制实验学生姓名:***班级:0811103学号:**********同组人员:黄酉指导教师:***完成时间:2014年12月一、实验要求及分工情况51系列单片机闭环温度控制实验——基于Protuse仿真实验平台实现要求:1. 设计硬件电路:温度检测:采用热电偶或热电阻温度给定:采用电位器进行模拟电压给定,0——5VAD转采用12位转换显示采用8位LED,或者LCD1602显示键盘4X4,PID等参数通过键盘设置。
2. 软件控制算法:数字PID,参数在线修改。
显示窗口:显示温度的设置值SV、温度的实际值PV。
实际温度值,温度峰值、峰值时间等通过串口上传到上位机(选做)具体分工:黄酉负责系统设计思想导向与编程;霍栋博负责辅助编程与编写报告与Proteus仿真。
二、实验内容(实验原理介绍)1、电路的总体工作原理温度控制系统采用AT89S51八位机作为微处理单元进行控制。
采用4X4键盘把设定温度的最高值和最低值存入单片机的数据存储器,还可以通过键盘完成温度检测功能的转换。
温度传感器把采集的信号与单片机里的数据相比较来控制温度控制器。
机AT89S51为测控系统的核心来完成数据采集、处理、显示、报警等功能。
选用数字温度传感器DS18B20,省却了采样/保持电路、运放、数/模转换电路以及进行长距离传输时的串/并转换电路,简化了电路,缩短了系统的工作时间,降低了系统的硬件成本。
该系统的总体设计思路如下:温度传感器DS18B20把所测得的温度发送到AT89S51单片机上,经过51单片机处理,将把温度在显示电路上显示,本系统显示器为点阵字符LCD,1602液晶模块。
检测范围5摄氏度到60摄氏度。
本系统除了显示温度以外还可以设置一个温度值,对所测温度进行监控,当温度高于或低于设定温度时,开始报警并启动相应程序(温度高于设定温度时,风扇开;当温度低于设定温度时,加热器开)。
2、PID算法的数字实现本次试验通过8031通过OVEN 是模拟加热的装置,加一定的电压便开始不停的升温,直到电压要消失则开始降温。
仿真时,U形加热器为红色时表示正在加热,发红时将直流电压放过来接,就会制冷,变绿。
T端输出的是电压,温度越高,电压就越高。
8031对温度的控制是通过可控硅调控实现的。
可控硅通过时间可以通过可控硅控制板上控制脉冲控制。
该触发脉冲想8031用软件在P1.3引脚上产生,受过零同步脉冲后经光偶管和驱动器输送到可控硅的控制级上。
偏差控制原理是要求对所需温度求出偏差值,然后对偏差值处理而获得控制信号去调节加热装置的温度。
PID控制方程式:式中e是指测量值与给定值之间的偏差TD 微分时间T 积分时间KP 调节器的放大系数将上式离散化得到数字PID位置式算法,式中在位置算法的基础之上得到数字PID增量式算法:3、系统的硬件设计3.1 单片机最小系统的设计目前的单片机开发系统只能够仿真单片机,却没有给用户提供一个通用的最小系统。
由设计的要求,只要做很小集成度的最小系统应用在一些小的控制单元。
其应用特点是:(1)全部I/O口线均可供用户使用。
(2)内部存储器容量有限(只有4KB地址空间)。
(3)应用系统开发具有特殊性图 3.1 最小系统图单片机最小系统如图3.1所示,其中有4个双向的8位并行I/O端口,分别记作P0、P1、P2、P3,都可以用于数据的输出和输入,P3口具有第二功能为系统提供一些控制信号。
3.2键盘电路的设计用AT89C51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;液晶显示器上显示每个按键的“0-F”序号。
对应的按键的序号排列如图3.5图3.4中微处理单元是AT89C51单片机,X1和X2接12M的两脚晶振,接两个30PF的起振电容,J1是上拉电阻.单片机的P1口8位引脚与行列式键盘输出脚相连,控制和检测行列式键盘的输入.行线通过上拉电阻接到+5V上,无按键按下时,行线处于高电平状态,有键按下时,行线的电平状态将由与此行线相连接的列线的电平决定.键盘输入的信息主要进程是:1 CPU判断是否有键按下.2 确定是按下的是哪个键.3 把此键所代表的信息翻译成计算机可以识别的代码或者其他的特征符号.图 3.4 键盘硬件电路图3.3显示电路的设计液晶显示器是一种将液晶显示器件,连接器件,集成电路,PCB线路板,背光源,结构器件装配在一起的组件。
根据显示内容和方式的不同可以分为,数显LCD,点阵字符LCD,点阵图形LCD在此设计中我们采用点阵字符LCD,这里采用常用的2行16个字的1602液晶模块。
1602采用标准的14脚接口,其中:第1脚:VSS为地电源第2脚:VDD接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15~16脚:空脚。
与单片机的连接如图3.7所示。
图 3.5 液晶显示电路图:3、电路原理图仿真结果:附录#include"reg51.h"#define uchar unsigned char#define uint unsigned int#define ulong unsigned long/*****************引脚定义*********************************/ sbit output=P2^5;/********************************/ sbit CLOCK=P3^1;sbit D_IN=P2^7;sbit D_OUT=P2^6;sbit _CS=P3^0;/********************************/ sbit lcdrs=P2^0;sbit lcdrw=P2^1;sbit lcden=P2^2;/********************************/ sbit in1=P2^3;sbit in2=P2^4;/********************************/ sbit led=P3^2;sbit speaker=P3^3;/*****************引脚定义*********************************//*****************变量定义(申明)*********************************/int freq=500,pwm=0;uchar setflag=0,pageflag=0,ok=0;float pwm_temp=0;float KP=100,KI=10,KD=0;uint pul_count=0;float ek=0,ek1=0,ek2=0;uchar code str[16]=" welcome! "; uchar code str1[16]=" temperature PID"; uchar code str2[16]="set-T pra-T " ; uchar code str3[16]="P: I: D:" ; uchar code str4[16]="set-P: " ; uchar code str5[16]="set-I: " ;uchar code str6[16]="set-D: " ;void Init(void); uint adcread(uchar port);void delay(uint n);void writecom(uchar com);void writedata(uchar date);void initlcd();float keyscan(void);uchar keyscans(void);void lcdnumdisplay(uchar pos,double f); void lcdnumdisplays(uchar pos,double f); uint read_pul();void mypid(float Kp,float Ki,float Kd,uint count,uint point);/*****************变量定义(申明)*********************************/void main(){uchar i;float scantemp;float adnum0=0;float adnum1=0;bit init0,init1,init2,init3,init4;Init();initlcd();writecom(0x80);for(i=0;i<16;i++)writedata(str[i]);//huanyinwritecom(0x80+0x40);for(i=0;i<16;i++)writedata(str1[i]);//shumingdelay(200);while(1){pwm_temp=500*(float)(adnum0)/4095;//pwm=pwm_temp;mypid(KP,KI,KD,adnum1,pwm_temp);scantemp=keyscan();if(adnum1>=pwm_temp-1.5&&adnum1<=pw m_temp+1.5){led=0;speaker=1;}else{led=1;speaker=0;}if(setflag==0){adnum0=adcread(0);adnum1=adcread(1)/10;if(init0==0){initlcd();writecom(0x80);for(i=0;i<16;i++)writedata(str2[i]);//shuminginit0=1;init1=0;init2=0;init3=0;init4=0;}lcdnumdisplays(0x80+0x40,(float)pwm_temp);//pwm_templcdnumdisplays(0x80+0x4a,(float)adnum1);}if(setflag!=0&&pageflag==0){if(init1==0){initlcd();writecom(0x80);for(i=0;i<16;i++)writedata(str3[i]);//PIDinit0=0;init1=1;init2=0;init3=0;init4=0;}lcdnumdisplays(0x80+0x40,KP);lcdnumdisplays(0x80+0x46,KI);lcdnumdisplays(0x80+0x4D,KD);}if(setflag!=0&&pageflag==1){if(init2==0){initlcd();writecom(0x80);for(i=0;i<16;i++)writedata(str4[i]);//Pinit0=0;init1=0;init2=1;init3=0;init4=0;}lcdnumdisplays(0x80+0x40,scantemp);if(ok==1)KP=scantemp;}if(setflag!=0&&pageflag==2){if(init3==0){initlcd();writecom(0x80);for(i=0;i<16;i++)writedata(str5[i]);//iinit0=0;init1=0;init2=0;init3=1;init4=0;}lcdnumdisplays(0x80+0x40,scantemp);if(ok==1)KI=scantemp;}if(setflag!=0&&pageflag==3){if(init4==0){initlcd();writecom(0x80);for(i=0;i<16;i++)writedata(str6[i]);//dinit0=0;init1=0;init2=0;init3=0;init4=1;}lcdnumdisplays(0x80+0x40,scantemp);if(ok==1)KD=scantemp;}}}void mypid(float Kp,float Ki,float Kd,uint count,uint point){static float Uk;ek=point-count;// if(ek>=5&&ek<=-5) //积分分离{Uk=Kp*(ek-ek1)+Ki*ek+Kd*(ek-2*ek1+ek2 );} //增量PID// else// Uk=Kp*ek;pwm=pwm+Uk;if(pwm>freq)pwm=freq;if(pwm<=0){pwm=0;in1=0;in2=1;}if(pwm>0) {in1=1;in2=0;}ek2=ek1;ek1=ek;}uint read_pul(){uint t1,th1,th2;uint val;while(1){th1=TH1;t1=TL1;th2=TH1;if(th1==th2)break;}val=th1*256+t1;return val;} void delay(uint n){uint i,j;for(i=n;i>0;i--)for(j=1;j>0;j--);}void Init(void)//初始化函数{TMOD=0x51;TH0=(65536-10)/256;TL0=(65536-10)%256;EA=1;ET0=1;TR0=1;//T1计数TH1=0;TL1=0;TR1=1;}void Timer_0(void) interrupt 1//中断函数{static ulong t_count=0;static uint num_count=0;TR0=0;TH0=(65536-10)/256;TL0=(65536-10)%256;TR0=1;num_count++;// t_count++;// if(t_count==2320)// {// t_count=0;// TR1=0;// pul_count=read_pul();// TH1=0;// TL1=0;// TR1=1;// }if(num_count>freq)num_count=0; //1khz;if(num_count<pwm)output=1;else output=0;}void writecom(uchar com) {lcdrs=0;P0=com;delay(1);lcden=1;delay(1);lcden=0;}void writedata(uchar date) {lcdrs=1;P0=date;delay(1);lcden=1;delay(1);lcden=0;}void initlcd(){lcdrw=0;writecom(0x38);delay(1);writecom(0x0c);delay(1);writecom(0x06);delay(1);writecom(0x01);delay(5); }uint adcread(uchar port){uint ad=0,i;CLOCK=0;_CS=0;port<<=4;for(i=0;i<12;i++){if(D_OUT) ad|=0x01;D_IN=(bit)(port&0x80); CLOCK=1;delay(1);CLOCK=0;delay(1);port<<=1;ad<<=1;}_CS=1;ad>>=1;return(ad);}void lcdnumdisplays(uchar pos,float f)//(0.001-99999) 精度低但方便数据更新{uchar i;writecom(pos);if(f>65535&&f<0.001)for(i=0;i<5;i++)writedata(0x23);//超出范围显示#elseif(f==0){writedata(0x30);for(i=0;i<4;i++)writ edata(0x20);}else{if((uint)f/10000!=0){writedata((uint)f/10000+0x30);writedata((uint)f%10000/1000+0x30);writedata((uint)f%1000/100+0x30);writedata((uint)f%100/10+0x30);writedata((uint)f%10+0x30);}else{if((uint)f/1000!=0){writedata(0+0x30);writedata((uint)f/1000+0x30);writedata((uint)f%1000/100+0x30);writedata((uint)f%100/10+0x30);writedata((uint)f%10+0x30);}else{if((uint)f/100!=0){writedata((uint)f/100+0x30);writedata((uint)f%100/10+0x30);writedata((uint)f%10+0x30);writedata(0x2e);writedata((uint)(f*10)%10+0x30);}else{if((uint)f/10!=0){writedata((uint)f/10+0x30);writedata((uint)f%10+0x30);writedata(0x2e);writedata((uint)(f*10)%10+0x30);writedata((uint)(f*100)%10+0x30);}else{writedata((uint)f%10+0x30);writedata(0x2e);writedata((uint)(f*10)%10+0x30);writedata((uint)(f*100)%10+0x30);writedata((uint)(f*1000)%10+0x30);}}}}}}void lcdnumdisplay(uchar pos,float f0) //(0.00001-99999.99999){uchar temp;ulong f;writecom(pos);f=(ulong)f0;temp=f/10000; //整数部分if(temp!=0){writedata(temp+0x30);writedata(f%10000/1000+0x30);writedata(f%1000/100+0x30);writedata(f%100/10+0x30);writedata(f%10+0x30);}else{temp=f%10000/1000;if(temp!=0){writedata(temp+0x30);writedata(f%1000/100+0x30);writedata(f%100/10+0x30);writedata(f%10+0x30);}else{temp=f%1000/100;if(temp!=0){writedata(temp+0x30);writedata(f%100/10+0x30);writedata(f%10+0x30);}else{temp=f%100/10;if(temp!=0){writedata(temp+0x30);writedata(f%10+0x30);}else{temp=f%10;if(temp!=0){writedata(temp+0x30);}elsewritedata(0+0x30);}}}}if((ulong)(f0*10)%10!=0||(ulong)(f0*100)%1 0!=0||(ulong)(f0*1000)%10!=0||(ulong)(f0*10 000)%10!=0) //小数部分{writedata(0x2e);temp=(ulong)(f0*10000)%10;if(temp!=0){writedata((ulong)(f0*10)%10+0x30); writedata((ulong)(f0*100)%10+0x30);writedata((ulong)(f0*1000)%10+0x30);writedata(temp+0x30);}else{temp=(ulong)(f0*1000)%10;if(temp!=0){writedata((ulong)(f0*10)%10+0x30);writedata((ulong)(f0*100)%10+0x30);writedata(temp+0x30);}else{temp=(ulong)(f0*100)%10;if(temp!=0){writedata((ulong)(f0*10)%10+0x30);writedata(temp+0x30);}else{temp=(ulong)(f0*10)%10;if(temp!=0)writedata(temp+0x30);}}}}}uchar keyscans(void)//矩阵键盘扫描{uchar i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};for(j = 0; j < 4; j++) //循环四次{P1 = Buffer[j]; //在P1高四位分别输出一个低电平temp = 0x01; //计划先判断P1.0位for(i = 0; i < 4; i++){if(!(P1 & temp)) //从P1低四位,截取1位return (i + j * 4); //返回取得的按键值temp <<= 1; //判断的位,左移一位}}return 16; //判断结束,没有键按下,返回}float keyscan(void)//矩阵键盘扫描{static float keytemp=0;static uchar dianflag=0;static uchar diancount=0;static uchar k=0;uchar temp;P1=0xfe;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(1);if(temp!=0xf0){switch(temp){case 0xe0: {k=1;if(dianflag==0)keytemp=keytemp*10+k ;if(dianflag==1){diancount++;if(diancount==1)keytemp=keytemp+k*0.1;if(diancount==2)keytemp=keytemp+k*0.01; if(diancount==3)keytemp=keytemp+k*0.001;if(diancount==4)keytemp=keytemp+k*0.0001 ;if(diancount==5)keytemp=keytemp+k*0.0000 1;}}break;case 0xd0: {k=2;if(dianflag==0)keytemp=keytemp*10+k ;if(dianflag==1){diancount++;if(diancount==1)keytemp=keytemp+k*0.1;if(diancount==2)keytemp=keytemp+k*0.01; if(diancount==3)keytemp=keytemp+k*0.001;if(diancount==4)keytemp=keytemp+k*0.0001 ;if(diancount==5)keytemp=keytemp+k*0.0000 1;}}break;case 0xb0: {k=3;if(dianflag==0)keytemp=keytemp*10+k ;if(dianflag==1){diancount++;if(diancount==1)keytemp=keytemp+k*0.1;if(diancount==2)keytemp=keytemp+k*0.01; if(diancount==3)keytemp=keytemp+k*0.001;if(diancount==4)keytemp=keytemp+k*0.0001 ;if(diancount==5)keytemp=keytemp+k*0.0000 1;}}break;case 0x70: if(setflag==1){pageflag++;dianflag=0;diancount=0;ok=0;ke ytemp=0;if(pageflag==4)pageflag=0;}break;}}}P1=0xfd;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(1);if(temp!=0xf0){switch(temp){case 0xe0: {k=4;if(dianflag==0)keytemp=keytemp*10+k ;if(dianflag==1){diancount++;if(diancount==1)keytemp=keytemp+k*0.1;if(diancount==2)keytemp=keytemp+k*0.01; if(diancount==3)keytemp=keytemp+k*0.001;if(diancount==4)keytemp=keytemp+k*0.0001 ; if(diancount==5)keytemp=keytemp+k*0.0000 1;}}break;case 0xd0: {k=5;if(dianflag==0)keytemp=keytemp*10+k ;if(dianflag==1){diancount++;if(diancount==1)keytemp=keytemp+k*0.1;if(diancount==2)keytemp=keytemp+k*0.01; if(diancount==3)keytemp=keytemp+k*0.001;if(diancount==4)keytemp=keytemp+k*0.0001 ;if(diancount==5)keytemp=keytemp+k*0.0000 1;}}break;case 0xb0: {k=6;if(dianflag==0)keytemp=keytemp*10+k ;if(dianflag==1){diancount++;if(diancount==1)keytemp=keytemp+k*0.1;if(diancount==2)keytemp=keytemp+k*0.01; if(diancount==3)keytemp=keytemp+k*0.001;if(diancount==4)keytemp=keytemp+k*0.0001 ;if(diancount==5)keytemp=keytemp+k*0.0000 1;}}break;case 0x70: if(setflag==1){pageflag--;dianflag=0;diancount=0;ok=0;key temp=0;if(pageflag==0)pageflag=4;}break;}}}P1=0xfb;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(1);if(temp!=0xf0){switch(temp){case 0xe0: {k=7;if(dianflag==0)keytemp=keytemp*10+k ;if(dianflag==1){diancount++;if(diancount==1)keytemp=keytemp+k*0.1;if(diancount==2)keytemp=keytemp+k*0.01; if(diancount==3)keytemp=keytemp+k*0.001; if(diancount==4)keytemp=keytemp+k*0.0001 ;if(diancount==5)keytemp=keytemp+k*0.0000 1;}}break;case 0xd0: {k=8;if(dianflag==0)keytemp=keytemp*10+k ;if(dianflag==1){diancount++;if(diancount==1)keytemp=keytemp+k*0.1;if(diancount==2)keytemp=keytemp+k*0.01; if(diancount==3)keytemp=keytemp+k*0.001;if(diancount==4)keytemp=keytemp+k*0.0001 ;if(diancount==5)keytemp=keytemp+k*0.0000 1;}}break;case 0xb0: {k=9;if(dianflag==0)keytemp=keytemp*10+k ;if(dianflag==1){diancount++;if(diancount==1)keytemp=keytemp+k*0.1;if(diancount==2)keytemp=keytemp+k*0.01;if(diancount==3)keytemp=keytemp+k*0.001;if(diancount==4)keytemp=keytemp+k*0.0001 ;if(diancount==5)keytemp=keytemp+k*0.0000 1;}}break;case 0x70: {setflag=!setflag;pageflag=0;ok=0;}break;}}}P1=0xf7;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(1);if(temp!=0xf0){switch(temp){case 0xe0:dianflag=1;break;case 0xd0:{k=0;if(dianflag==0)keytemp=keytemp*10+k ;}break;case 0xb0: {dianflag=0;diancount=0;ok=1;keytemp= 0;pageflag++;}break;case 0x70: {dianflag=0;diancount=0;keytemp=0;ok= 0;}break;}}}return keytemp;}。