基于ds18b20的温度采集报警系统(上下限可调)

合集下载

基于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多路温度采集程序

本程序为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温度测量报警 设定温度上下限

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 显示温度并增加上下限值设定报警功能-爱上芒果果汁-搜狐博客

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_的温度测量报警系统

基于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温度测量警报系统方案

基于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的温度监控报警系统

基于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的高精度温度采集、显示系统

基于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。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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; //温度值全局变量
相关文档
最新文档