基于51单片机的PID温度控制串口上报OLED显示系统proteus仿真原理图PCB

功能介绍:
0.本系统采用STC89C52作为单片机
1.LCD1602液晶实时显示温度/PID参数/设定的温度上下限/PWM输出/通信地址
2.当温度超过上下限阈值时,蜂鸣器报警
3.采用增量式PID算法控制当前温度。
4.定时向串口发送当前温度
5.可通过串口发送命令更改配置参数
6.采用DC002作为电源接口可直接输入5V给整个系统供电

原理图:
在这里插入图片描述

PCB :
在这里插入图片描述

主程序:

#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include <stdio.h>
#include "delay.h"
#include "pid.h"
#include "tlc0832.h"
#include "oled_iic.h"
#include "math.h"

/************************* 宏定义 *************************/
#define ON 0
#define OFF 1

#define T25 (273.15+25) //T25
#define Bx (4050.0) //B值
#define Ka (273.15) //绝对零度
#define Rp (10000.0) //ntc串联电阻
#define ntcR25 (10000.0) //25度时电阻

#define FRAME_HEADER  0x1a
#define FRAME_FUCTION_TEMP  0x00 //功能位,温度
#define FRAME_FUCTION_TARGET  0x01 //功能位,目标温度
#define FRAME_FUCTION_KP  0x02 //功能位,Kp
#define FRAME_FUCTION_KI  0x03 //功能位,Ki
#define FRAME_FUCTION_KD  0x04 //功能位,Kd
#define FRAME_FUCTION_TEMP_MIN  0x05 //功能位,温度下限
#define FRAME_FUCTION_TEMP_MAX  0x06 //功能位,温度上限
#define FRAME_FUCTION_ADDR  0x07 //功能位,通信地址
#define FRAME_END     0x3f

/************************* 引脚定义 *************************/
sbit BUZZER      = P3^7;
sbit L9110_A     = P1^3;
sbit L9110_B     = P1^4;

/************************* 变量定义 *************************/
PID_Calibration_Def xdata PID_Calibration; //PID结构体
PID_State_Def xdata PID_State; //PID结构体

float temperature; //实际温度
float f_tempVolt = 0;    //温度对应电压
float current = 0;
float Rt = 0;
int xdata tempMin = 20; //温度下限
int xdata tempMax = 50; //温度上限
char xdata dis0[16];           //定义显示区域临时存储数组

bit refreshFlag = 1;             //刷新标志
unsigned char setIndex = 0;
unsigned char PWMCnt = 0;
unsigned char address = 0; //通信地址

/************************* 函数声明 *************************/
void Timer0_Init(void); //函数声明
void KeyProcess(void); //按键处理
void Set_PID_Parameter(void); //PID参数初始化

void UART_Init(void); //串口初始化
void UART_SendByte(unsigned char dat); //串口发送单字节数据
// void UART_SendStr(unsigned char *s, unsigned char length); //发送定长度字符串
void SendData(unsigned char address, float temperature); //串口发送数据

void main(void)
{
   

    /************************* 初始化 *************************/
    Timer0_Init();
    
    OLED_Init();
    OLED_Clear();
    UART_Init();

    Set_PID_Parameter();

    /************************* 主循环 *************************/
    while (1)
  • 0
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一段基于野火STM32F103VET6指南者开发板的代码,实现了将光敏电阻的阈值通过OLED四引脚显示显示出来,具体实现细节见注释: ```c #include "stm32f10x.h" #include "OLED.h" // 定义光敏电阻的引脚 #define PHOTO_RESISTOR_PIN GPIO_Pin_4 #define PHOTO_RESISTOR_PORT GPIOA int main(void) { // 初始化OLED显示OLED_Init(); // 清除显示OLED_Clear(); // 在第一行第一列的位置显示"Threshold:" OLED_ShowString(0, 0, "Threshold:"); // 初始化GPIOA RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = PHOTO_RESISTOR_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 设置为上拉输入模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(PHOTO_RESISTOR_PORT, &GPIO_InitStructure); while(1) { // 读取光敏电阻引脚的值 uint16_t photo_resistor_val = GPIO_ReadInputDataBit(PHOTO_RESISTOR_PORT, PHOTO_RESISTOR_PIN); // 将光敏电阻的值转换为字符串 char photo_resistor_str[5]; sprintf(photo_resistor_str, "%d", photo_resistor_val); // 在第二行第一列的位置显示光敏电阻的值 OLED_ShowString(0, 2, photo_resistor_str); // 延时一段时间 delay_ms(500); } } ``` 其中,`OLED.h` 是一个OLED显示屏的驱动库,可以在网上找到相关的实现。在 main 函数中,先初始化了OLED显示屏,并在第一行第一列的位置显示了"Threshold:"。然后,初始化了光敏电阻的引脚,并在 while 循环中不断读取光敏电阻引脚的值,并将其转换为字符串,然后在第二行第一列的位置显示出来。最后,加上了一个延时,以便能够看清屏幕上的显示

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值