ds18b20+扬声器做的简易温度报警(仿真+源码)仿真再附上的图片里
源码比较简单,就是检测温度是否达到31度,是的话就启动扬声器
下载:
Desktop.rar
(66.96 KB, 下载次数: 23)
单片机源程序如下:
- /*******************************************************************************
- 程序功能:实时采集当前环境温度值,并显示于数码管上。
- 同时,当温度高于某一值时(此处设为31摄氏度),蜂鸣器便会发出报警。
- 而当低于该值时,蜂鸣器自动停止报警。
- 试验时,可用手触摸DS18B20,使其温度升高到31度,观察现象。
- *****************************************************************************/
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DS=P2^2; //define interface
- uint temp; // variable of temperature
- uchar flag1; // sign of the result positive or negative
- sbit dula=P2^6;
- sbit wela=P2^7;
- sbit beep=P2^3;
- unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xa0,0x83,0xc6,0xa1,0x84,0x8e};
- unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
- void delay(uint count) //delay
- {
- uint i;
- while(count)
- {
- i=200;
- while(i>0)
- i--;
- count--;
- }
- }
- void dsreset(void) //send reset and initialization command
- {
- uint i;
- DS=0;
- i=103;
- while(i>0)i--;
- DS=1;
- i=4;
- while(i>0)i--;
- }
- bit tmpreadbit(void) //read a bit
- {
- uint i;
- bit dat;
- DS=0;i++; //i++ for delay
- DS=1;i++;i++;
- dat=DS;
- i=8;while(i>0)i--;
- return (dat);
- }
- uchar tmpread(void) //read a byte date
- {
- uchar i,j,dat;
- dat=0;
- for(i=1;i<=8;i++)
- {
- j=tmpreadbit();
- dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
- }
- return(dat);
- }
- void tmpwritebyte(uchar dat) //write a byte to ds18b20
- {
- uint i;
- uchar j;
- bit testb;
- for(j=1;j<=8;j++)
- {
- testb=dat&0x01;
- dat=dat>>1;
- if(testb) //write 1
- {
- DS=0;
- i++;i++;
- DS=1;
- i=8;while(i>0)i--;
- }
- else
- {
- DS=0; //write 0
- i=8;while(i>0)i--;
- DS=1;
- i++;i++;
- }
- }
- }
- void tmpchange(void) //DS18B20 begin change
- {
- dsreset();
- delay(1);
- tmpwritebyte(0xcc); // address all drivers on bus
- tmpwritebyte(0x44); // initiates a single temperature conversion
- }
- uint tmp() //get the temperature
- {
- float tt;
- uchar a,b;
- dsreset();
- delay(1);
- tmpwritebyte(0xcc);
- tmpwritebyte(0xbe);
- a=tmpread();
- b=tmpread();
- temp=b;
- temp<<=8; //two byte compose a int variable
- temp=temp|a;
- tt=temp*0.0625;
- temp=tt*10+0.5;
- return temp;
- }
- void display(uint temp) //显示程序
- {
- uchar A1,A2,A2t,A3;
- A1=temp/100;
- A2t=temp%100;
- A2=A2t/10;
- A3=A2t%10;
- dula=0;
- P0=table[A1]; //显示百位
- dula=1;
- dula=0;
- wela=0;
- P0=0x01;
- wela=1;
- wela=0;
- delay(1);
- dula=0;
- P0=table1[A2]; //显示十位
- dula=1;
- dula=0;
- wela=0;
- P0=0x02;
- wela=1;
- wela=0;
- delay(1);
- P0=table[A3]; //显示个位
- dula=1;
- dula=0;
- P0=0x04;
- wela=1;
- wela=0;
- delay(1);
- }
- void main()
- {
- uchar a;
- do
- {
- tmpchange();
- for(a=10;a>0;a--)
- {
- display(tmp());
- }
- if(temp>=310) //当温度超过31度(仅作试验用,实际可设为其他更高的值),蜂鸣器便会报警。
- {
- P1=0x00;
- beep=0;
- }
- else
- {
- beep=1;
- P1=0xff;
- }
- } while(1);
- }
复制代码
|