基于单片机的温度控制系统.docx

上传人:b****4 文档编号:5317995 上传时间:2023-05-08 格式:DOCX 页数:17 大小:290.53KB
下载 相关 举报
基于单片机的温度控制系统.docx_第1页
第1页 / 共17页
基于单片机的温度控制系统.docx_第2页
第2页 / 共17页
基于单片机的温度控制系统.docx_第3页
第3页 / 共17页
基于单片机的温度控制系统.docx_第4页
第4页 / 共17页
基于单片机的温度控制系统.docx_第5页
第5页 / 共17页
基于单片机的温度控制系统.docx_第6页
第6页 / 共17页
基于单片机的温度控制系统.docx_第7页
第7页 / 共17页
基于单片机的温度控制系统.docx_第8页
第8页 / 共17页
基于单片机的温度控制系统.docx_第9页
第9页 / 共17页
基于单片机的温度控制系统.docx_第10页
第10页 / 共17页
基于单片机的温度控制系统.docx_第11页
第11页 / 共17页
基于单片机的温度控制系统.docx_第12页
第12页 / 共17页
基于单片机的温度控制系统.docx_第13页
第13页 / 共17页
基于单片机的温度控制系统.docx_第14页
第14页 / 共17页
基于单片机的温度控制系统.docx_第15页
第15页 / 共17页
基于单片机的温度控制系统.docx_第16页
第16页 / 共17页
基于单片机的温度控制系统.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于单片机的温度控制系统.docx

《基于单片机的温度控制系统.docx》由会员分享,可在线阅读,更多相关《基于单片机的温度控制系统.docx(17页珍藏版)》请在冰点文库上搜索。

基于单片机的温度控制系统.docx

基于单片机的温度控制系统

基于单片机的温度控制系统

选题背景

温度控制在农业生产中有着重要意义,它直接影响到农作物的产量。

为保证农业生产的顺利进行,首要问题是加强温度的监测工作。

但传统的方法是通过人工进行检测,这种人工测试方法费时费力、效率低,且测试的温度误差大,随机性大。

因此我们需要一种造价低廉、使用方便且测量准确的温度测量仪。

一,实现功能

1,临界温度设定

2,实时温度检测

3,动态温度显示

4,高温低温报警

二,功能模块

1,DS18B20实现温度检测

2,数码管实现温度动态显示

3,矩阵键盘实现温度设定

4,蜂鸣器实现高温低温报警

三,应用范围

1,室温检测

2,温室栽培

3,火灾报警等

电路图

主程序流程图:

T0中断流程图:

温度采样子程序流程图

键扫描程序流程图:

报警子程序流程图:

程序:

程序名称:

DS18B20温度计、温度监控系统

说明:

三个按键,分别是1.监控温度设置键

2.温度减少

3.温度增加

编写日期:

2009年4月29号

******************************************************************/

#include

#defineuintunsignedint

#defineucharunsignedchar//宏定义

sbitDQ=P3^6;//定义DS18B20总线I/O

sbitSET=P3^1;//定义调整键

sbitDEC=P3^2;//定义减少键

sbitADD=P3^3;//定义增加键

sbitBEEP=P3^7;//定义蜂鸣器

bitshanshuo_st;//闪烁间隔标志

bitbeep_st;//蜂鸣器间隔标志

sbitDIAN=P2^7;//小数点

ucharx=0;//计数器

signedcharm;//温度值全局变量

ucharn;//温度值全局变量

ucharset_st=0;//状态标志

signedcharshangxian=38;//上限报警温度,默认值为38

signedcharxiaxian=5;//下限报警温度,默认值为38

ucharcodeLEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};

/*****延时子程序*****/

voidDelay_DS18B20(intnum)

{

while(num--);

}

/*****初始化DS18B20*****/

voidInit_DS18B20(void)

{

unsignedcharx=0;

DQ=1;//DQ复位

Delay_DS18B20(8);//稍做延时

DQ=0;//单片机将DQ拉低

Delay_DS18B20(80);//精确延时,大于480us

DQ=1;//拉高总线

Delay_DS18B20(14);

x=DQ;//稍做延时后,如果x=0则初始化成功,x=1则初始化失败

Delay_DS18B20(20);

}

/*****读一个字节*****/

unsignedcharReadOneChar(void)

{

unsignedchari=0;

unsignedchardat=0;

for(i=8;i>0;i--)

{

DQ=0;//给脉冲信号

dat>>=1;

DQ=1;//给脉冲信号

if(DQ)

dat|=0x80;

Delay_DS18B20(4);

}

return(dat);

}

/*****写一个字节*****/

voidWriteOneChar(unsignedchardat)

{

unsignedchari=0;

for(i=8;i>0;i--)

{

DQ=0;

DQ=dat&0x01;

Delay_DS18B20(5);

DQ=1;

dat>>=1;

}

}

/*****读取温度*****/

unsignedintReadTemperature(void)

