写一个基于c51的恒温加热代码
时间: 2024-05-08 17:19:33 浏览: 12
下面是基于c51的恒温加热代码:
```c
#include <REG51.H> // 8051芯片头文件
#include <intrins.h> // 内部函数头文件
#define TEMPADD 0x80 // 温度传感器地址
sbit RELAY=P2^0; //继电器接口
bit start=0; //开始标志
unsigned char temp; //保存温度值
unsigned char target; //目标温度值
unsigned char kp=3; //PID控制参数P
unsigned char ki=2; //PID控制参数I
unsigned char kd=1; //PID控制参数D
//延时函数,单位ms
void delay(unsigned int time)
{
unsigned int i,j;
for(i=0;i<time;i++)
for(j=0;j<121;j++);
}
//读取温度传感器数据
unsigned char read_temp()
{
unsigned char th, tl;
unsigned char temp;
TH0 = 0;
TL0 = 0;
TR0 = 1; //启动定时器
_nop_();
_nop_(); //延时2us
TR0 = 0; //停止定时器
th = TH0;
tl = TL0;
temp = (th<<4)|(tl>>4);
return temp;
}
//PID控制函数
signed char pid_control(unsigned char temp, unsigned char target)
{
static int integral=0;
static int derivative=0;
static int error_last=0;
signed char control;
int error;
error = target - temp;
integral += error;
derivative = error - error_last;
control = kp*error + ki*integral + kd*derivative;
error_last = error;
return control;
}
//主函数
void main()
{
TMOD = 0x01; //定时器0工作模式1,每1us累加1
TH1=0; //初始化定时器初值
TL1=0;
ET0 = 1; //使能定时器0中断
EA = 1; //使能总中断
TR1=1;
while(1)
{
if(start)
{
temp = read_temp(); //读取温度传感器数据
RELAY = pid_control(temp,target)>=0?0:1; //PID控制继电器
}
delay(500);
}
}
//定时器0中断服务函数,周期1ms
void timer0() interrupt 1
{
static unsigned char cnt=0;
TH0 = 0x4B; //定时器初值
TL0 = 0xFD;
cnt++;
if(cnt>=200) //计数器累加至200即认为1s过去了
{
cnt = 0;
start = 1 - start; //按键取反
}
}
```
注:本代码仅供学习参考,不保证完全正确可用。