基于单片机锅炉加热炉炉温控制系统Proteus仿真(含全部资料)
本文提供了一套完整的单片机温度控制系统项目资料,包含Proteus仿真源文件、AD原理图、Keil C语言程序源码、元器件清单和说明书等。系统采用AT89C51单片机为核心,通过MAX6675芯片进行温度采集,并实现PID算法控制。项目具有温度显示、报警、参数设置等功能,支持8位数码管显示,包含完整的硬件电路设计和软件实现方案。资料可通过网盘下载,适合电子设计爱好者学习参考。该系统实现了温度检测、
·
全套资料包含:Proteus仿真源文件+keil C语言源程序+AD原理图+流程图+元器件清单+说明书等
资料下载:
通过网盘分享的文件:资料分享
链接: 百度网盘 请输入提取码 提取码: tgnu
目录
项目功能:
锅炉温度控制
1、使用热电偶测量炉内温度
2、温度控制采用PID调节,输出PWM控制波形
3、数码管显示设置参数
项目文件:
一、Proteus仿真源文件

二、AD原理图文件

二、报告说明书
三、系统流程图
四、器件清单
| 元件 | 型号 | 数量 |
| 单片机 | AT89C51 | 1 |
| 电容 | 30pf | 2 |
| 电容 | 10uf | 1 |
| 电阻 | 10k | 1 |
| 电阻 | 100欧 | 2 |
| 电阻 | 1k | 1 |
| 晶振 | 12MHZ | 1 |
| 数码管 | 8位共阴 | 1 |
| 热电偶 | TCN | 1 |
| 模数芯片 | MAX6675 | 1 |
| 光耦 | 600V | 1 |
| 三极管 | PNP | 2 |
| LED | 红色 | 2 |
| 蜂鸣器 | 有源 | 1 |
| 加热电阻 | 8欧 | 1 |
| 按钮 | 9 | |
| 排阻 | 10k | 1 |
| 可控硅 | Q5006L4 | 1 |
五、Keil c语言程序源代码(部分)
#include "reg51.h"
#include "max6675.h"
#define uchar unsigned char
#define uint unsigned int
sbit smg1=P2^0;//数码管
sbit smg2=P2^1;
sbit smg3=P2^2;
sbit smg4=P2^3;
sbit smg5=P2^4;
sbit smg6=P2^5;
sbit smg7=P2^6;
sbit smg8=P2^7;
sbit k1=P1^0;//按钮
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit beep=P3^7;//蜂鸣器
sbit out=P3^6;//输出控制
uchar time=0;//系统定时
uint wendu=0;//温度
uchar pwm=0;//占空比
uchar mode=0;//模式
uint set=800;//设置温度
uint limit=1000;//报警温度
uchar ii=0;
//数码管编码
uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar P_dat=1,I_dat=1,D_dat=1;//PID参数
uint pid_dat[]={0,0,0,0,0}; //临时数据
//PID计算,返回占空比
uchar PID(uint mub,uint dat)//调整目标+测量数据
{
uchar i=0;
uint j=0,sum=0,k=0;
//存储数据
for(i=0;i<4;i++)
pid_dat[i]=pid_dat[i+1];
pid_dat[4]=dat;
//P调节
j=0;
if(dat<mub)
{
j=j+(mub-dat)*P_dat;
if(j>100)
j=100;
}
else
{
k=(dat-mub)*P_dat;
if(j>k)
j=j-k;
}
//I调节
sum=0;
for(i=0;i<5;i++)
sum+=pid_dat[i];
sum=sum/5;
if(sum>mub)//减小
{
k=(sum-mub)*I_dat;
if(j>k)
j=j-k;
}
else //增加
{
k=(mub-sum)*I_dat;
j+=k;
if(j>100)
j=100;
}
//D调节
if(dat>pid_dat[3])//减小
{
k=(dat-pid_dat[3])*D_dat;
if(j>k)
j=j-k;
}
else //增加
{
k=(pid_dat[3]-dat)*D_dat;
j+=k;
if(j>100)
j=100;
}
return j;
}
//延时
void delay(uint i)
{
while(i--)
{
if(ii<99)//占空比计时
ii++;
else
ii=0;
if(ii<pwm)//输出控制
out=0;
else
out=1;
}
}
//主函数
void main()
{
uchar k=0;
TMOD|=0X01;//初始化定时器
TH0=0X3C;
TL0=0XB0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
if(P1==0xff)
k=0;
//设置
if(!k1 &&(k!=1))//设置切换
{
k=1;
if(mode<5)
mode++;
else
mode=0;
}
//设置调整温度
if(mode==1)
{
if(!k2 &&(k!=2))//+1
{
k=2;
if(set<9999)
set++;
}
if(!k3 &&(k!=3))//-1
{
k=3;
if(set>0)
set--;
}
if(!k4 &&(k!=4))//+10
{
k=4;
if(set<9999)
set+=10;
}
if(!k5 &&(k!=5))//-10
{
k=5;
if(set>10)
set-=10;
}
if(!k6 &&(k!=6))//+100
{
k=6;
if(set<9999)
set+=100;
}
if(!k7 &&(k!=7))//-100
{
k=7;
if(set>100)
set-=100;
}
}
//设置报警温度
if(mode==2)
{
if(!k2 &&(k!=2))//+1
{
k=2;
if(limit<9999)
limit++;
}
if(!k3 &&(k!=3))//-1
{
k=3;
if(limit>0)
limit--;
}
if(!k4 &&(k!=4))//+10
{
k=4;
if(limit<9999)
limit+=10;
}
if(!k5 &&(k!=5))//-10
{
k=5;
if(limit>10)
limit-=10;
}
if(!k6 &&(k!=6))//+100
{
k=6;
if(limit<9999)
limit+=100;
}
if(!k7 &&(k!=7))//-100
{
k=7;
if(limit>100)
limit-=100;
}
}
//设置P参数
if(mode==3)
{
if(!k2 &&(k!=2))//+1
{
k=2;
if(P_dat<99)
P_dat++;
}
if(!k3 &&(k!=3))//-1
{
k=3;
if(P_dat>0)
P_dat--;
}
}
//设置I参数
if(mode==4)
{
if(!k2 &&(k!=2))//+1
{
k=2;
if(I_dat<99)
I_dat++;
}
if(!k3 &&(k!=3))//-1
{
k=3;
if(I_dat>0)
I_dat--;
}
}
//设置D参数
if(mode==5)
{
if(!k2 &&(k!=2))//+1
{
k=2;
if(D_dat<99)
D_dat++;
}
if(!k3 &&(k!=3))//-1
{
k=3;
if(D_dat>0)
D_dat--;
}
}
//报警
if(wendu>limit)
beep=0;
else
beep=1;
//显示
if(mode==0)
{
P0=smgduan[wendu/1000]; smg5=0;delay(50);smg5=1;
P0=smgduan[wendu%1000/100]; smg6=0;delay(50);smg6=1;
P0=smgduan[wendu%100/10]; smg7=0;delay(50);smg7=1;
P0=smgduan[wendu%10]; smg8=0;delay(50);smg8=1;
}
if(mode==1)
{
P0=smgduan[1]; smg1=0;delay(50);smg1=1;
P0=smgduan[set/1000]; smg5=0;delay(50);smg5=1;
P0=smgduan[set%1000/100]; smg6=0;delay(50);smg6=1;
P0=smgduan[set%100/10]; smg7=0;delay(50);smg7=1;
P0=smgduan[set%10]; smg8=0;delay(50);smg8=1;
}
if(mode==2)
{
P0=smgduan[2]; smg1=0;delay(50);smg1=1;
P0=smgduan[limit/1000]; smg5=0;delay(50);smg5=1;
P0=smgduan[limit%1000/100]; smg6=0;delay(50);smg6=1;
P0=smgduan[limit%100/10]; smg7=0;delay(50);smg7=1;
P0=smgduan[limit%10]; smg8=0;delay(50);smg8=1;
}
if(mode==3)
{
P0=smgduan[3]; smg1=0;delay(50);smg1=1;
P0=smgduan[P_dat/10]; smg7=0;delay(50);smg7=1;
P0=smgduan[P_dat%10]; smg8=0;delay(50);smg8=1;
}
if(mode==4)
{
P0=smgduan[4]; smg1=0;delay(50);smg1=1;
P0=smgduan[I_dat/10]; smg7=0;delay(50);smg7=1;
P0=smgduan[I_dat%10]; smg8=0;delay(50);smg8=1;
}
if(mode==5)
{
P0=smgduan[5]; smg1=0;delay(50);smg1=1;
P0=smgduan[D_dat/10]; smg7=0;delay(50);smg7=1;
P0=smgduan[D_dat%10]; smg8=0;delay(50);smg8=1;
}
}
}
//定时器0中断
void Timer0() interrupt 1
{
unsigned long j;
if(time<10)//0.5s
time++;
else
{
time=0;
wendu=max_read();//测温
j=wendu;
j=j*100/138;
wendu=j;
pwm=PID(set,wendu);//PID计算
}
TH0=0X3C;
TL0=0XB0;
}
六、全套资料包含
七:项目资源获取
需要完整的资料可以点击下面的名片关注,回复“资料”!
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
更多推荐



所有评论(0)