基于51单片机与ds18b20at24c02TLC549的可调恒温系统设计.docx
- 文档编号:10648325
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:18
- 大小:18.41KB
基于51单片机与ds18b20at24c02TLC549的可调恒温系统设计.docx
《基于51单片机与ds18b20at24c02TLC549的可调恒温系统设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机与ds18b20at24c02TLC549的可调恒温系统设计.docx(18页珍藏版)》请在冰豆网上搜索。
基于51单片机与ds18b20at24c02TLC549的可调恒温系统设计
基于ds18b20,at24c02,TLC549的可调恒温系统设计
题目:
可调恒温系统设计。
内容:
通过18B20采集环境温度,采用数码管显示温度。
当环境温度小于设定温度时,通过控制功率电阻加热使环境温度升高,达到设定温度后停止加热。
设计两个功能键,一个加建,一个减键,使设定温度可上下调节。
基本要求:
1、通过18B20正确测量环境温度,精确到小数点后一位。
2、通过数码管将环境温度显示出来,数码管动态扫描效果良好,没有闪烁的感觉。
3、通过两个按键(一个加,一个减)调节设定温度,当按下任意一个功能键时,数码管显示设定温度,此时可以通过两个按键调节设定温度。
当十秒钟没有键按下的时候跳转到显示当前环境温度。
并且把数据保存在at24c02中,而且可以通过AD转换,用旋钮来调节温度。
4、画流程图,写下构思及操作说明。
5、用AltiumDesignerSummer09软件画出原理图
提升要求:
1、功能键的设计更加人性化。
2、程序采用模块化编程,请注意各个.h文件,并且其.c文件中的放置位置不能被改变
#include
#include
#include"define.h"
#include"ds18b20.h"
#include"at24c02.h"
#include"tlc549.h"
voidinit()
{
G2A=G2B=0;
G1=1;
TMOD=0X11;
TH1=(65535-45000)/256;
TL1=(65535-45000)%256;
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
EA=1;
ET0=1;
ET1=1;
}
voidfenjie()
{
temper1[3]=temp/1000;//测量温度
temper1[2]=temp/100%10;
temper1[1]=temp/10%10+10;
temper1[0]=temp%10;
temper2[3]=sdtemp/1000;//设定温度
temper2[2]=sdtemp/100%10;
temper2[1]=sdtemp/10%10+10;
temper2[0]=sdtemp%10;
}
voidkey_scan(void)//调节温度键盘扫描
{
if(flag2==0)//第一次按键检测,显示设定温度
{
if((add==0)||(minus==0))
{
delay1ms(5);
if((add==0)||(minus==0))
{
flag=2;
flag2=1;
}
while(!
((add==0)||(minus==0)))
{
display(temper2[0],temper2[1],temper2[2],temper2[3]);
}
TR0=1;
}
}
/*************设定温度加减检测*****************/
if(flag2)
{
if(qiehuan==0)
{
delay1ms(5);
if(qiehuan==0)
{
led=~led;
count0=0;
TR0=1;
}
while(!
qiehuan)
{
display(temper2[0],temper2[1],temper2[2],temper2[3]);
}
}
if(led)
{
if(add==0)
{
delay1ms(5);
if(add==0)
{
count1=0;
TR1=1;
TR0=0;
if((!
TR0)&&((count0>5)&&(count0<=15)))
{
sdtemp+=5;
count0=0;
}
elseif((!
TR0)&&((count0>15)&&(count0<=70)))//按键间隔是200毫秒就加一
{
sdtemp++;
count0=0;
}
while(!
add)
{
if((count1>18)&&(count1<=34))
{
count1=0;
sdtemp+=50;
}
fenjie();
display(temper2[0],temper2[1],temper2[2],temper2[3]);
}
at24_write(0,sdtemp/10);//将设定温度的百位,十位,个位存入at24c02的第0个字节地址
delay1ms
(1);
at24_write(1,sdtemp%10);//将小数点存入第1个字节地址
TR0=1;
TR1=0;
count0=0;
}
}
elseif(minus==0)
{
delay1ms(5);
if(minus==0)
{
count1=0;
TR1=1;
TR0=0;
if((!
TR0)&&((count0>5)&&(count0<=15)))
{
sdtemp-=5;
count0=0;
}
elseif((!
TR0)&&((count0>15)&&(count0<=70)))//按键间隔是200毫秒就加一
{
count0=0;
sdtemp--;
}
while(!
minus)
{
if((count1>18)&&(count1<=34))
{
count1=0;
sdtemp-=50;
}
fenjie();
display(temper2[0],temper2[1],temper2[2],temper2[3]);
}
at24_write(0,sdtemp/10);
delay1ms
(1);
at24_write(1,sdtemp%10);
TR0=1;
TR1=0;
count0=0;
}
}
}
if(led==0)
{
TR0=0;//当灯亮时就关闭定时器0,只有当灯灭了才在10秒后自动跳回测量温度
ad_convert();
at24_write(0,sdtemp/10);
delay1ms
(1);
at24_write(1,sdtemp%10);
}
}
/************显示测量温度和设定温度检测********************/
if(flag==1)//如果flag等于1就显示测量温度
{
display(temper1[0],temper1[1],temper1[2],temper1[3]);
}
elseif(flag==2)//如果flag等于2就显示设定温度
{
display(temper2[0],temper2[1],temper2[2],temper2[3]);
}
/************加热检测*******************/
if(temp hot=1; else hot=0; } voidmain(void) { uchardate1,date2; init(); date1=at24_read(0);//一进入程序就读取设定温度 delay1ms (1); date2=at24_read (1); sdtemp=date1*10+date2; while (1) { read_temp(); fenjie(); key_scan(); } } voidtimer0()interrupt1using0 { TH0=(65535-10000)/256; TL0=(65535-10000)%256; count0++; if(count0==1000)//如果在第一次按键后10秒内没有键再次按下就跳回显示测量温度 { count0=count1=0;//同时关闭定时器0,1 TR1=TR0=0; flag=led=1; flag2=0; } } voidtimer1()interrupt3using1//定时器0用于按着键不动时连续加 { TH1=(65535-45000)/256; TL1=(65535-45000)%256; count1++; } define.h文件 #defineucharunsignedchar #defineuintunsignedint /***********18b20定义***************/ sbitds18b20=P2^0; sbithot=P2^1; sbitadd=P2^6; sbitminus=P2^7; /**********138定义***************/ sbitA138=P1^0; sbitB138=P1^1; sbitC138=P1^2; sbitG1=P1^3; sbitG2A=P1^4; sbitG2B=P1^5; /***********at24c02定义*****************/ sbitat24_sda=P1^6; sbitat24_scl=P1^7; /***********TLC549定义********************/ sbittlc549_sda=P2^2; sbittlc549_scl=P2^3; sbittlc549_cs=P3^6;//低电平有效 /**************按键调温与旋钮调温定义**************/ sbitled=P2^4;//当灯灭时 sbitqiehuan=P2^5;//切换键 /***********数码管段选位选定义*******************/ ucharcodetabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//不带小数点 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,//带小数点 0x00 }; ucharcodetablewe[]={0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}; uintcount0,count1; uchartemper1[4],temper2[4],flag=1; ucharflagtime,flag2,date1,date2; inttemp,sdtemp;//测量温度和设定温度定义 voiddelay1ms(uintz) { ucharx; uinty; for(x=110;x>0;x--) for(y=z;y>0;y--); } voiddelayus(ucharz) { while(z--); } voiddisplay(uchara,ucharb,ucharc,uchard) { uchar*du; du=tabledu; A138=0;B138=0;C138=0; P0=*(du+a); delay1ms (1); A138=1;B138=0;C138=0; P0=*(du+b); delay1ms (1); A138=0;B138=1;C138=0; P0=*(du+c); delay1ms (1); A138=1;B138=1;C138=0; P0=*(du+d); delay1ms (1); P0=0x00; } ds18b20.h文件: voidreset() { ds18b20=1; delayus(8); ds18b20=0; delayus(80); ds18b20=1; delayus(35); } voidwrite_byte(uchardate) { uchari; for(i=0;i<8;i++) { date>>=1; ds18b20=0; ds18b20=CY; delayus(5); ds18b20=1;//释放总线 } } ucharread_byte() { uchari,date; for(i=0;i<8;i++) { date>>=1; ds18b20=0; ds18b20=1;//释放总线 if(ds18b20) date|=0x80; delayus(4); } ds18b20=1; returndate; } voidread_temp() { ucharlow; reset(); write_byte(0xcc); write_byte(0x44); delayus(80); reset(); write_byte(0xcc); write_byte(0xbe); low=read_byte(); temp=read_byte(); temp<<=8; temp|=low; temp*=0.625; } at24c02.h文件: voiddelay1us(void) { _nop_(); _nop_(); _nop_(); _nop_(); } voidat24_start() { at24_sda=1; at24_scl=1; delay1us(); at24_sda=0; delay1us(); } voidat24_stop() { at24_sda=0; at24_scl=1; delay1us(); at24_sda=1; delay1us(); } voidat24_ack() { uchari; at24_sda=1; at24_scl=1; delay1us(); while((at24_sda==1)&&(i<100))i++; at24_scl=0; delay1us(); } voidat24_wrbyte(uchardate) { uchari; for(i=0;i<8;i++) { at24_scl=0; at24_sda=date&0x80; delay1us(); at24_scl=1; date<<=1; } at24_scl=0;//此处必须把scl拉低 delay1us(); } ucharat24_rebyte() { uchari,dat; for(i=0;i<8;i++) { at24_scl=1; dat<<=1; if(at24_sda) dat|=0x01; delay1us(); at24_scl=0; delay1us(); } returndat; } voidat24_write(uchardat1,uchardat2) { at24_start(); at24_wrbyte(0xa0); at24_ack(); at24_wrbyte(dat1); at24_ack(); at24_wrbyte(dat2); at24_ack(); at24_stop(); } ucharat24_read(uchardate) { uchardat; at24_start(); at24_wrbyte(0xa0); at24_ack(); at24_wrbyte(date); at24_ack(); at24_start(); at24_wrbyte(0xa1); at24_ack(); dat=at24_rebyte(); at24_stop(); returndat; } tlc549.h文件 uchartlc549(void) { uchari,ad; tlc549_cs=0;//cs拉低把前次转换的最高位从sda输出 tlc549_scl=0;//接下来scl的七个脉冲将前次转换的后七位输出到sda,并且将第八个脉冲加在scl为下一次转换做准备 _nop_(); for(i=0;i<8;i++) { ad<<=1; ad|=tlc549_sda; tlc549_scl=1; _nop_(); tlc549_scl=0; } tlc549_cs=1;//在八个脉冲后必须把cs拉高,防止转换过程中外界因素干扰 for(i=0;i<4;i++)//延时大约19us,等待转换 delay1us(); returnad; } voidad_convert() { uintdate; date=tlc549(); sdtemp=5.0/256*date*250; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 ds18b20at24c02TLC549 可调 恒温 系统 设计