帮我写一个基于51的pid温度控制系统的程序,采用ds18b20作为温度传感器,数码管显示,通过按键设置期望的温度

时间: 2024-03-23 21:38:44 浏览: 26
好的,下面是一个基于51单片机的PID温度控制系统的程序,使用DS18B20作为温度传感器,数码管显示温度和设定温度,通过按键设置期望的温度: ```c #include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int #define DQ P2_7 sbit D1 = P0^0; // 数码管D1 sbit D2 = P0^1; // 数码管D2 sbit D3 = P0^2; // 数码管D3 sbit D4 = P0^3; // 数码管D4 sbit KEY_UP = P3^1; // 上键 sbit KEY_DOWN = P3^0; // 下键 float temperature = 0; // 当前温度 float setpoint = 40; // 设定温度 float kp = 2.0; // 比例系数 float ki = 0.5; // 积分系数 float kd = 1.0; // 微分系数 float error = 0.0, error_sum = 0.0, error_diff = 0.0; float last_error = 0.0, output = 0.0; void delayms(uint ms) // 延时函数 { uint i, j; for (i = 0; i < ms; i++) { for (j = 0; j < 120; j++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } void ds18b20_init() // 初始化DS18B20 { DQ = 1; delayms(10); DQ = 0; delayms(80); DQ = 1; delayms(10); } uchar ds18b20_read_byte() // 读取一个字节 { uchar i, j, value = 0; for (i = 0; i < 8; i++) { DQ = 0; _nop_(); _nop_(); value >>= 1; if (DQ) { value |= 0x80; } _nop_(); _nop_(); DQ = 1; } return value; } void ds18b20_write_byte(uchar value) // 写入一个字节 { uchar i; for (i = 0; i < 8; i++) { DQ = 0; _nop_(); _nop_(); if (value & 0x01) { DQ = 1; } value >>= 1; _nop_(); _nop_(); DQ = 1; } } float ds18b20_read_temperature() // 读取温度 { uchar tl, th; float temp = 0.0; ds18b20_init(); ds18b20_write_byte(0xCC); ds18b20_write_byte(0x44); delayms(100); ds18b20_init(); ds18b20_write_byte(0xCC); ds18b20_write_byte(0xBE); tl = ds18b20_read_byte(); th = ds18b20_read_byte(); temp = th; temp <<= 8; temp |= tl; temp /= 16.0; return temp; } void display(uint num) // 数码管显示 { uchar digit[4] = {0}; digit[0] = num % 10; digit[1] = num % 100 / 10; digit[2] = num % 1000 / 100; digit[3] = num / 1000; if (digit[3]) { D1 = 1; } else { D1 = 0; } D2 = 1; P1 = digit[2]; delayms(5); D2 = 0; if (digit[3] || digit[2]) { D3 = 1; } else { D3 = 0; } D4 = 1; P1 = digit[1]; delayms(5); D4 = 0; P1 = digit[0]; } void main() { EA = 1; // 开全局中断 TMOD = 0x01; // 定时器0工作在模式1 TH0 = 0xFC; // 定时器0初值为65536-50000=15536 TL0 = 0x00; TR0 = 1; // 启动定时器0 ET0 = 1; // 开定时器0中断 ds18b20_init(); // 初始化DS18B20 while (1) { if (KEY_UP == 0) // 上键按下 { setpoint += 1.0; delayms(10); } if (KEY_DOWN == 0) // 下键按下 { setpoint -= 1.0; delayms(10); } temperature = ds18b20_read_temperature(); // 读取温度 error = setpoint - temperature; // 计算误差 error_sum += error; // 累计误差 error_diff = error - last_error; // 计算误差变化率 output = kp * error + ki * error_sum + kd * error_diff; // 计算输出 if (output < 0.0) // 输出不能为负数 { output = 0.0; } // 控制温度,这里用printf代替实际控制操作 printf("Temperature: %.2f, Setpoint: %.2f, Output: %.2f\n", temperature, setpoint, output); temperature += output; display((uint)(temperature * 10)); // 显示温度 } } void timer0_isr() interrupt 1 // 定时器0中断服务程序 { TH0 = 0xFC; // 定时器0初值为65536-50000=15536 TL0 = 0x00; } ``` 这个程序使用了定时器0来实现一个简单的延时,从而避免了使用延时函数的问题。在主循环中,通过读取上下按键来设置设定温度,然后使用PID算法计算控制输出来控制温度,使用DS18B20读取温度值,并通过数码管显示温度和设定温度。控制输出不能为负数,因此在计算输出时需要进行判断。注意,在使用DS18B20时需要正确连接电路,以及正确初始化和读取传感器。

相关推荐

最新推荐

recommend-type

一种基于DS18B20的温度采集系统设计

与传统的模拟温度传感器相比,数字式温度传感器在器件微小化、抗干扰能力、可靠性、分辨率以及精度方面都具有明显的优点,此外,其输出的温度数据以及相关的温度控制量能够与各种微处理器相适配。
recommend-type

基于DS18B20测温的单片机温度控制系统

温度是工业控制中主要的被控参数之一.对典型的温度控制系统进行研究具有很广泛的意义。
recommend-type

基于89C51和DS18B20的温度采集系统设计

本温度采集系统的下位机采用89C51单片机为主控制器,利用DS18B20温度传感器进行溫度测量,采用数码管进行显示,并通过串口将采集的数据传送到上位机(PC机),通过上位机对温度进行集中监视和管理,解决了温度测量通常...
recommend-type

基于AT89C51和DS18B20的最简温度测量系统

本文介绍一种新型的可编程温度传感器DS18B20,他能代替模拟温度传感器和信号处理电路,直接与单片机沟通,完成温度采集和数据处理。DS18B20与AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合...
recommend-type

基于DS18B20的温度控制系统设计

报告中还重点介绍了软件设计部分,在这里采用模块化结构,主要模块有:数码管显示程序、键盘扫描及按键处理程序、温度信号处理程序。 关键词:AT89C51单片机 DS18B20温度芯片 温度控制 串口通讯
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解释minorization-maximization (MM) algorithm,并给出matlab代码编写的例子

Minorization-maximization (MM) algorithm是一种常用的优化算法,用于求解非凸问题或含有约束的优化问题。该算法的基本思想是通过构造一个凸下界函数来逼近原问题,然后通过求解凸下界函数的最优解来逼近原问题的最优解。具体步骤如下: 1. 初始化参数 $\theta_0$,设 $k=0$; 2. 构造一个凸下界函数 $Q(\theta|\theta_k)$,使其满足 $Q(\theta_k|\theta_k)=f(\theta_k)$; 3. 求解 $Q(\theta|\theta_k)$ 的最优值 $\theta_{k+1}=\arg\min_\theta Q(
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。