标题:
单片机数显温度控制器设计资料
[打印本页]
作者:
zhnagrui95
时间:
2017-8-25 11:29
标题:
单片机数显温度控制器设计资料
自己搞的
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
0.png
(48.56 KB, 下载次数: 79)
下载附件
2017-8-25 16:07 上传
0.png
(36.53 KB, 下载次数: 61)
下载附件
2017-8-25 16:07 上传
单片机源程序如下:
#include "102.h" //声音 暂停
#include "EEPROM.h"
unsigned char in;
sbit fmq = P5^4;
unsigned char key=0;
unsigned char wendu;
bit fl100ms;
unsigned char yanshi;
unsigned char te;
unsigned int time;
int wenduh=500;
int wendul=200;
unsigned char huicha;
unsigned int tempflg[2];
signed int temp[2];
bit gz;
bit gzbz=0;
void baocuen();
void duqu();
void sy();
void sy2();
unsigned char ysbz;
unsigned int syt;
unsigned int ysjs;
void main()
{
unsigned u;
init();
while(1)
{
ADC_convert();
panduan();
sy2();
if(temp[0]<0)
{ u=abs(temp[0]);
dis1(21 ,u/100,u%100/10);
}
else if(temp[0]>999)
{ dis1(temp[0]/1000 ,temp[0]%1000/100,temp[0]%100/10);}
else
dis1(temp[0]/100 ,(temp[0]%100/10)+10,temp[0]%10);
if(!set)
{ sy();
while(1)
{
if(temp[0]<0)
{
temp[0]=abs(temp[0]);
dis1(21 ,temp[0]/10,temp[0]%10);
}
else if(temp[0]>999)
{
dis1(temp[0]/1000 ,temp[0]%1000/100,temp[0]%100/10);
}
else
dis1(temp[0]/100 ,(temp[0]%100/10)+10,temp[0]%10);
if(set)
{
out=0;
shezhi();
baocuen();
goto loop2;
}
}
loop2:te=0;
}
if(!up)
{ sy();
if(temp[0]<0)
{ temp[0]=abs(temp[0]);
dis1(21 ,temp[0]/10,temp[0]%10);
}
else if(temp[0]>999)
{ dis1(temp[0]/1000 ,temp[0]%1000/100,temp[0]%100/10);}
else
dis1(temp[0]/100 ,(temp[0]%100/10)+10,temp[0]%10);
if(up)
{
P3=0;
LED1=LED2=LED3=0;
out=0;
fmq=0;
while(1)
{
CLK_DIV = 0x07; //将IDL(PCON.0)置1,MCU将进入空闲模式
_nop_(); //此时CPU?时钟,不执行指?
if(!up)
{ sy();
while(1)
{
if(up)
{
CLK_DIV = 0x00;
goto loop2;}
}
}
}}}
}
}
void init()
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD=0x01; //设置T0为自动装入的16位定时器
TL0 = (65536-10000)/256;
TH0 = (65536-10000)%256;
P3M1 = 0x00;
P3M0 = 0xff;
P1M1 = 0x00;
P1M0 = 0x00;
P5M1 = 0x00;
P5M0 = 0xff;
EA = 1;
ET0=1;
TR0=1;
InitADC();
duqu();
}
void Timer0Init(void) interrupt 1 //2毫秒@11.0592MHz
{
unsigned char te;
bit biaozhi7=1;
TL0 = 0xCD; //设置定时初值
TH0 = 0xF8; //设置定时初值
te++;
time++;
WDT_CONTR=0x37; //喂狗 8.4S
//////////////////////////////
if(te>220)
{
fl100ms=1;
te=0;
}
syt++;
if(syt==100)
{ fmq=0;}
ysjs++;
}
void ADC_convert(void) //ad数据得出
{
if(fl100ms==1)
{
GetADCResult(1,&tempflg[0]); //1-通道号 temp[0]-ADC转换数值
fl100ms=0;
}
temp[0] = (signed int) ( ( 3950.0 / ( 11.33657 + log( 6.04 * (float)tempflg[0] / ( 1024.0 - (float)tempflg[0] ) ) ) - 278.15) * 10 );//273.15
}
void shezhi()
{
unsigned b;
unsigned mode=0;
bit caidan=0;
bit a=1;
dis1(20 ,21,mode);
while(1)
{
if(caidan==0)
{
dis1(20 ,21,mode);
if(!up)
{ sy();
a=1;
while(a)
{
dis1(20 ,21,mode);
if(up)
{
mode++;
if(mode>4)
{mode=0;}
a=0;
}
}
}
if(!down)
{ sy();
{ a=1;
while(a)
{
dis1(20 ,21,mode);
if(down)
{
if(mode==0)
{mode=4;}
else mode--;
a=0;
}
}
}
}
if(!set)
{
sy();
time=0;
a=1;
while(a)
{
dis1(20 ,21,mode);
if(set)
{
if(time>100)
{ sy();
goto loop1;}
else
{ caidan=1;
a=0;
}
}
}
}
}
if(caidan==1)
{
if(mode==0)
{
dis1(0,0,gz);
}
if(mode==1)
{
if(wenduh<0)
{
b=abs(wenduh);
dis1(21 ,b/100,b%100/10);
}
else if(wenduh>999)
{
dis1(wenduh/1000 ,wenduh%1000/100,wenduh%100/10);
}
else
dis1(wenduh/100 ,(wenduh%100/10)+10,wenduh%10);
}
if(mode==2)
{
if(wenduh<0)
{
b=abs(wendul);
dis1(21 ,b/100,b%100/10);
}
else if(wendul>999)
{
dis1(wendul/1000 ,wendul%1000/100,wendul%100/10);
}
else
dis1(wendul/100 ,(wendul%100/10)+10,wendul%10);
}
if(mode==4)
{
dis1(yanshi/100 ,yanshi%100/10,yanshi%10);}
if(!up)
{
sy();
time=0;
a=1;
while(a)
{ if(mode==0)
{ dis1(0,0,gz);}
if(mode==1)
{if(wenduh<0)
{ b=abs(wenduh);
dis1(21 ,b/100,b%100/10);
}
else if(wenduh>999)
{
dis1(wenduh/1000 ,wenduh%1000/100,wenduh%100/10);
}
else
dis1(wenduh/100 ,wenduh%100/10+10,wenduh%10);
}
if(mode==2)
{
if(wenduh<0)
{
b=abs(wendul);
dis1(21 ,b/100,b%100/10);
}
else if(wendul>999)
{
dis1(wendul/1000 ,wendul%1000/100,wendul%100/10);
}
else
dis1(wendul/100 ,wendul%100/10+10,wendul%10);
}
if(mode==4)
{
dis1(yanshi/100 ,yanshi%100/10,yanshi%10);
}
if(up)
{
a=0;
if(mode==0)
{
if(gz==0)
{gz=1;}
else
gz=0;
}
if(mode==1) //温度上限
{
if(wenduh>1000)
{
wenduh=wenduh+10;
}
else if(wenduh<0)
{
wenduh=wenduh+10;
}
else
wenduh++;
if(wenduh>1200)
{
wenduh=-550;
}
}
if(mode==4)
{
if(yanshi==180)
{
yanshi=0;
}
else yanshi++;
}
if(mode==2) //温度下线
{
if(wendul>1000)
{
wendul=wendul+10;
}
else if(wendul<0)
{
wendul=wendul+10;
}
else
wendul++;
if(wendul>1200)
{
wendul=-550;
}
}
if(mode==3) //回差
{
huicha++;
if(huicha>200)
{
wendul=0;
}
}
}
if(time>300)
{
if(mode==1) //温度上限
{
wenduh=wenduh+1;
if(wenduh>1200)
{
wenduh=-550;
}
}
if(mode==2) //温度下线
{
wendul=wendul+1;
if(wendul>1200)
{
wendul=-550;
}
}
if(mode==4) //温度下线
{
yanshi=yanshi+1;
if(yanshi>180)
{
yanshi=0;
}
}
}
}
}
if(!down)
{
sy();
time=0;
a=1;
while(a)
{
if(mode==0)
{
dis1(0,0,gz);
}
if(mode==1)
{
if(wenduh<0)
{
b=abs(wenduh);
dis1(21 ,b/100,b%100/10);
}
else if(wenduh>999)
{
dis1(wenduh/1000 ,wenduh%1000/100,wenduh%100/10);
}
else
dis1(wenduh/100 ,wenduh%100/10+10,wenduh%10);
}
if(mode==2)
{
if(wenduh<0)
{
b=abs(wendul);
dis1(21 ,b/100,b%100/10);
}
else if(wendul>999)
{
dis1(wendul/1000 ,wendul%1000/100,wendul%100/10);
}
else
dis1(wendul/100 ,wendul%100/10+10,wendul%10);}
if(mode==4)
{
dis1(yanshi/100 ,yanshi%100/10,yanshi%10);
}
if(down)
{
a=0;
if(mode==0)
{
if(gz==0)
{
gz=1;
}
else
gz=0;
}
if(mode==1) //温度上限
{
if(wenduh>999)
{
wenduh=wenduh-10;
}
else if(wenduh<0)
{
wenduh=wenduh-10;
}
else wenduh--;
if(wenduh<-550)
{
wenduh=1200;
}
}
if(mode==2) //温度下线
{
if(wendul>999)
{
wendul=wendul-10;
}
else if(wendul<0)
{
wendul=wendul-10;
}
else wendul--;
if(wendul<-550)
{
wendul=1200;
}
}
if(mode==3) //回差
{
huicha--;
if(huicha<0)
{
wendul=200;
}
}
if(mode==4)
{
if(yanshi==0)
{
yanshi=180;
}
else yanshi--;
}
}
if(time>300)
{
if(mode==1) //温度上限
{
wenduh=wenduh-1;
if(wenduh<-550)
{
wenduh=1200;
}
}
if(mode==2) //温度下线
{
wendul=wenduh-1;
if(wendul<-550)
{
wendul=1200;
}
}
if(mode==4) //yanshi
{
if(yanshi==0)
{
yanshi=180;
}
else yanshi=yanshi-1;
}
}
}
}
if(!set)
{
sy();
a=1;
while(a)
{
if(mode==0)
{
dis1(0,0,gz);
}
if(mode==1)
{
if(wenduh<0)
{
b=abs(wenduh);
dis1(11 ,b/100,b%100/10);
}
else if(wenduh>999)
{
dis1(wenduh/1000 ,wenduh%1000/100,wenduh%100/10);
}
else
dis1(wenduh/100 ,wenduh%100/10+10,wenduh%10);
}
if(mode==2)
{
if(wenduh<0)
{
b=abs(wendul);
dis1(11 ,b/100,b%100/10);
}
else if(wendul>999)
{
dis1(wendul/1000 ,wendul%1000/100,wendul%100/10);
}
else
dis1(wendul/100 ,wendul%100/10+10,wendul%10);
}
if(mode==4)
{
dis1(yanshi/100 ,yanshi%100/10,yanshi%10);
}
if(set)
{
a=0;
caidan=0;
}
}
}
}
}
loop1:baocuen(); //baocun(); //保存函数还没写
}
void panduan()
{
signed int a;
if(gz==0) //制冷模式
{ a=wenduh+huicha;
if(gzbz==0)
{
if(temp[0]>a)
{
gzbz=1;
}
ysjs=0;
ysbz=0;
}
if(gzbz==1)
{
if(temp[0]<wenduh)
{
out=0;
gzbz=0;
}
}
}
if(gz==1) //加热模式
{ a=wenduh-huicha;
if(gzbz==0)
{
if(temp[0]<a)
{
gzbz=1;
}
ysjs=0;
ysbz=0;
}
if(gzbz==1)
{
if(temp[0]>wendul)
{
out=0;
gzbz=0;
}
}
}
if(gzbz==1)
{
if(ysjs>500)
{ysbz++;
ysjs=0;
}
if(ysbz==yanshi)
{out=1;}
}
}
void baocuen()
{ bit q1,q2;
int h,l;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
源码:
2017102.zip
(92.11 KB, 下载次数: 40)
2017-8-25 11:29 上传
点击文件名下载附件
源程序
下载积分: 黑币 -5
数显温度控制器板.zip
(43.35 KB, 下载次数: 36)
2017-8-25 11:28 上传
点击文件名下载附件
ad16画的板
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1