#include<reg52.h>
#include<math.h>
sbit p24=P2^4;
sbit p25=P2^5;
sbit p26=P2^6;
sbit p27=P2^7;
sbit p35=P3^5;
sbit p34=P3^4;
sbit SDA=P3^7;
sbit SCL=P3^6;
sbit p14=P1^4;
sbit k1=P2^0;
sbit k2=P2^1;
sbit k3=P2^2;
sbit k4=P3^2;
//此表为 LED 的字模, 共阴数码管//0~9,0.~9.,上-中-下-,空
unsigned char code Duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x01,0x40,0x08,0x00};
unsigned int Data_Buffer[4]={0,0,0,0};
//通过电路图5v*10k/(10k+Rt)=Ur,转换出温度-电压表
float code Wenya[71]={1.903,1.958,2.017,2.079,2.141,2.204,2.266,2.327,2.386,2.444,2.500,2.554,2.606,2.657,2.706,2.753,2.799,2.844,2.888,2.931,2.974,3.016,3.057,3.098,3.138,3.178,3.217,3.257,3.295,3.334,3.372,3.409,3.447,3.483,3.519,3.555,3.590,3.625,3.659,3.693,3.727,3.761,3.795,3.829,3.864,3.899,3.914,3.931,3.952,3.974,3.998,4.022,4.047,4.072,4.096,4.120,4.144,4.167,4.188,4.209,4.229,4.248,4.266,4.283,4.300,4.316,4.331,4.345,4.359,4.372,4.386};
int code Wendu[71]={15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85};
unsigned char redata,SetT[3]={3,0,5},UpT[3]={4,5,5},DownT[3]={2,0,0};
int uk,menu=0,model=0,number,Al=0,rV,rT;
float V,T,temp;
void delay4us()
{
; ;
}
void delay(int d)
{
int i,j;
for(i=0;i<d;i++)
for(j=0;j<125;j++);
}
void Start()
{
SDA=1; //发送起始条件的数据信号;
delay4us();
SCL=1;
delay4us(); /*起始条件建立时间大于4.7us,延时*/
SDA=0; /*发送起始信号*/
delay4us();
}
void Ack() //应答检测
{
SDA=1; /*定义为输入,准备接收应答位*/
SCL=1;
delay4us();
if(SDA==1) delay(5); // sda是从机向主机发送的
SCL=0; // 应答sda=0
delay4us(); // 非应答 sda=1或者是超时
}
void Stop()//停止
{
SDA=0; /*发送结束条件的数据信号*/
delay4us(); /*发送结束条件的时钟信号*/
SCL=1; /*结束条件建立时间大于4μs*/
delay4us();
SDA=1; /*发送I2C总线结束信号*/
delay4us();
}
void SendByte(char c)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位
{
SCL=0;
delay4us();
if((c<<BitCnt)&0x80) SDA=1; //判断发送位
else SDA=0;
delay4us();
SCL=1; //置时钟线为高,通知被控器开始接收数据位
delay4us();
}
SCL=0;
delay4us();
SDA=1; //8位发送完后释放数据线,准备接收应答位
delay4us();
}
char RcvByte()
{
unsigned char retc;
unsigned char BitCnt;
retc=0;
SDA=1; //置数据线为输入方式
for(BitCnt=0;BitCnt<8;BitCnt++)
{
SCL=1; //置时钟线为高使数据线上数据有效
delay4us();
retc=retc<<1;
if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中
SCL=0;
delay4us();
}
SCL=0;
delay4us();
SDA=1;
delay4us();
return(retc);
}
/*******************************************************************
ADC 变换, 转化函数
*******************************************************************/
void ADCconversion(unsigned char adrs1,unsigned char c, unsigned char adrs2)
{
Start(); //启动总线
SendByte(adrs1); //发送器件地址
Ack();
SendByte(c); //发送控制字节
Ack();
Stop();
Start(); //再次开始传输读
SendByte(adrs2); //发送读地址
Ack();
redata=RcvByte();
Ack();
Stop(); //结束总线
}
void Butdel()
{
//k1切换模式
if(k1==0)
delay(125);
if(k1==0)
{
model++; //0-当前温度,1-设定温度,2-上限温度,3-下限温度,4-检测到的温度电压
if(model>4) model=0;
}
//k2切换修改项:小数位,个位,十位
if(k2==0)
{
while(!k2);
if(model>0&&model<=3)//可修改1,2,3
{
number++;
if(number>2)
number=0;
}
}
//k3修改设定温度及上下限温度++
if(k3==0)
{
while(!k3);
//修改设定温度
if(model==1)
{
if(number==0)//小数位
{
SetT[2]++;
if(SetT[2]>9)
SetT[2]=0;
}
else if(number==1)//个位
{
SetT[1]++;
if(SetT[1]>9)
SetT[1]=0;
}
else if(number==2)//十位
{
SetT[0]++;
if(SetT[0]>9)
SetT[0]=0;
}
}
//修改上限温度
if(model==2)
{
if(number==0)
{
UpT[2]++;//小数
if(UpT[2]>9)
UpT[2]=0;
}
else if(number==1)
{
UpT[1]++;
if(UpT[1]>9)
UpT[1]=0;
}
else if(number==2)
{
UpT[0]++;
if(UpT[0]>9)
UpT[0]=0;
}
}
//修改下限温度
if(model==3)
{
if(number==0)
{
DownT[2]++;//小数
if(DownT[2]>9)
DownT[2]=0;
}
else if(number==1)
{
DownT[1]++;
if(DownT[1]>9)
DownT[1]=0;
}
else if(number==2)
{
DownT[0]++;
if(DownT[0]>9)
DownT[0]=0;
}
}
}
//k4加热开关
if(k4==0)
{
while(!k4);
if(Al==0) Al=1;
else Al=0;
}
}
void Datadeal()
{
static int n;
V=redata/51.0; //电压(注意小数点,很重要!!!!)
rV=V*100;
for(n=0;n<71;n++)
{
if(V<=Wenya[n])
break;
}
//温度小数部分
temp=(V-Wenya[n-1])/(Wenya[n]-Wenya[n-1]);
T=Wendu[n-1]+temp;//温度
rT=T*100;
}
void Display()
{
static int count;
count++;
if(count>40)
count=0;
if(model==0)//当前温度
{
number=0;// 修改位回到小数
Data_Buffer[0]=T/10;
Data_Buffer[1]=(rT/100)%10+10;
Data_Buffer[2]=(rT/10)%10;
Data_Buffer[3]=rT%10;
}
else if(model==1)//设定温度
{
if(number==0)
{
if(count<20)
Data_Buffer[3]=23; //数码管空灭,造成修改项闪烁
else
Data_Buffer[3]=SetT[2];
Data_Buffer[0]=21;
Data_Buffer[1]=SetT[0];
Data_Buffer[2]=SetT[1]+10;
}
else if(number==1)
{
if(count<20)
Data_Buffer[2]=23;
else
Data_Buffer[2]=SetT[1]+10;
Data_Buffer[0]=21;
Data_Buffer[1]=SetT[0];
Data_Buffer[3]=SetT[2];
}
else if(number==2)
{
if(count<20)
Data_Buffer[1]=23;
else
Data_Buffer[1]=SetT[0];
Data_Buffer[0]=21;
Data_Buffer[2]=SetT[1]+10;
Data_Buffer[3]=SetT[2];
}
}
else if(model==2)//上限温度可修改
{
if(number==0)
{
if(count<20)
Data_Buffer[3]=23;
else
Data_Buffer[3]=UpT[2];
Data_Buffer[0]=20;
Data_Buffer[1]=UpT[0];
Data_Buffer[2]=UpT[1]+10;
}
else if(number==1)
{
if(count<20)
Data_Buffer[2]=23;
else
Data_Buffer[2]=UpT[1]+10;
Data_Buffer[0]=20;
Data_Buffer[1]=UpT[0];
Data_Buffer[3]=UpT[2];
}
else if(number==2)
{
if(count<20)
Data_Buffer[1]=23;
else
Data_Buffer[1]=UpT[0];
Data_Buffer[0]=20;
Data_Buffer[2]=UpT[1]+10;
Data_Buffer[3]=UpT[2];
}
}
else if(model==3)//下限温度可修改
{
if(number==0)
{
if(count<20)
Data_Buffer[3]=23;
else
Data_Buffer[3]=DownT[2];
Data_Buffer[0]=22;
Data_Buffer[1]=DownT[0];
Data_Buffer[2]=DownT[1]+10;
}
else if(number==1)
{
if(count<20)
Data_Buffer[2]=23;
else
Data_Buffer[2]=DownT[1]+10;
Data_Buffer[0]=22;
Data_Buffer[1]=DownT[0];
Data_Buffer[3]=DownT[2];
}
else if(number==2)
{
if(count<20)
Data_Buffer[1]=23;
else
Data_Buffer[1]=DownT[0];
Data_Buffer[0]=22;
Data_Buffer[2]=DownT[1]+10;
Data_Buffer[3]=DownT[2];
}
}
else if(model==4)//热敏电阻电压
{
Data_Buffer[0]=23;
Data_Buffer[1]=(rV/100)%10+10;
Data_Buffer[2]=(rV/10)%10;
Data_Buffer[3]=rV%10;
}
}
int PID()//通过恰当的调整 P,I,D,系数效果更好
{
int KP=80,I=1,D=20;
float Ek,Esum,Ed,Ek1,Res,Set,K1=5;
if(Al==0)
{
p34=1;
return 0; //加热开关未打开
}
else p34=0;
Set=SetT[0]*10+SetT[1]+SetT[2]*0.1;
Ek=Set-T;
Ed=Ek-Ek1;
Ek1=Ek;
if(abs(Ek)<2)//保温环节PID稳定精确控制
{
Esum=Esum+Ek;
Res=(KP*Ek+I*Esum+D*Ed);
}
else //加热环节PD快速控制
Res=(KP*Ek+D*Ed);
if(Res>200) Res=200;
if(Res<=0) Res=0;
ret
51C PID温度控制
需积分: 10 145 浏览量
2015-08-18
22:25:24
上传
评论 1
收藏 26KB RAR 举报
Rgazer
- 粉丝: 29
- 资源: 3
最新资源
- 基于 Java的班级管理系统课程设计
- 深入探索Suno AI:教程、元标签与案例分析.pdf
- 超市会员积分管理系统主要用于实现了企业管理数据统计等
- 基于 Java的班级管理系统
- MyBatis 动态 SQL:灵活而强大的查询构建器.pdf
- com.accordion.prettyo.apk
- 毕业设计:基于SSM的mysql-ssm软件bug管理系统(源码 + 数据库 + 说明文档)
- MTSQL8.0.35windows(64bit)-mysql-installer-community-8.0.35.0
- 人工智能引领音乐创作新时代之Suno AI
- Public-bicycle-usage-forecast-master.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