{

unsignedchara=0;

unsignedcharb=0;

unsignedintt=0;

floattt=0;

Init_DS18B20();

WriteOneChar(0xCC);//跳过读序号列号的操作

WriteOneChar(0x44);//启动温度转换

Init_DS18B20();

WriteOneChar(0xCC);//跳过读序号列号的操作

WriteOneChar(0xBE);//读取温度寄存器

a=ReadOneChar();//读低8位

b=ReadOneChar();//读高8位

t=b;

t<<=8;

t=t|a;

tt=t*0.0625;

t=tt*10+0.5;//放大10倍输出并四舍五入

return(t);

}

/*****END*****/

 

/*****延时子程序*****/

voidDelay(uintnum)

{

while(--num);

}

/*****初始化定时器0*****/

voidInitTimer(void)

{

TMOD=0x01;

TH0=0x3c;

TL0=0xb0;//50ms(晶振12M)

}

/*****定时器0中断服务程序*****/

voidtimer0(void)interrupt1

{

TH0=0x3c;

TL0=0xb0;

x++;

}

/*****外部中断0服务程序*****/

voidint0(void)interrupt0

{

EX0=0;//关外部中断0

if(DEC==0&&set_st==1)

{

shangxian--;

if(shangxian

}

elseif(DEC==0&&set_st==2)

{

xiaxian--;

if(xiaxian<0)xiaxian=0;

}

}

/*****外部中断1服务程序*****/

voidint1(void)interrupt2

{

EX1=0;//关外部中断1

if(ADD==0&&set_st==1)

{

shangxian++;

if(shangxian>99)shangxian=99;

}

elseif(ADD==0&&set_st==2)

{

xiaxian++;

if(xiaxian>shangxian)xiaxian=shangxian;

}

}

/*****读取温度*****/

voidcheck_wendu(void)

{

uinta,b,c;

c=ReadTemperature()-5;//获取温度值并减去DS18B20的温漂误差

a=c/100;//计算得到十位数字

b=c/10-a*10;//计算得到个位数字

m=c/10;//计算得到整数位

n=c-a*100-b*10;//计算得到小数位

if(m<0){m=0;n=0;}//设置温度显示上限

if(m>99){m=99;n=9;}//设置温度显示上限

}

/*****显示开机初始化等待画面*****/

voidDisp_init()

{

P2=0xbf;//显示-

P1=0xf7;

Delay(200);

P1=0xfb;

Delay(200);

P1=0xfd;

Delay(200);

P1=0xfe;

Delay(200);

P1=0xff;//关闭显示

}

/*****显示温度子程序*****/

voidDisp_Temperature()//显示温度

{

P2=0xc6;//显示C

P1=0xf7;

Delay(300);

P2=LEDData[n];//显示个位

P1=0xfb;

Delay(300);

P2=LEDData[m%10];//显示十位

DIAN=0;//显示小数点

P1=0xfd;

Delay(300);

P2=LEDData[m/10];//显示百位

P1=0xfe;

Delay(300);

P1=0xff;//关闭显示

}

/*****显示报警温度子程序*****/

voidDisp_alarm(ucharbaojing)

{

P2=0xc6;//显示C

P1=0xf7;

Delay(200);

P2=LEDData[baojing%10];//显示十位

P1=0xfb;

Delay(200);

P2=LEDData[baojing/10];//显示百位

P1=0xfd;

Delay(200);

if(set_st==1)P2=0x89;

elseif(set_st==2)P2=0xc7;//上限H、下限L标示

P1=0xfe;

Delay(200);

P1=0xff;//关闭显示

}

/*****报警子程序*****/

voidAlarm()

{

if(x>=10){beep_st=~beep_st;x=0;}

if((m>=shangxian&&beep_st==1)||(m

elseBEEP=1;

}

/*****主函数*****/

voidmain(void)

{

uintz;

InitTimer();//初始化定时器

EA=1;//全局中断开关

TR0=1;

ET0=1;//开启定时器0

IT0=1;

IT1=1;

check_wendu();

check_wendu();

for(z=0;z<300;z++)

{

Disp_init();

}

while

(1)

{

if(SET==0)

{

Delay(2000);

do{}while(SET==0);

set_st++;x=0;shanshuo_st=1;

if(set_st>2)set_st=0;

}

if(set_st==0)

{

EX0=0;//关闭外部中断0

EX1=0;//关闭外部中断1

check_wendu();

Disp_Temperature();

Alarm();//报警检测

}

elseif(set_st==1)

{

BEEP=1;//关闭蜂鸣器

EX0=1;//开启外部中断0

EX1=1;//开启外部中断1

if(x>=10){shanshuo_st=~shanshuo_st;x=0;}

if(shanshuo_st){Disp_alarm(shangxian);}

}

elseif(set_st==2)

{

BEEP=1;//关闭蜂鸣器

EX0=1;//开启外部中断0

EX1=1;//开启外部中断1

if(x>=10){shanshuo_st=~shanshuo_st;x=0;}

if(shanshuo_st){Disp_alarm(xiaxian);}

}

}

}

/*****END*****/

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2