ds18b20+揚聲器做的簡易溫度報警(仿真+源碼)仿真再附上的圖片里
源碼比較簡單,就是檢測溫度是否達到31度,是的話就啟動揚聲器
下載:
Desktop.rar
(66.96 KB, 下載次數: 23)
2018-3-4 09:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
TIM截圖20180304095212.png (77.26 KB, 下載次數: 44)
下載附件
2018-3-4 09:53 上傳
單片機源程序如下:
- /*******************************************************************************
- 程序功能:實時采集當前環境溫度值,并顯示于數碼管上。
- 同時,當溫度高于某一值時(此處設為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);
- }
復制代碼
|