基于ds18b20的温度采集报警系统(上下限可调)
基于DS18B20的温度报警器设计说明
毕业设计论文基于DS18B20的温度报警器设计系电子信息工程系专业电子信息工程技术康志凌班级电子信息122 学号 1201043206指导教师徐敏 N 职称讲师设计时间 2014.10.08-2015.04.08摘要本设计以AT89C51单片机为核心,设计了一个温度测量报警系统,可以方便的实现温度采集和显示。
它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工农业中的温度测量及报警。
本设计由AT89C51单片机、DS18B20温度传感器和LED显示器组成,可以直观的显示测量的温度。
本设计运行过程中,如果外界温度低于-20℃或高于70℃,系统将出发蜂鸣器,产生报警声音,且对应的LED同步闪烁。
关键词:AT89C51,DS18B20,传感器,温度报警器目录摘要 (I)目录 (II)第1章引言 (1)第2章方案设计 (2)第3章 DS18B20简介 (3)3.1 DS18B20性能指标 (3)3.2 DS18B20的封装及部结构 (4)3.3 DS18B20工作原理及应用 (4)3.4 控制器对DS18B20操作流程 (5)第4章硬件电路设计 (7)4.1 AT89C51 (8)4.2 晶振电路 (9)4.3 复位电路 (9)4.4 报警电路 (10)4.5 74LS245 (10)4.6 显示电路 (11)第5章软件设计 (12)5.1 主程序模块 (12)5.2 程序说明 (12)第6章仿真结果 (21)参考文献 (23)致 (24)第1章引言温度是一个十分重要的物理量,对他的测量与控制有着十分重要的意义。
随着现代化工农业技术的发展及人民对生活环境要求的提高,人民也迫切需要监测和控制温度.在人类的生活环境中,温度扮演着极其重要的角色。
无论你生活在哪里,从事什么工作,无时无刻不在跟温度打着交道。
子18世纪工业革命以来,工业发展对是否能掌握温度有着绝对的联系。
ds18b20多路温度采集程序
本程序为ds18b20的多路温度采集程序,是我自己参考其他程序后改写而成,可显示4路正负温度值,并有上下限温度报警(声音、灯光报警)。
亲测,更改端口即可使用。
(主要器件:51单片机,ds18b20,lcd显示器)附有proteus仿真图,及序列号采集程序/****上限62度下限-20度****/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit ds=P1^1;sbit rs=P1^4;sbit e=P1^6;sbit sp=P1^0;sbit d1=P1^2;sbit d2=P1^3;ucharlcdrom[4][8]={{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e} ,{0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9},{0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0},{0x28,0x33,0xc5,0xb8,0x00,0x00,0x00,0xd7}};unsigned char code table0[]={"TEMPERARTURE:U "}; unsigned char code table1[]={"0123456789ABCDEF"};int f[4];int tvalue;float ftvalue;uint warnl=320;uint warnh=992;/****lcd程序****/void delayms(uint ms)//延时{uint i,j;for(i=ms;i>0;i--)for(j=110;j>0;j--);}void wrcom(uchar com)//写指令{delayms(1);rs=0;P3=com;delayms(1);e=1;delayms(1);e=0;}void wrdat(uchar dat)//写数据{rs=1;e=0;P3=dat;delayms(5);e=1;delayms(5);e=0;}void lcdinit()//初始化lcd {delayms(15);wrcom(0x38);delayms(5);wrcom(0x0c);delayms(5);wrcom(0x06);delayms(5);wrcom(0x01);delayms(5); }void display(uchar *p)//显示{while(*p!='\0'){wrdat(*p);p++;delayms(1);}}displayinit()//初始化显示{lcdinit();wrcom(0x80);display(table0);}/****ds18b20程序****/ void dsrst()//ds18b20复位{uint i;ds=0;i=103;while(i>0)i--;ds=1;i=4;while(i>0)i--;}bit dsrd0()//读一位数据{uint i;bit dat;ds=0;i++;ds=1;i++;i++;dat=ds;i=8;while(i>0)i--;return(dat);}uchar dsrd()//读1个字节数据{uchar i,j,dat;dat=0;for(i=8;i>0;i--){j=dsrd0();dat=(j<<7)|(dat>>1);}return(dat);}void dswr(uchar dat)//写数据{uint i;uchar j;bit testb;for(j=8;j>0;j--){testb=dat&0x01;dat=dat>>1;if(testb){ds=0;i++;i++;ds=1;i=8;while(i>0)i--;}else{ds=0;i=8;while(i>0)i--;ds=1;i++;i++;}}}void tmstart()//初始化ds18b20{sp=1;d1=1;d2=1;dsrst();delayms(1);dswr(0xcc);dswr(0x44);}void read_dealtemp()//读取并处理温度{uchar i,j,t;uchar a,b;for(j=0;j<4;j++){dsrst();delayms(1);dswr(0x55);for(i=0;i<8;i++){dswr(lcdrom[j][i]);//发送64位序列号}dswr(0xbe);a=dsrd();b=dsrd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0){d1=1;tvalue=~tvalue+1;wrcom(0xc0);wrdat(0x2d);if(tvalue>warnl){d2=0;sp=0;}else{d2=1;sp=1;}}else{d2=1;wrcom(0xc0);wrdat(' ');if(tvalue>warnh){d1=0;sp=0;}else{d1=1;sp=1;}}if(j==0){wrcom(0x8e); wrdat('2');}if(j==1){wrcom(0x8e);wrdat('3');}if(j==2){wrcom(0x8e);wrdat('4');}if(j==3){wrcom(0x8e);wrdat('5');}ftvalue=tvalue*0.0625;tvalue=ftvalue*10+0.5;ftvalue=ftvalue+0.05;f[j]=tvalue;//温度扩大十倍,精确到一位小数tvalue=f[j];t=tvalue/1000;wrcom(0x80+0x41);wrdat(table1[t]);//显示百位t=tvalue%1000/100;wrdat(table1[t]);//显示十位t=tvalue%100/10;wrdat(table1[t]);//显示个位wrdat(0x2e); //显示小数点儿t=tvalue%10/1;wrdat(table1[t]);//显示小数位delayms(5000);}}/****主函数****/void main(){d1=1;d2=1;sp=1;displayinit();//初始化显示while(1){tmstart();//初始化read_dealtemp();//读取温度}}/****序列号读取程序****/#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit DQ = P1^1; //温度传感器信号线sbit rs = P1^4; //LCD数据/命令选择端(H/L)位声明sbit lcden = P1^6; //LCD使能信号端位声明void delay(uint z); //延时函数void DS18B20_Reset(void); //DQ18B20复位,初始化函数bit DS18B20_Readbit(void); //读1位数据函数uchar DS18B20_ReadByte(void); //读1个字节数据函数void DS18B20_WriteByte(uchar dat); //向DQ18B20写一个字节数据函数void LCD_WriteCom(uchar com); //1602液晶命令写入函数void LCD_WriteData(uchar dat); //1602液晶数据写入函数void LCD_Init();//LCD初始化函数void Display18B20Rom(char Rom); //显示18B20序列号函数/**********************************************//* 主函数*//**********************************************/void main(){ uchar a,b,c,d,e,f,g,h;LCD_Init();DS18B20_Reset();delay(1);DS18B20_WriteByte(0x33);delay(1);a = DS18B20_ReadByte();b = DS18B20_ReadByte();c = DS18B20_ReadByte();d = DS18B20_ReadByte();e = DS18B20_ReadByte();f = DS18B20_ReadByte();g = DS18B20_ReadByte();h = DS18B20_ReadByte();LCD_WriteCom(0x80+0x40);Display18B20Rom(h);Display18B20Rom(g);Display18B20Rom(f);Display18B20Rom(e);Display18B20Rom(d);Display18B20Rom(c);Display18B20Rom(b);Display18B20Rom(a);while(1);}/***************************************************//* 延时函数:void delay() *//* 功能:延时函数*//***************************************************/void delay(uint z)//延时函数{uint x,y;for( x = z; x > 0; x-- )for( y = 110; y > 0; y-- );}/***************************************************//* DS18B20函数:void DS18B20_Reset() *//* 功能:复位18B20 *//***************************************************/void DS18B20_Reset(void)//DQ18B20复位,初始化函数{uint i;DQ = 0;i = 103;while( i > 0 ) i--;DQ = 1;i = 4;while( i > 0 ) i--;}/***************************************************//* DS18B20函数:void DS18B20_Readbit() *//* 功能:读1个字节数据函数*//***************************************************/bit DS18B20_Readbit(void) //读1位数据函数{uint i;bit dat;DQ = 0;i++; //i++起延时作用DQ = 1;i++;i++;dat = DQ;i = 8;while( i > 0 )i--;return( dat );}/***************************************************//* DS18B20函数:void DS18B20_ReadByte() *//* 功能:读1个字节数据函数*//***************************************************/uchar DS18B20_ReadByte(void) //读1个字节数据函数{uchar i,j,dat;dat = 0;for( i = 1; i <= 8; i++ ){j = DS18B20_Readbit();dat = ( j << 7 ) | ( dat >> 1 );}return(dat);}/***************************************************//* DS18B20函数:void DS18B20_WriteByte() *//* 功能:向DQ18B20写一个字节数据函数*//***************************************************/void DS18B20_WriteByte(uchar dat) //向DQ18B20写一个字节数据函数{uint i;uchar j;bit testb;for( j=1; j<=8; j++){testb = dat&0x01;dat= dat>>1;if(testb) //写1{DQ = 0;i++;i++;DQ = 1;i = 8;while(i>0)i--; }else{DQ = 0; //写0 i = 8;while(i>0)i--; DQ = 1;i++;i++;}}}/* LCD函数:void LCD_WriteCom() *//* 功能:向LCD写入命令*//***********************************************/void LCD_WriteCom(uchar com){rs = 0;P3= com;delay(5);lcden = 0;delay(5);lcden = 1;delay(5);lcden = 0;}/***********************************************//* LCD函数:void LCD_WriteData(uchar dat) *//* 功能:向LCD写入数据*/void LCD_WriteData(uchar dat){rs = 1; //选择LCD为写入数据状态lcden = 0;P3= dat; //将待写入数据放到总线上delay(5);lcden = 1; //给LCD使能端一个脉冲delay(5); //信号将之前放到总线上lcden = 0; //的数据写入LCDdelay(5);}/***********************************************//* LCD函数:void LCD_Init() *//* 功能:初始化LCD,设定LCD的初始状态*/void LCD_Init(){LCD_WriteCom(0x38); //LCD显示模式设定delay(15);LCD_WriteCom(0x08); //关闭LCD显示delay(3);LCD_WriteCom(0x01); //LCD显示清屏delay(3);LCD_WriteCom(0x06); //设定光标地址指针为自动加1delay(3);LCD_WriteCom(0x0c); //打开LCD显示,但不显示光标}/**********************************************//* *//* 显示18B20序列号*//* *//**********************************************/void Display18B20Rom(char Rom){uchar h,l;l = Rom & 0x0f; //取低4位h = Rom & 0xf0; //取高4位h >>= 4;if( ( h >= 0x00 )&&( h <= 0x09 ) )LCD_WriteData(h+0x30);//取ASCII码elseLCD_WriteData(h+0x37);//取ASCII码if( ( l >= 0x00 )&&( l <= 0x09 ) )LCD_WriteData(l+0x30);//取ASCII码elseLCD_WriteData(l+0x37);//取ASCII码}。
DS18B20温度测量报警 设定温度上下限
DS18B20温度测量报警设定温度上下限分类:单片机2011-10-07 19:42 719人阅读评论(1) 收藏举报#include <reg52.h>#include <stdio.h>uchar DQ;uchar k;sbit ds=P2^4; //温度传感器引脚;sbit beep=P2^0; //蜂鸣器uint temp;float ftemp;uchar g1=22,g2=24,d1=20,d2=18;sbit b=P2^3; //定义按键;sbit a=P2^2; //定义按键;sbit E=P2^7;//使能信号;sbit RW=P2^6;//读写选择写指令RS=0;RW=0;D0~D7指令码;E高脉冲;sbit RS=P2^5;//数据/命令选择写数据RS=1;RW=0;D0~D7数据;E高脉冲uchar code table1[]="DS18B20 OK ! ";uchar code table2[]="TEMP IS: . ";//自定义字符显示'C ;uchar code table[8] = {0x16,0x09,0x08,0x08,0x08,0x09,0x06,0x00} ;uchar code table3[]="DS18B20 ERR0R !";uchar code table4[]="PLEASE CHECK !";uchar code table7[]="set standard "; uchar code table8[]=" tempreture ! "; uchar code table5[]="G1= ,G2= .";uchar code table6[]="D1= ,D2= .";void delay(uint z) //延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) //液晶写指令;{P1=com;RS=0;RW=0;E=1;delay(5);E=0;delay(5);}void write_date(uchar date) //液晶写数据;{P1=date;RS=1;RW=0;E=1;delay(5);E=0;delay(5);}void chushi(){uchar f;write_com(0x80);f=0;while(table7[f]!=0){write_date(table7[f]);f++;}write_com(0x80+0x40);f=0;while(table8[f]!=0){write_date(table8[f]);f++;}}void init() //液晶初始化状态;{write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);chushi();}dsreset(void) //DS18B20复位初始化函数{uint i;ds=0;i=103;while(i>0) i--;ds=1;i=4;while(i>0) i--;DQ=ds;i=4;while(i>0) i--;return DQ;}bit tempreadbit(void) //读一位数据函数{uint i;bit dat;ds=0;i++;ds=1;i++;i++;dat=ds;i=8;while(i>0) i--;return(dat);}uchar tempread(void) //读一个字节数据函数{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tempreadbit();dat=(j<<7)|(dat>>1);}return(dat);}void tempwritebyte(uchar dat) //写一个字节数据函数{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb) //写1{ds=0;i++;i++;ds=1;i=8;while(i>0) i--;}else //写0{ds=0;i=8;while(i>0) i--;ds=1;i++;i++;}}}void tempchange(void) //DS18B20 开始获取温度并转换{dsreset();delay(1);tempwritebyte(0xcc);tempwritebyte(0x44);}uint get_temp() //读取寄存器中存储的温度数据{uchar a,b;dsreset();delay(1);tempwritebyte(0xcc);tempwritebyte(0xbe);a=tempread();b=tempread();temp=b;temp<<=8;temp=temp|a;ftemp=temp*0.0625;temp=ftemp*10+0.5;ftemp=ftemp+0.05;return temp;}void init_com(void) //串口初始化;{PCON=0x00;SCON=0x50;TMOD=0x20;TH1=0xfd;TL1=0xfd;TR1=1;}void comm(char *parr) //串口发送;do{SBUF=*parr++;while(!TI);TI=0;}while(*parr!='\0');}void zdy() //自定义字符显示’C;{ uchar i;write_com(0x40);for(i=0;i<9;i++)write_date(table[i]);write_com(0x80+0x40+14);write_date(0x00);}void ok() //温度传感器存在显示温度;{uchar i;write_com(0x80);for(i=0;i<16;i++)write_date(table1[i]);write_com(0x80+0x40);for(i=0;i<16;i++)write_date(table2[i]);}void error() //温度传感器不存在显示错误;uchar i;write_com(0x80);for(i=0;i<16;i++)write_date(table3[i]);write_com(0x80+0x40);for(i=0;i<16;i++)write_date(table4[i]);}void display() //液晶显示温度;{write_com(0x80+0x40+10);write_date(temp/100+0x30); write_com(0x80+0x40+11);write_date(temp%100/10+0x30); write_com(0x80+0x40+13);write_date(temp%100%10+0x30); }void fmq(uint i) //蜂鸣器滴答;{beep=0;delay(i);beep=1;}void dywd(uchar add,uchar date) //定义温度液晶显示;{uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);}void di() //蜂鸣器滴答;{beep=0;delay(100);beep=1;}uint keyscan() //按键扫描,调标准温度;{uchar f;if(a==0){delay(10);if(a==0){k++;while(!a);di();write_com(0x80);f=0;while(table5[f]!=0){write_date(table5[f]);f++;}write_com(0x80+0x40); f=0;while(table6[f]!=0){write_date(table6[f]);f++;}dywd(4,g1);dywd(12,g2);dywd(4+0x40,d1); dywd(12+0x40,d2);if(k==1){write_com(0x80+5); write_com(0x0f);}if(k==2){write_com(0x80+13); write_com(0x0f);}if(k==3){write_com(0x80+0x40+5); write_com(0x0f);}if(k==4){write_com(0x80+0x40+13); write_com(0x0f);}if(k==5){write_com(0x0c);}}}if(k!=0){if(b==0){delay(10);if(b==0){while(!b);di();if(k==1){g1--;if(g1==0)g1=60;dywd(4,g1);write_com(0x80+5);}if(k==2){g2--;if(g1==0)g2=60;dywd(12,g2);write_com(0x80+13);}if(k==3){d1--;if(g1==0)d1=60;dywd(4+0x40,d1);write_com(0x80+0x40+5); }if(k==4){d2--;if(g1==0)d2=60;dywd(12+0x40,d2);write_com(0x80+0x40+13); }}}}return g1;return g2;return d1;return d2;}void warn(uint temp) //温度报警;{uchar a=d2,b=d1,c=g1,d=g2;if(temp<=a*10) //灯1,2 亮;{P0=0xfc;fmq(250);display();}else if((temp<b*10)&&(temp>=a*10)) //灯3 亮; {P0=0xfb;fmq(20);display();}else if((temp<c*10)&&(temp>=a*10)) //灯4,5 亮;{P0=0xe7;display();beep=1;}if((temp>c*10)&&(temp<d*10)) //灯6 亮;{P0=0xdf;fmq(20);display();}else if(temp>=d*10) //灯7,8 亮;{P0=0x3f;fmq(250);display();}}void main() //主函数{uchar buff[4];init_com(); //串口初始化;init(); //液晶初始化状态;dsreset(); //DS18B20复位初始化函数;tempchange(); //DS18B20 开始获取温度并转;get_temp(); //读取寄存器中存储的温度数据while(1){keyscan();if(k==5){ok(); //温度传感器存在程序;do{tempchange();sprintf(buff,"%f",ftemp);comm(buff); //串口发送;zdy();warn(get_temp());}while(!DQ);error(); //温度传感器不存在程序;do{fmq(1);dsreset();P0=0x00;}while(DQ);}}。
DS18B20 显示温度并增加上下限值设定报警功能-爱上芒果果汁-搜狐博客
sbit fmq=P3^6;
位选:小数 sbit w1=P2^4; //
位选:符号 sbit w2=P2^3; //
“.”
位选:个位 sbit w3=P2^2; //
位选:十位 sbit w4=P2^1; //
位选:负值 正值不显示 sbit w5=P2^0; //
“-”
数码管位数 uchar n=0; //
if(!key1) key_back=1;
else if(!key2) key_back=2; else if(!key3) key_back=3;
等待按键释放 while(!key1 | !key2 | !key3); //
} } return key_back; }
函数功能:按键处理 /*****************************************************
#define uchar unsigned char
uchar xiao,ge,shi,symbol;
uchar flag,tltemp; //负温度标志 和临时暂存变量
uchar TL; uchar TH; uchar TN;
/////储储/储存存存暂暂温存存度器器的的的整温温数度度部高低分位位
uchar TD; //储存温度的小数部分
/************************************************************************
以下是DS18B20的操作程序
************************************************************************/ sbit DQ=P3^0;
基于DS18B20_的温度测量报警系统
0 引言温度测量方法较多,根据温度传感器的使用方式,通常可以把温度测量方法分为接触式法测温法和非接触式法测温法。
热敏电阻是最常用的接触式测温法之一,其广泛应用于工农业生产中。
传统的热敏电阻传感器需要搭配测量电路和其他电路进行信号处理,导致其可靠性、准确度和精确度降低[1]。
针对上述问题,美国DALLAS公司新推出了一种新型数字温度传感器-DS18B20,它具有功耗低、抗干扰能力强等优点[2]。
该文介绍了一种以DS18B20数字传感器和AT89C51系列单片机为核心的环境温度测量报警系统,该系统不仅可以实时测量温度,而且还可以根据用户需要,当环境温度出现异常时进行报警提醒。
同时,测得的温度数据会实时显示在输出设备上,为用户提供实时温度。
其硬件部分主要包括时钟电源电路、数码管显示电路、温度测量报警电路以及独立开关按键电路,软件部分主要包括独立按键触发检测程序、温度异常判决程序。
该系统结构简单、成本较低且抗干扰能力极高,可以应用于农业种植温室室温监测等场景,帮助相关产业提高工作效率,降低建设和维护所需的成本。
1 理论及方案设计DS18B20模块是一款由美国DALLAS半导体公司设计的数字温度传感器,它具有成本低廉、传输高效以及电路简单的特点。
该模块工作电压范围宽(3.0 V~5.5 V),并且当电源反接时不会立即烧毁。
DS18B20模块具有4种工作模式,对应4种不同的分辨率和转换时间。
通过改变配置寄存器中的R1位和R0位(R0\R1是配置寄存器中的2个数位)可以对DS18B20模块的工作模式进行设置,不同模式的工作参数见表1。
表1 工作效率参考数据分辨率/位最高转换时间/ms R1R0 993.750010187.500111375.001012750.0011整个测温系统分为的4个板块(如图1所示),通过与AT89C51系列单片机进行交互,共同完成环境温度监测报警工作。
时钟和电源为整个系统提供工作环境,独立按键可以帮助用户设置温度的上、下限,DS18B20模块将测得的实时温度发送给单片机,单片机将数据输出至显示模块(反馈给用户)。
基于AT89S52的DS18B20温度测量警报系统方案
•绿色•蓝色•红色•桃红色•黑色•褐色2011年4月13日14:51:35 星期三高级搜索|地图|TAG标签|RSS订阅【设为首页】【加入收藏】•主页•基础知识•电子元件•电源电路•音频电路•安防电路•家电电路•控制电路•遥控电路•单片机类•电子制作•店铺搜索热门标签:•电路•功率•输出•开关•光电•振荡•电•天线•指示•材料自定义搜索当前位置:主页> 电子制作>基于AT89S52的DS18B20温度测量、报警系统时间:2010-11-02 12:32来源:益奇电子作者:益奇电子点击: 82次基于AT89S52的DS18B20温度测量、报警系统基于AT89S52的DS18B20温度测量、报警系统电源电路:外接6---12V直流电通过CON3接入,C5滤波,U3稳压,C4滤波输出5V电压为整个电路供电。
时钟电路:采用部时钟方式产生CPU所需的操作时序,定时元件Y1用12MHz;电容C2,C3选33pF。
键盘输入:由P3.1---P3.3输入,其中S1为模式切换;S2为温度减;S3为温度增。
复位电路:由C1和R1组成上电复位电路。
</span></span></span></p>数据输入:DS18B20的数据由P3.6口输入,J2是外接传感器的插座,可通过S5来选择。
报警输出:P3.7口输出,由Q5驱动LS1蜂鸣器发声,CON2是外接报警执行器件的插座。
显示电路:S4是4位LED数码管,由P1口输出扫描选通信号;由P2口输出数字段码信号。
1.温度测量围0~99.9摄氏度2.可设置上限报警温度、下限报警温度3.预留外接传感器和报警执行器件接口,实用方便。
硬件连接图:部份源代码:/*****初始化定时器0*****/void InitTimer(void){TMOD=0x1;TH0=0x3c;TL0=0xb0; //50ms(晶振12M)}/*****定时器0中断服务程序*****/void timer0(void) interrupt 1{TH0=0x3c;TL0=0xb0;x++;}/*****外部中断0服务程序*****/void int0(void) interrupt 0{EX0=0; //关外部中断0if(DEC==0&&set_st==1){shangxian--;if(shangxian<xiaxian)shangxian=xiaxian; }else if(DEC==0&&set_st==2){xiaxian--;if(xiaxian<0)xiaxian=0;}}/*****外部中断1服务程序*****/void int1(void) interrupt 2{EX1=0; //关外部中断1if(ADD==0&&set_st==1){shangxian++;if(shangxian>99)shangxian=99;}else if(ADD==0&&set_st==2){xiaxian++;if(xiaxian>shangxian)xiaxian=shangxian; }}/*****读取温度*****/void check_wendu(void){uint a,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;} //设置温度显示上限}.............程序下载用KEIL C51编译后烧录进AT89S52即可。
基于DS18B20的温度监控报警系统
二 硬件电路设计
2.1 系统方案论证
2.1.1 应用普通温度传感器的温度控制报警系统: 使用普通温度传感器的温度控制报警系统工作原理如下图 2-1 所示。 采用热敏电阻, 可满足 40℃至 90℃测量范围,但热敏电阻精度、重复性、可靠性较差,对于检测 1℃的 信号是不适用的。而且在温度测量系统中,采用单片温度传感器,比如 AD590,LM35 等。但 这些芯片输出的都是模拟信号,必须经过 A/D 转换后才能送给单片机,这样就使得测温装 置的结构较复杂。另外,这种测温装置的一根线上只能挂一个传感器,不能进行多点测量。 即使能实现,也要用到复杂的算法,一定程度上也增加了软件实现的难度。
1.2 功能介绍
笔者设计的这一款温度控制报警器能够显示即时测量温度,并进行监控,能方便直观 的设置报警温度的上下限,当温度值超过或者低于设置的上下限时,能够进行报警和降温 处理。该系统使用 DS18B20 集成温度传感器测温,七段数码管显示温度和温度上下限, AT89C52 单片机进行温度控制处理。
基于 DS18B20 传感器的温度监控报警系统
摘 要
DS18B20 是一种高精度数字式温度传感器,由于其具有单总线的独特优点,可以使用 户轻松地组建起传感器网络,并可使多点温度测量电路变得简单、可靠。本文结合实际使 用经验, 介绍了 DS18B20 数字温度传感器在单片机下的硬件连接及软件编程, 并给出了软 件流程图。 该系统芯片使用了 ATMEL 公司的 AT89C51 单片机和 DALLAS 公司的 DS18B20 数字温度 传感器。该系统可应用于微机机箱温度控制、仓库测温、楼宇空调控制和生产过程监控等 领域。 关键字:温度测量; 单总线; 数字温度传感器; 单片机
九州职业技术学院 05 届专科生毕业设计
基于DS18B20的高精度温度采集、显示系统
2、设计分析及系统方案设计通过DS18B20进行小数11位温度转换、采集,通过单片机读取DS18B20采集到的11位温度值进行二进制到十六进制的转换,利用ZLG7290进行八位数码管显示;利用键盘进入中断来设定报警上、下限,当温度高于上限或低于下限时进入报警子程序。
利用键盘进入中断来查看当前设置的温度报警上下限值,利用ZLG7290和数码管来显示。
主程序不断循环采集温度比较,并可随时进入中断来修改温度上下限和查看温度值。
3、外围接口模块硬件电路功能描述1.DS18B20:用于测定温度,测量范围-55~+125,分辨率为0.0625℃,数据格式为二进制补码形式。
2.ZLG7290B:用于数码管动态显示驱动,键盘扫描管理。
能够驱动8位共阴极结构的LED数码管或64位独立的LED,同时还能扫描管理多达64个按键的扫描识别,其中八个键可以作为功能键使用。
接口采用I²C结构。
3.蜂鸣器:这里用作报警,为无源蜂鸣器。
设置DS18B20端口参数THI_WARNING EQU 40HTLI_WARNING EQU 41HTEMPER_FLAG EQU 42H ;温度符号位数据保存区TEMPER_POINT EQU 43H ;温度小数部分数据保存区TEMPER EQU 44H ;温度整数部分数值保存区TEMPER_H EQU 45H ;温度整数部分高位数值保存区TEMPER_L EQU 46H ;温度整数部分低位数值保存区TI_SHOW EQU 47H ;十进制温度整数部分数值保存区T_SAVE EQU 48HTEMPER_NUM EQU 60HFLAG1 BIT 00HDQ BIT P3.3;******************************;设置ZLG7290端口参数;******************************SDA BIT P1.0SCL BIT P1.1WSLA EQU 70HRSLA EQU 71HDISDA EQU 20HDISCON EQU 08H;*********************************ORG 8000HLJMP 8100HORG 8003HLJMP INT_7290;*********************************;初始化部分;*********************************ORG 8100HMOV SP,#60HCLR P1.7LCALL DELAYSETB P1.7;***************************;开中断,设置报警上下限值;**************************MOV TMOD,#11HMOV TL1,#0FCHMOV TH1,#4BHSETB TR1SETB EX0SETB EASETB IT0MOV THI_WARNING,#22HMOV TLI_WARNING,#20H;******************************************************************************;主程序部分;******************************************************************************LP1:LCALL GET_TEMPER ;从DS18B20读取温度数据LCALL TEMPER_COV ;转换读取的温度整数、符号位和小数部分数据并保存LCALL DATA_PRO;数码管显示前对要显示数据的相关处理LCALL LEDSHOW ;数码管显示程序MOV A,TEMPERCJNE A,TLI_WARNING,WAR;判断温度值是否低于报警下限值,低于则报警,不低于则判断WAR:JNC LOOP10;是否大于报警上限值LCALL BUZZL ;蜂鸣器报警程序SJMP LP1LOOP10:CJNE A,THI_WARNING,WAR1;判断温度值是否低于报警下限值,低于则报警,不低于则跳转WAR1:JC LP2LCALL BUZZH ;蜂鸣器报警程序SJMP LP1LP2: LCALL NOTWINKLE;对ZLG7290写入不闪烁控制字LJMP LP1;******************************************************************************;获取DS18B20温度值子程序;******************************************************************************GET_TEMPER:SETB DQBCD:LCALL INIT_1820 JB FLAG1,S22LJMP BCDS22:LCALL DELAY1MOV A,#0CCHLCALL WRITE_1820MOV A,#44HLCALL WRITE_1820LCALL DELAYCBA:LCALL INIT_1820 JB FLAG1,ABCLJMP CBAABC:LCALL DELAY1MOV A,#0CCHLCALL WRITE_1820MOV A,#0BEHLCALL WRITE_1820LCALL READ_18200RETWRITE_1820:MOV R2,#8CLR CWR1:CLR DQMOV R3,#6DJNZ R3,$RRC AMOV DQ,CMOV R3,#23DJNZ R3,$SETB DQNOPDJNZ R2,WR1SETB DQRETREAD_18200:MOV R4,#2MOV R1,#46HRE00:MOV R2,#8RE01:CLR CSETB DQNOPCLR DQNOPNOPSETB DQMOV R3,#2DJNZ R3,$MOV C,DQMOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE01MOV @R1,ADEC R1DJNZ R4,RE00RET;****************************************************************************** ;DS18B20温度值提取整数部分、符号位和小数部分的子程序;******************************************************************************TEMPER_COV:MOV A,#0F0HANL A,TEMPER_LSWAP AMOV TEMPER_NUM,AMOV A,TEMPER_HANL A,#07HSWAP AADD A,TEMPER_NUMMOV TEMPER_NUM,AMOV TEMPER,TEMPER_NUMMOV A,#0FHANL A,TEMPER_LSWAP AMOV TEMPER_POINT,AMOV A,TEMPER_HANL A,#08HSWAP AMOV TEMPER_FLAG,ARET;整数和小数的位偏移数据存储;****************************************************************************** ;30H——37H为数据存储区,其中30H--33H为小数值;34H--35H为整数值,36为百位值,37为符号位值;****************************************************************************** DATA_PRO:MOV 37H,#0AHMOV A,TEMPER_FLAGJZ POSITIVEMOV A,TEMPERCPL AANL A,#7FHADD A,#01HMOV TEMPER,AMOV 37H,#0BH POSITIVE: MOV A,TEMPERCJNE A,64H,SETHUNDREDBIT SETHUNDREDBIT:JC SETHUNDREDBIT1SUBB A,#64HMOV TEMPER,AMOV 36H,#01HSJMP SET1 SETHUNDREDBIT1: MOV 36H,#00HSET1: MOV A,TEMPERMOV B,#10DIV ABMOV 34H,BMOV 35H,AMOV A,TEMPER_POINTCLR CRLC ASWAP ARR AJNZ POINT1MOV 30H,#00HMOV 31H,#00HMOV 32H,#00HMOV 33H,#00HSJMP SHOWPOINT1: DEC AJNZ POINT2MOV 30H,#05HMOV 31H,#02HMOV 32H,#06HMOV 33H,#00HSJMP SHOWPOINT2: DEC AJNZ POINT3MOV 30H,#00HMOV 31H,#05HMOV 32H,#02HMOV 33H,#01HSJMP SHOWPOINT3: DEC AJNZ POINT4MOV 30H,#05HMOV 31H,#07HMOV 32H,#08HMOV 33H,#01HSJMP SHOWPOINT4: DEC AJNZ POINT5MOV 30H,#00HMOV 31H,#00HMOV 32H,#05HMOV 33H,#02HSJMP SHOW POINT5: DEC AJNZ POINT6MOV 30H,#05HMOV 31H,#02HMOV 32H,#06HMOV 33H,#00HSJMP SHOW POINT6: DEC AJNZ POINT7MOV 30H,#00HMOV 31H,#05HMOV 32H,#07HMOV 33H,#03HSJMP SHOW POINT7:MOV 30H,#05HMOV 31H,#07HMOV 32H,#03HMOV 33H,#04H SHOW: JNC SHOW1MOV A,33HADD A,#05H MOV 33H,A SHOW1:RET;****************************************************************************** ;ZLG7290数据显示部分子程序;******************************************************************************LEDSHOW: PUSH 00H PUSH 01H PUSH 02H PUSH 03HPUSH 07MOV DPTR,#LEDSEGCLR AMOV R7,#08HMOV R0,#20HMOV R1,#30H LOOP1:MOV A,@R1MOVC A,@A+DPTR MOV @R0,AINC R1INC R0DJNZ R7,LOOP1MOV A,24HADD A,#01HMOV 24H,ALOOP: MOV R7,#08H MOV R0,#20HMOV R2,#10HMOV R3,#WSLALCALL WRNBYTLCALL DELAY0POP 07HPOP 03HPOP 02HPOP 01HPOP 00HRET;******************************************************************************;延时子程序DELAY0: PUSH 00HPUSH 01HMOV R0,#00H DELAY2: MOV R1,#00H DJNZ R1,$DJNZ R0,DELAY2POP 01HPOP 00HRET DELAY1: MOV R7,#20H DJNZ R7,$RET DELAY: PUSH 00HPUSH 01HMOV R0,#00LP: MOV R1,#00HDJNZ R1,$DJNZ R0,LPPOP 01HPOP 00HRET;****************************************************************************** ;蜂鸣器子程序;******************************************************************************BUZZL:PUSH 04H MOV R4,#200 MOV TL0,#66HMOV TH0,#0FCHSETB TR0LOOP002:JNB TF0,$CLR TF0CPL P3.4MOV TL0,#55HMOV TH0,#0FCHDJNZ R4,LOOP002LCALL TWINKLEPOP 04HRETBUZZH:PUSH 04HMOV R4,#128MOV TL0,#66HMOV TH0,#0FCHSETB TR0LOOP003:JNB TF0,$CLR TF0CPL P3.4MOV TL0,#55HMOV TH0,#0FCHDJNZ R4,LOOP003LCALL TWINKLEPOP 04HRET;****************************************************************************** ;数码管闪烁子程序;******************************************************************************TWINKLE:PUSH 00HPUSH 02HPUSH 03HPUSH 07HMOV 38H,#70HMOV 39H,#0FFHMOV R7,#02HMOV R0,#38HMOV R2,#07HMOV R3,#WSLALCALL WRNBYTMOV 3AH,#00HMOV R7,#01HMOV R0,#3AHMOV R2,#0CHMOV R3,#WSLALCALL WRNBYTPOP 07HPOP 03HPOP 02HPOP 00HRET NOTWINKLE:PUSH 00HPUSH 02HPUSH 03HPUSH 07HMOV 38H,#70HMOV 39H,#00HMOV R7,#02HMOV R0,#38HMOV R2,#07HMOV R3,#WSLALCALL WRNBYTMOV 3AH,#00HMOV R7,#01HMOV R0,#3AHMOV R2,#0CH MOV R3,#WSLA LCALL WRNBYT POP 07HPOP 03HPOP 02HPOP 00H RET;****************************************************************************** ;中断子程序;****************************************************************************** INT_7290:PUSH 00HPUSH 01HPUSH 02HPUSH 03HPUSH 04HPUSH 07HPUSH ACCPUSH PSWLCALL NOTWINKLEMOV 50H,#00HMOV 51H,#00HMOV 52H,#00HMOV 53H,#00HMOV 54H,#00HMOV 55H,#00HMOV 56H,#00HMOV 57H,#00HLOOP_1: CLR CLCALL DISP1JB P3.2,$LCALL INITREADMOV A,29HDEC ACJNE A,#0FH,DOWN ;判断是F键吗,是F关中断退出SJMP TAIL1DOWN: CJNE A,#0EH,DOWN1 ;判断是E键吗,是E显示设定的温度上限MOV A,THI_WARNINGMOV B,#10DIV ABMOV DPTR,#LEDSEGMOVC A,@A+DPTRMOV 51H,AMOV A,BMOVC A,@A+DPTRMOV 50H,AMOV 52H,#12HMOV 53H,#6EHLCALL DISP1JB P3.2,$SJMP TAIL1DOWN1:CJNE A,#0DH,DOWN2 ;判断是D键吗,是D显示设定的温度下限 MOV A,TLI_WARNINGMOV B,#10DIV ABMOV DPTR,#LEDSEGMOVC A,@A+DPTRMOV 51H,AMOV A,BMOVC A,@A+DPTRMOV 50H,AMOV 52H,#12HMOV 53H,#1CHLCALL DISP1JB P3.2,$SJMP TAIL1DOWN2: CJNE A,#0CH,DOWN3 ;判断是C键吗,是C设定的温度下限MOV 50H,#00HMOV 51H,#00HMOV 52H,#12HMOV 53H,#1CHLCALL SET_TLIMITMOV TLI_WARNING,T_SAVEJB P3.2,$SJMP TAIL1DOWN3:CJNE A,#0BH,TAIL1 ;判断是B键吗,是B设定的温度上限MOV 52H,#12HMOV 53H,#6EHLCALL SET_TLIMITMOV THI_WARNING,T_SAVEJB P3.2,$SJMP TAIL1TAIL1: CLR IE0 ;必须清标志POP PSWPOP ACCPOP 07HPOP 04HPOP 03HPOP 02HPOP 01HPOP 00HRETI;****************************************************************************** ;设置报警温度上下限值子程序;****************************************************************************** SET_TLIMIT:LCALL DISP1AGAIN:JB P3.2,$LCALL INITREADMOV A,29HDEC ACJNE A,#0FH,STEP1SJMP TAILSTEP1:CJNE A,#0DH,STEP2SJMP AGAINSTEP2:CJNE A,#0CH,STEP3 SJMP AGAINSTEP3:CJNE A,#0BH,STEP4 JNC AGAINSTEP4:CJNE A,#0AH,STEP5JNC AGAINSTEP5: MOV T_SAVE,AMOV DPTR,#LEDSEGMOVC A,@A+DPTRMOV 51H,ALCALL DISP1 AGAIN1: JB P3.2,$LCALL INITREAD NOPMOV A,29HDEC ACJNE A,#0FH,STEP11 SJMP TAILSTEP11: CJNE A,#0DH,STEP12 SJMP AGAIN1STEP12: CJNE A,#0CH,STEP13 SJMP AGAIN1 STEP13:CJNE A,#0BH,STEP14 SJMP AGAIN1 STEP14:CJNE A,#0AH,STEP15 SJMP AGAIN1STEP15: MOV 50H,AMOV A,T_SAVEMOV B,#10MUL ABADD A,50HMOV T_SAVE,AMOV A,50HMOV DPTR,#LEDSEGMOVCA,@A+DPTRMOV 50H,ALCALL DISP1TAIL:RET;****************************************************************************** ;数码管显示子程序;******************************************************************************DISP1: PUSH 00H PUSH 02HPUSH 03HPUSH 04HPUSH 07HMOV R7,#08HMOV R0,#50HMOV R2,#10HMOV R3,#WSLA LCALL WRNBYT LCALL DELAY POP 07HPOP 04HPOP 03HPOP 02HPOP 00HRET;****************************************************************************** ;读取键值子程序;******************************************************************************INITREAD:MOV R0,#29H MOV R7,#01H MOV R2,#01HMOV R3,#WSLA MOV R4,#RSLA LCALL RDADD RET;****************************************************************************** ;初始化DS18B20子程序;******************************************************************************INIT_1820:SETB DQNOPCLR DQMOV R0,#80HTSR1:DJNZ R0,TSR1SETB DQMOV R0,#25HTSR2:DJNZ R0,TSR2JNB DQ,TSR3LJMP TSR4TSR3:SETB FLAG1 LJMP TSR5TSR4:CLR FLAG1 LJMP TSR7TSR5: MOV R0,#06BH TSR6:DJNZ R0,TSR6 TSR7:SETB DQRET;*********************************;ZLG7290相关子程序;*********************************;(1)带有内部单元地址的多字节写操作子程序 WRNBYT;******************************************************************* ;通用的I2C通讯子程序(多字节写操作);入口参数R7字节数,R0:源数据块首地址;R0原数据块首地址;R2从器件内部子地址;R3:外围器件地址(写);WRBYT、STOP、CACK、STA;******************************************************************* WRNBYT: PUSH PSWPUSH ACCWRADD: MOV A,R3 ;取外围器件地地址(包含r/w=0)LCALL STA ;发送起始信号SLCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,WRADD ;如果应MOV A,R2LCALL WRBYT ;发送内部寄存器首地址LCALL CACK ;检测外围器件的应答信号JB F0,WRADD ;如果应答不正确返回重来WRDA: MOV A,@R0LCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,WRADD ;如果应答不正确返回重来INC R0DJNZ R7,WRDALCALL STOPPOP ACCPOP PSWRET;(2)带有内部单元地址的多字节读操作子程序 RDADD;******************************************************************* ;通用的I2C通讯子程序(多字节读操作);入口参数R7字节数;;R0目标数据块首地址;R2从器件内部子地址;;R3器件地址(写);R4器件地址(读);WRBYT、STOP、CACK、STA、MNACK;******************************************************************* RDADD: PUSH PSW ;从PCF8563的02H单元读入7个参数PUSH ACC ;存放于20H-26H单元RDADD1: LCALL STAMOV A,R3 ;取器件地址(写)LCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,RDADD1 ;如果应答不正确返回重来MOV A,R2 ;取内部地址LCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,RDADD1 ;如果应答不正确返回重来LCALL STAMOV A,R4 ;取器件地址(读)LCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,RDADD1 ;如果应答不正确返回重来RDN: LCALL RDBYTMOV @R0,ADJNZ R7,ACKLCALL MNACKLCALL STOPPOP ACCPOP PSWRETACK: LCALL MACKINC R0SJMP RDN;(3)I2C各个信号子程序;********************************************************************** ; 启动信号子程序S;**********************************************************************STA: SETB SDA ;启动信号S SETB SCLNOP ;产生4.7US延时NOPNOPNOPNOPCLR SDA NOP ;产生4.7US延时NOPNOPNOPNOPCLR SCLRET;********************************************************************** ; 停止信号子程序P;*********************************************************************STOP: CLR SDA ;停止信号P SETB SCLNOP ;产生4.7US延时NOPNOPNOPNOPSETB SDA NOP ;产生4.7US延时NOPNOPNOPNOPCLR SCLCLR SDARET;********************************************************************** ; 应答信号子程序 MACKMACK: CLR SDA ;发送应答信号ACK SETB SCLNOP ;产生4.7US延时NOPNOP NOPNOPCLR SCL SETB SDA RET;********************************************************************** ; 非应答法信号子程序MNACK;**********************************************************************MNACK:SETB SDA ;发送非应答信号NACK SETB SCLNOP ;产生4.7US延时NOPNOP NOPNOPCLR SCL CLR SDA RET;********************************************************************** ; 应答检测子程序CACK;**********************************************************************CACK: SETB SDA;应答位检测子程序SETB SCLCLR F0MOV C,SDA ;采样SDAJNC CEND;应答正确时转CENDSETB F0;应答错误时F0置一CEND: CLR SCLRET;********************************************************************** ; 发送一个字节子程序WRBYT;**********************************************************************WRBYT: PUSH 06HMOV R6,#08H;发送一个字节子程序WLP: RLC A ;(入口参数A)MOV SDA,CSETB SCLNOP ;产生4.7US延时NOP NOPNOPNOPCLR SCL DJNZ R6,WLP POP 06H RET;********************************************************************** ; 接收一个字节子程序RDBYTRDBYT: PUSH 06HMOV R6,#08H ;接收一个字节子程序RLP: SETB SDASETB SCL; *******************************************NOP ;!!!!!产生大于15微秒的延时!!!!!!NOP ;注意这是专门为ZLG7290NOP ;添加的20微秒延时部分NOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOP; ********************************************MOV C,SDAMOV A,R2RLC AMOV R2,ACLR SCLDJNZ R6,RLP ;(出口参数R2)POP 06HRET;********************************************************************** LEDSEG:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4H,0FEH,0F6H,00H,02H END。
基于DS18B20的温度采集系统
值 的 低 四 位 , 对 MSB 取 低 三 位 作 为温度值的高位, 整个温度的变化 范围为 0~99。
(六)结果显示 将当前的读取的并经过处理的 温 度 值 用 P0 口 和 部 分 P2 口 显 示 到数码管上, 便于观察, 同时在数 码管的右端将手工设定的温度值显 示出来, 便于对比, 通过按键可以 手工设定温度上限。 (七)键盘功能 用 p3.2 和 p3.4 作为按键输入, 实现对温度极限的手工设置, 其中 p3.2 用来实现减值操作, p3.4 完成 增值操作, CPU 将完成预置温度值 和读取温度值的比较, 两者相等则 固定显示当前温度, 否则同时显示 预置温度和读取温度。 (八)控制部分 通 过 P1 口 将 处 理 过 的 信 号 传 送给 DAC0832 进行模拟量的输出, 该 模 拟 量 经 过 LM324 放 大 , 作 为 控制信号输出。 (九)异步通信 通过异步串行接口将处理过的 温 度 信 号 发 送 给 远 端 的 监 控 PC, 采用 8 位异步通信方式, 波特率为
( 张远晖 编校)
26
《 空中交通管理》 2010 年 第 9 期
如 图 1 所 示 为 总 体 设 计 逻 辑 分辨率可达 0.0625℃, 被测温度用
图。
符号扩展 的 16 位 数 字 量 方 式 串 行
三、 系统功能描述
输出; 其工作电源从远端引入; 多
本 系 统 通 过 DS18B20 温 度 传 个 DS18B20 可 以 并 联 到 3 根 或 2
感器完成对温度的采集; 用左端两 根线上, CPU 只需一根端口线就能
并 处 理 过 的 温 度 值 发 送 给 PC, 作 端模拟温 度 信 号 的 采 集 , 以 12 位
Air Traffic Management/2010(9)
基于DS1820的温度采集系统设计
DCS1820温度采集系统的设计摘要DS18B20的温度采集系统利用下位机设置温度上下限和实时温度的采集,并将结果传输到上位机,以达到对温度的比较、控制。
本设计用MCS-51单片机为主要硬件,设计了包括温度采集,温度显示,系统控制,串口通信等外围电路。
在温度测量部分采用具有“一线总线”接口的数字传感器DS18B20,实现单线多点数据的采集。
关键词:DS1820温度传感器单片机通信接口目录摘要 0前言 (2)第一章温度采集显示系统的设计要求和设计方案 (3)1.1 系统设计任务 (3)1.2 功能要求 (3)1.3 方案论证和选定 (3)第二章温度采集系统外部器件的设计 (5)2.1 总体分析 (5)2.2 8051单片机的性能及应用 (6)2.3 DS18B20芯片简介 (11)2.4 DS18B20原理及应用 (13)2.5 DS18B20与单片机的典型接口设计 (26)2.6 DS18B20使用中注意事项 (27)第三章硬件设计 (29)3.1 硬件电路设计的功能简介 (29)3.2 硬件设计部分的组成 (30)3.3 硬件电路图 (31)第四章软件电路的设计 (32)4.1 系统功能 (31)4.2 系统流程图 (31)4.3 DS18B20温度采集源程序 (32)第五章联机调试和分析 (39)结论 (39)参考文献 (40)致谢.......................................... 错误!未定义书签。
附录1 图片 (41)附录2 Proteus仿真软件电路图 (42)前言在日常生活及工农业生产中经常要用到温度的检测及控制,传统的测温元件有热电偶和热电阻。
而热电偶和热电阻测出的一般都是电压,再转换成对应的温度,需要比较多的外部硬件支持,硬件电路复杂,软件调试复杂,制作成本高。
由DALLAS出品的新型的单路串行数字温度传感器DS18B20,完成温度测量、分析、判断阈值、输出功能。
基于18b20的温度采集系统
目录摘要 (1)一、设计任务和要求 (3)二、系统方案 (3)三、方案设计与论证 (4)四、程序流程图 (8)五:元器件清单 (19)六、结果分析 (19)七、总结 (20)八、设计体会与今后的改进意见 (20)附录:………………………………………………………………………………………………………….摘要本文介绍了基于DS18B20的温度实时采集与显示系统的设计与实现。
设计中选取单片机STC89C52作为系统控制中心,数字温度传感器DS18B20作为单片机外部信号源,精度较好的数码管来显示温度。
利用单片机程序来完成对STC18B20与AT89C52的控制,最终实现温度的实时采集与显示。
关键词:DS18B20 STC89C52 温度采集数码管Abstract: This paper introduces the temperature based on STC18B20 real-time data acquisition and display system design and implementation. Design of STC89C52 as system selection single-chip microcomputer control center, and digital temperature sensor DS18B20 as external sources, microcontroller accuracy than good digital tube to display temperature. Using microcontroller program to accomplish DS18B20 and AT89C52 single control temperature, and finally achieve the real-time data acquisition and display. Keywords: DS18B20 AT89C52 single temperature gathering digital tube.一、设计任务和要求1、利用DS18B20实现温度采集,并用数码管显示。
ds18b20温度上下限原理
ds18b20温度上下限原理DS18B20是一种数字温度传感器,可用于测量环境温度。
它具有温度上下限的功能,可以根据需求进行设置并进行相应的控制。
本文将介绍DS18B20温度上下限的原理及其应用。
我们需要了解DS18B20传感器的工作原理。
DS18B20采用单总线通信协议进行数据传输,具有较高的精度和稳定性。
它由温度传感器、数字转换器和存储器组成。
传感器将环境温度转换为电压信号,经过数字转换器转换为数字信号,并存储在存储器中。
DS18B20的温度上下限功能是通过编程来实现的。
用户可以通过编写代码来设置传感器的温度上下限,并根据需要进行相应的控制。
设置温度上下限可以帮助我们监测环境温度,并在温度超过设定范围时发出警报或触发其他操作。
为了实现温度上下限的功能,我们需要先读取传感器的温度值,然后与设定的上下限进行比较。
如果温度超过设定的上限,我们可以发出警报或触发其他操作;如果温度低于设定的下限,我们也可以进行相应的处理。
通过这种方式,我们可以及时发现温度异常情况,并采取措施进行调整。
DS18B20传感器的温度上下限功能可以广泛应用于各种场景。
例如,在温室种植中,我们可以设置温度上限,当温度超过设定值时,自动开启通风设备进行降温;在温控系统中,我们可以设置温度上下限,当温度超过或低于设定范围时,自动调节供暖或制冷设备;在冷链物流中,我们可以设置温度上下限,当温度超过或低于设定范围时,及时采取措施保证货物的质量与安全。
除了温度上下限功能,DS18B20还具有其他优点。
首先,它的精度高,可以达到0.5摄氏度。
其次,它的响应速度快,可以在几毫秒内完成温度转换。
此外,DS18B20还具有防水、防尘的特性,适用于各种恶劣环境中的温度测量。
DS18B20温度传感器的温度上下限功能可以帮助我们实时监测环境温度,并根据需要进行相应的控制。
通过设置温度上下限,我们可以及时发现温度异常情况,并采取措施进行调整。
DS18B20传感器具有高精度、快速响应和防水防尘的特点,适用于各种应用场景。
基于DS18B20的温度报警器设计
基于DS18B20的温度报警器设计温度报警器是一种用于监测环境温度并在温度超过设定阈值时发出警报的设备。
基于DS18B20的温度报警器设计可以通过连接DS18B20数字温度传感器和微控制器来实现。
以下是一个基于DS18B20的温度报警器设计的详细描述。
1.硬件设计:-DS18B20温度传感器:DS18B20是一款数字温度传感器,其具有高精度、数字输出、单线传输等特点。
它可以直接与微控制器连接,并通过单线总线协议进行通信。
将其中一根引脚连接到微控制器的GPIO引脚上,并使用上拉电阻将其拉高,以实现简单的单线通信。
- 微控制器:选择一款适合的微控制器,例如Arduino、Raspberry Pi等。
微控制器应该具有足够的GPIO引脚用于连接其他外设,并具备相应的数据处理能力。
-报警器:可以选择蜂鸣器、发光二极管(LED)或其他适合的报警器作为报警设备。
这些设备应具有较大的声光输出,以便及时警示。
2.软件设计:-初始化:在程序中初始化设备的GPIO引脚,并设置它们的输入输出方式。
同时,初始化DS18B20传感器,启动单线总线通信。
-温度读取:通过发送相应的命令,从DS18B20传感器读取当前的温度值。
DS18B20的温度数据以二进制形式存储,并使用一定的协议进行传输。
通过解析二进制数据,并进行适当的计算,可以获得温度值。
-温度比较:将读取到的温度值与设定的阈值进行比较。
如果温度超过阈值,则触发报警。
-报警控制:当温度超过设定阈值时,触发报警器的开启。
该过程涉及控制报警设备的GPIO引脚,使其输出足够的声音或亮度,以引起用户的注意。
-报警复位:当温度降低到设定阈值以下时,关闭报警器。
通过控制报警设备的GPIO引脚,将其输出设置为低电平,以停止声音或亮度。
3.报警策略:-阈值设置:根据具体应用的需求,设定适当的温度阈值。
根据环境和使用要求,选择报警温度和报警时刻。
可以通过软件界面或外部调节器调整阈值。
-报警反馈:为了确保用户能够及时获得报警信息,可以通过增加报警设备的数量或设置报警通知的方式来提高报警反馈。
ds18b20中写入报警上下限值
#inclu de<in trins.h> #inclu de<re g52.h>#in clude<absa cc.h>#def ine u int unsig ned i nt#d efine ucha r uns igned char#def ine l iangt ime 100 //设置闪烁时间#def ine m ietim e 100 #de fineMaxRa te 50 //重复前的延迟值600MS#def ine M inRat e 20//重复速度240M S#de fine N 2//设定去抖时间//定时器1的时间常数和方式控制字2ms#defi ne V_TH0 (65535-10000)/256#de fineV_TL0 (65535-10000)%256#defi ne V_TMOD0x01sbitds18b20_IO=P1^0;sbi t duX=P2^7; //段选使能s bit w eX=P2^6; //位选使能sbit K1=P3^7; //设置键sbi t K2=P3^5; //加数键sb it K3=P3^6; //减数键s bit K4=P3^4;sb it le d4=P1^3; sbitled8=P1^7;sbit sda=P1^2;sb it s cl=P1^1;u charbuffe r[]={0,0,0,0,0,0,0,0}; //数码管键显缓存u char *pb=&buff er[0];uch ar codeduma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管段码表ucha r cod e wem a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选ucha r te mpL,t empH;ucha r ta sk; //tas k:按键状态,0:去抖,1:重复的延缓,2:重复bit keydo ne,ke yproc ess;//keyd one:按键任务完成标志,为1时已完成//keyp roces s:按键有效标志,为1时对按键执行bi t sh ans; //s hans为闪烁使能位,1时L ED闪,s hanz为闪烁状态位,bit sha nz; //1时为灭bi t ke ymark; //设定状态标志位uch ar b link; //闪烁控制器,某位为1时闪烁。
基于51单片机DS18B20温度采集器详解
一核心器件的基本构成及特性1.1 AT89S51功能特性89C51是INTEL公司MCS-51系列单片机中基本的产品,它采用INTEL公司可靠的CHMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品。
它结合了HMOS的高速和高密度技术及CHMOS的低功耗特征,它基于标准的MCS-51单片机体系结构和指令系统,属于80C51基础型单片机版本,集成了时钟输出和向上或向下计数器等更多的功能。
89C51内置8位中央处理单元、256字节内部数据存储器RAM、8k片内程序存储器(ROM)32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。
此外,89C51还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。
在空闲模式下冻结CPU 而RAM定时器、串行口和中断系统维持其功能。
掉电模式下,保存RAM数据,时钟振荡停止,同时停止芯片内其它功能。
89C51有PDIP(40pin)和PLCC(44pin)两种封装形式。
1.2 AT89S51管脚介绍AT89C51单片机是把那些作为控制应用所必需的基本内容都集成在一个尺寸有限的集成电路芯片上。
如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM)、并行I/O口(4个8位I/O口)、串行口、定时器/计数器、中断系统及特殊功能寄存器。
它们都是通过片内单一总线连接而成,其基本结构依旧是微处理器(CPU)加上外围芯片的传统结构模式。
但对各种功能部件的控制是采用特殊功能寄存器的集中控制方式,以实现不同的功能。
AT89C51单片机如图所示。
1.1.1引脚功能介绍Vcc(40引脚):接+5V电源。
Vss(20引脚):接地。
XTAL1(19引脚):片内振荡器反相放大器和时钟发生器电路的输入端。
XTAL2(18引脚):片内震荡器反相放大器的输出端。
RST:复位引脚,高电平有效。
DS18B20温度恒定上下限可调报警器汇总
目录内容提要 (1)关键字 (1)引言 (1)二、设计方案 (2)2.1设计任务和要求 (2)2.2方案辩证 (3)1温度计软件设计流程图 (3)2元器件的选取 (4)3系统最终设计方案 (4)三、设计方案的总体设计框图 (4)3.1硬件电路框图 (4)3.2硬件电路概述 (5)3.3主控电路 (5)3.4显示电路 (6)3.5报警温度调节电路 (7)3.6温度传感器及DS18B20测温原理 (7)3.7 升降温调节电路 (7)四、系统软件算法设计 (8)4.1主程序 (9)4.2读出温度子程序 (9)4.3温度转换命令子程序 (10)4.4 计算温度子程序 (10)4.5 显示数据刷新子程序 (10)4.6 1602的液晶显示 (10)五、软件仿真 (10)5.1系统仿真设计 (11)5.2系统仿真原理图 (13)5.2系统原理图 (14)结与体会 (15)附录 (15)一.【内容摘要】随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同种类的传感器,可实现诸如电压、湿度、温度、速度、硬度、压力等的物理量的测量。
本文将介绍一种基于单片机控制理论及其应用系统设计的数字温度计。
本文主要介绍了一个基于AT89C51单片机的测温系统,详细描述了利用数字温度传感器DS18B20开发测温系统的过程,重点对传感器在单片机喜爱的硬件连接,软件编程以及各模块系统流程进行了详尽分析,对各部分的电路也进行一一介绍,该系统可以方便的是实现温度采集和显示,并可以根据需要任意设定上下限报警温度,它使用起来方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合我们日常生活和工农业生产中的温度测量,也可以当做温度处理模块嵌入其他系统中,作为其他主系统的辅助扩展。
DS18B20和AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合与恶劣环境下进行现场温度测量,有广泛的应用前景。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void Delay(uint num)
{
while( --num );
}
/*****初始化定时器0*****/
void InitTimer(void)
{
TMOD=0x1;
TH0=0x3c;
TL0=0xb0; //50ms(晶振12M)
}
/*****定时器0中断服务程序*****/
uchar set_st=0; //状态标志
signed char shangxian=38; //上限报警温度,默认值为38
signed char xiaxian=5; //下限报警温度,默认值为38
uchar code LEDData[]=
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
#include <AT89X52.h>
#include "DS18B20.h"
#define uint unsigned int
#define uchar unsigned char //宏定义
#define SET P1_4 //定义调整键
#define DEC P1_5 //定义减少键
#define ADD P1_6 //定义增加键
Disp_Temperature();
Alarm(); //报警检测
}
else if(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);}
void main(void)
{
uint z;
InitTimer(); //初始化定时器
EA=1; //全局中断开关
TR0=1;
ET0=1; //开启定时器0
IT0=1;
IT1=1;
check_wendu();
check_wendu();
for(z=0;z<300;z++)
{
Disp_init();
void timer0(void) interrupt 1
{
TH0=0x3c;
TL0=0xb0;
x++;
}
/*****外部中断0服务程序*****/
void int0(void) interrupt 0
{
EX0=0; //关外部中断0
if(DEC==0&&set_st==1)
{
shangxian--;
if(shangxian<xiaxian)shangxian=xiaxian;
}
else if(DEC==0&&set_st==2)
{
xiaxian--;
if(xiaxian<0)xiaxian=0;
}
}
/*****外部中断1服务程序*****/
void int1(void) interrupt 2
}
}
/*****报警子程序*****/
void Alarm()
{
if(x>=10){beep_st=~beep_st;x=0;}
if((m>=shangxian&&beep_st==1)||(m<xiaxian&&beep_st==1))BEEP=0;
else BEEP=1;
}
/*****主函数*****/
}
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();
}
else if(set_st==2)
{
BEEP=1; //关闭蜂鸣器
EX0=1; //开启外部中断0
EX1=1; //开启外部中断1
if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
if(shanshБайду номын сангаасo_st) {Disp_alarm(xiaxian);}
}
}
}
{
EX1=0; //关外部中断1
if(ADD==0&&set_st==1)
{
shangxian++;
if(shangxian>99)shangxian=99;
}
else if(ADD==0&&set_st==2)
{
xiaxian++;
if(xiaxian>shangxian)xiaxian=shangxian;
#define BEEP P1_7 //定义蜂鸣器
bit shanshuo_st; //闪烁间隔标志
bit beep_st; //蜂鸣器间隔标志
sbit DIAN = P2^7; //小数点
uchar x=0; //计数器
signed char m; //温度值全局变量
uchar n; //温度值全局变量