标题:
51单片机+max6675模块+K型热电偶的高温可调PID温控系统源程序
[打印本页]
作者:
kk201314
时间:
2019-6-17 13:36
标题:
51单片机+max6675模块+K型热电偶的高温可调PID温控系统源程序
单片机源程序如下:
#include <reg52.h>
#include<intrins.h>
#include<string.h>
#include <stdio.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int//位定义
//max6675
sbit SO= P1^0;
sbit CS= P1^1;
sbit SCK=P1^2;
//按键
sbit key1=P1^5; //功能键
sbit key2=P1^6; //+
sbit key3=P1^7; //-
sbit BEEP=P1^3; //蜂鸣器
sbit RELAY=P1^4; //继电器
//DAC0832
//sbit CSDA=P3^2;
//sbit wr=P3^6;
//int high_limit=1250; //上限温度,默认值为1250
int Temp_set=250; //设定目标温度,默认值为250
int Temp_true;
int set_status=0;
uchar qian=0,bai=0,shi=0,ge=0,xiao=0;
uchar smg[8];
//float Kp,Ki,Kd;
uchar num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管赋值 0,1,2,3,4,5,6,7,8,9
//uchar num_p[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共阳极数码管带小数点赋值 0,1,2,3,4,5,6,7,8,9
uchar choose[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管位选
//sbit dula=P2^6; //数码管段选,锁存器控制信号
//sbit wela=P2^7; //数码管位选,锁存器控制信号
uint Re_Convert(); //热电偶数据读取,返回温度
//int ek=0;
//int eset_statu=0; //第K-1采样时的偏差值,Error[-1]
//int ek2=0; //第K-2采样时的偏差值,Error[-2]
//float LastOutput=0; //上次PID输出
//float Output=0; //PID的输出
//uchar high_time,low_time,count=0; //占空比调节参数
//---------------------------延时子程序---------------------------//
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void delay_50ms(uint m)
{
uchar x,y;
for(x=m;x>0;x--)
for(y=50;y>0;y--) ;
}
/*********** MAX6675函数***********/
uint Re_Convert() //热电偶数据读取,返回温度
{
long int a=0x7ff8;
long int wendu=0,wendu_1;
float wendu_2;
uint i;
CS=1;
SCK=0;
delay(200);
_nop_();
_nop_();
CS=0;
for(i=1;i<=16;i++)
{ wendu=wendu<<1;
_nop_();
SCK=1;
if(SO==1){wendu=wendu|0x01;}
else wendu=wendu|0x00;
_nop_();
_nop_();
SCK=0;
_nop_();
_nop_();
}
wendu_1=wendu&a;
wendu_1=wendu_1>>3;
wendu_2=wendu_1*0.25;
return wendu_2; //返回带两位小数的实际温度
//wendu=wendu_2*100; //放大100倍转成整型常数
//return wendu; //返回整型常数便于显示小数位数字
}
//*************温度显示程序*******************//
void Disp_temp_true(uint temp)//温度显示
{
unsigned char i;
unsigned int j;
ge=temp%10; //取个数位数字
temp=temp/10;
shi=temp%10;//取十位数字
temp=temp/10;
bai=temp%10;//取百位数字
qian=temp/10;//取千位数字
smg[0]=num[qian];
smg[1]=num[bai];
smg[2]=num[shi];
smg[3]=num[ge];
/*
for(i=0; i<4; i++)
{
P2=choose[i]; //数码管位选
P0=smg[i]; //送数字到段码端口,显示数字
j = 10; //扫描间隔时间设定
while(j--);
P0 = 0x00;//消隐
}
*/
}
//*************温度设置显示程序*******************//
void Disp_temp_set(uint set)//温度设置显示
{
unsigned char i;
unsigned int j;
ge=set%10; //取个数位数字
set=set/10;
shi=set%10;//取十位数字
set=set/10;
bai=set%10;//取百位数字
qian=set/10;//取千位数字
smg[4]=num[qian];
smg[5]=num[bai];
smg[6]=num[shi];
smg[7]=num[ge];
/*
for(i=4; i<8; i++)
{
P2=choose[i]; //数码管位选
P0=smg[i]; //送数字到段码端口,显示数字
j = 10; //扫描间隔时间设定
while(j--);
P0 = 0x00;//消隐
}
*/
}
//*************报警子程序*******************//
void Alarm()//蜂鸣器间断
{
if(Temp_true>Temp_set)
{
int b;
for(b=100;b>0;b--)
{
BEEP=1;
delay_50ms(10);
BEEP=0;
delay_50ms(10);
}
}
}
void compare_temper()
{
uint temper=Temp_true;
if(temper>=Temp_set) //实际温度是否大于设置的温度
{
RELAY=1;
}
else if(temper<Temp_set)
{
RELAY=0;
}
}
//*******按键子程序*******//
void keyset()
{
#if 1
if(key1 == 0){
set_status =!set_status;
}
if(set_status==1){
if(key1==0)
{
set_status =!set_status;
}
if(key2==0)
{
Temp_set=Temp_set+10;
Disp_temp_set(Temp_set);
//delay_50ms(1);
//while(!key2);
}
if(key3==0)
{
Temp_set=Temp_set-10;
Disp_temp_set(Temp_set);
//delay_50ms(10);
//while(!key3);
}
}
}
#else
if(set_status==0)
{
if(key1==0)
{
set_status=1;
}
}
else{
//while(set_status==1)
{
if(key1==0)
{
set_status=0;
}
if(key2==0)
{
Temp_set=Temp_set+10;
Disp_temp_set(Temp_set);
//delay_50ms(1);
//while(!key2);
}
if(key3==0)
{
Temp_set=Temp_set-10;
Disp_temp_set(Temp_set);
//delay_50ms(10);
//while(!key3);
}
//}
}
#endif
}
void init_sys() //系统初始化
{
IT0=1;
EX0=1;
ET0=1;
EA=1;
TMOD=1;
TH0=0xfc;
TL0=0x66;//装初值,定时时间为1ms
ET0=1; //打开定时器0的大门
TR0=1;
P0=0xc0;
}
//*************主程序*******************//
void main()
{
// Kp=1.2;
// Ki=3.4;
// Kd=5.6;
init_sys();
delay_50ms(1);
while(1)
{
Temp_true=Re_Convert();// 热电偶数据读取,返回温度
compare_temper();
Disp_temp_true(Temp_true);
Disp_temp_set(Temp_set);
//if(key1==0)
{
keyset();
}
//PID();
Alarm();
//delay_50ms(6);
}
}
void Dsqi0() interrupt 1
{
long int i=0;
uchar c=0xfe;
TH0=0xfc;
TL0=0x66;
P2=0xff;
P0=smg[i];
P2=c;
c=_crol_(c,1);
i=i+1;
if(i==8)
{
i=0;
c=0xfe;
}
}
复制代码
所有资料51hei提供下载:
max6675.rar
(43.63 KB, 下载次数: 197)
2019-6-17 13:35 上传
点击文件名下载附件
51单片机+max6675模块+K型热电偶的高温可调温控系统
下载积分: 黑币 -5
作者:
admin
时间:
2019-6-17 16:03
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
作者:
坏牧羊人
时间:
2020-5-1 14:40
请问有对应原理图吗
作者:
qzsulin
时间:
2020-10-19 09:36
未包含pid程序部分
作者:
woyaodwn
时间:
2021-12-28 09:53
补全电路原理图,源码了吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1