當前位置:編程學習大全網 - 編程語言 - 尋求 DS18B20+89C51單片機+蜂鳴器報警同時LED燈亮的溫度報警程序,匯編\C語言都可以,謝謝。

尋求 DS18B20+89C51單片機+蜂鳴器報警同時LED燈亮的溫度報警程序,匯編\C語言都可以,謝謝。

接口自己看清楚。程序如下

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

#include "reg51.h"

#include "intrins.h" //_nop_();延時函數用

#include "math.h"

#define disdata P0 //段碼輸出口

#define discan P2 //掃描口

#define uchar unsigned char

#define uint unsigned int

sbit duqu=P3^6; //溫度輸入口

sbit dian=P0^7; //LED小數點控制

sbit beep=P1^6; //蜂鳴器

sbit key0=P3^0;

sbit key1=P3^1;

sbit key02=P3^2;

sbit key03=P3^3;

sbit led0=P1^0; //紅燈

sbit led1=P1^1; //綠燈

sbit led2=P1^2; //黃燈

uint h;

uint temp;

uchar r;

char high=40,low=15;

uchar sign;

uchar st=1;

uchar ti;

uchar pp;

uchar ee;

uchar nn;

//**************溫度小數部分用查表法***********//

uchar code ditab[16]=

{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

//

uchar code dis_7[15]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x00,0x40,0x76,0x38,0x39};

//***陰LED段碼表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" "H" "L" "C"

uchar code scan_con[4]={0x70,0xb0,0xd0,0xe0}; //列掃描控制字

uchar data temp_data[2]={0x00,0x00}; //讀出溫度暫放

uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //顯示單元數據,***4個數據和壹個運算暫用

/*****************11us延時函數*************************/

void delay(uint t)

{

for (;t>0;t--);

}

/****************顯示掃描函數***************************/

void scan()

{

char k;

for(k=0;k<4;k++) //4位LED掃描控制

{

discan=scan_con[k]; //位選

disdata=dis_7[display[k]]; //數據顯示

if (k==1){dian=1;} //小數點顯示

delay(200);

}

}

/****************DS18B20復位函數************************/

ow_reset(void)

{

char presence=1;

while(presence)

{

while(presence)

{

duqu=1;_nop_();_nop_(); //從高拉倒低

duqu=0;

delay(50); //550 us

duqu=1;

delay(6); //66 us

presence=duqu; //presence=0 復位成功,繼續下壹步

}

delay(45); //延時500 us

presence=~duqu;

}

duqu=1; //拉高電平

}

/****************DS18B20寫命令函數************************/

//向1-WIRE 總線上寫1個字節

void write_byte(uchar val)

{

uchar i;

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

{

duqu=1;_nop_();_nop_(); //從高拉倒低

duqu=0;_nop_();_nop_();_nop_();_nop_(); //5 us

duqu=val&0x01; //最低位移出

delay(6); //66 us

val=val/2; //右移1位

}

duqu=1;

delay(1);

}

/****************DS18B20讀1字節函數************************/

//從總線上取1個字節

uchar read_byte(void)

{

uchar i;

uchar value=0;

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

{

duqu=1;_nop_();_nop_();

value>>=1;

duqu=0;_nop_();_nop_();_nop_();_nop_(); //4 us

duqu=1;_nop_();_nop_();_nop_();_nop_(); //4 us

if(duqu)value|=0x80;

delay(6); //66 us

}

duqu=1;

return(value);

}

/****************讀出溫度函數************************/

uint read_temp()

{

ow_reset(); //總線復位

delay(200);

write_byte(0xcc); //發命令

write_byte(0x44); //發轉換命令

ow_reset();

delay(1);

write_byte(0xcc); //發命令

write_byte(0xbe);

temp_data[0]=read_byte(); //讀溫度值的第字節

temp_data[1]=read_byte(); //讀溫度值的高字節

temp=temp_data[1];

temp<<=8;

temp=temp|temp_data[0]; // 兩字節合成壹個整型變量。

return temp; //返回溫度值

}

/****************溫度數據處理函數************************/

//二進制高字節的低半字節和低字節的高半字節組成壹字節,這個

//字節的二進制轉換為十進制後,就是溫度值的百、十、個位值,而剩

//下的低字節的低半字節轉化成十進制後,就是溫度值的小數部分

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

work_temp(uint tem)

{

uchar n=0;

nn=0;

if(tem>6348) // 溫度值正負判斷

{tem=65536-tem;n=1;nn=1;} // 負溫度求補碼,標誌位置1

display[4]=tem&0x0f; // 取小數部分的值

display[0]=ditab[display[4]]; // 存入小數部分顯示值

display[4]=tem>>4; // 取中間八位,即整數部分的值

display[3]=display[4]/100; // 取百位數據暫存

display[1]=display[4]%100; // 取後兩位數據暫存

display[2]=display[1]/10; // 取十位數據暫存

display[1]=display[1]%10;

r=display[1]+display[2]*10+display[3]*100;

/******************符號位顯示判斷**************************/

if(!display[3])

{

display[3]=0; //最高位為0時不顯示

if(!display[2])

{

display[2]=0; //次高位為0時不顯示

}

}

if(n){display[3]=0x0b;} //負溫度時最高位顯示"-"

}

/******************蜂鳴器報警函數**************************/

void BEEP()

{

if(r>=high||r<=low)

{

beep=1;led1=1;

if(r>=high)

{

led0=0;led2=1;

}

else if (r<=low)

{

led2=0;led0=1;

}

}

else if ((nn==1)&&(r>=abs(low)))

{

led2=0;led0=1;beep=1;led1=1;

}

else

{

beep=0;led1=0;led0=1;led2=1;

}

}

/******************初始化函數**************************/

void init()

{

beep=0;

EA=1;

EX0=0;

EX1=0;

IT0=1;

IT1=1;

TMOD=0x11;

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

TH1=(65536-833)/256;

TL1=(65536-833)%256;

sign=0;

ti=high;

}

/******************溫度/上下限調整切換**************************/

void key11()

{

while(key1==0)

{

delay(300);

if(key1==0)

{

st++;

if(st==4)

st=1;

}

while(!key1);

delay(300);

while(!key1);

}

}

/******************切換調整上下限**************************/

void key10()

{

while(key0==0)

{

delay(300); //消抖動

if(key0==0)

{

sign=!sign;

}

while(!key0);

delay(300);

while(!key0);

}

}

/******************上下限加1**************************/

void key2()

{

while(key02==0)

{

delay(400);

if(key02==0)

{

if(sign)

{ low=low+1;

if(low>high)

{pp=low;low=high;high=pp;}

}

else

{high=high+1;ti=high;}

}

while(!key02);

delay(400);

while(!key02);

}

}

/******************上下限減1**************************/

void key3()

{

while(key03==0)

{

delay(400);

if(key03==0)

{

if(sign)

low=low-1;

else

{ high=high-1;ti=high;

if(low>high)

{pp=low;low=high;high=pp;}

}

}

while(!key03);

delay(400);

while(!key03);

}

}

/******************上限溫度顯示**************************/

void high1()

{

uchar k;

if(high<100)

{ display[0]=high%10;

display[1]=high/10;

display[2]=10;

display[3]=12;

for(k=0;k<4;k++)

{

discan=scan_con[k];

disdata=dis_7[display[k]];

if (k==1){dian=0;}

delay(300);

disdata=0x00;

delay(100);

}

}

else

{

display[0]=high%10;

display[1]=high%100/10;

display[2]=high/100;

display[3]=12;

for(k=0;k<4;k++)

{

discan=scan_con[k];

disdata=dis_7[display[k]];

if (k==1){dian=0;}

delay(300);

disdata=0x00;

delay(100);

}

}

}

/******************下限溫度顯示**************************/

void low1()

{

uchar ki;

if(low>=0)

{ display[0]=low%10;

display[1]=low/10;

display[2]=10;

display[3]=13;

for(ki=0;ki<4;ki++)

{

discan=scan_con[ki];

disdata=dis_7[display[ki]];

if (ki==1){dian=0;}

delay(100);

disdata=0x00;

delay(100);

}

}

else

{

ee=abs(low);

display[0]=ee%10;

display[1]=ee/10;

display[2]=11;

display[3]=13;

for(ki=0;ki<4;ki++)

{

discan=scan_con[ki];

disdata=dis_7[display[ki]];

if (ki==1){dian=0;}

delay(100);

disdata=0x00;

delay(100);

}

}

}

/****************主函數************************/

void main()

{

init();

disdata=0x00; //初始化端口

discan=0x00;

for(h=0;h<4;h++) //開機顯示"0000"

{display[h]=0;}

ow_reset(); //開機先轉換壹次

write_byte(0xcc); //Skip ROM

write_byte(0x44); //發轉換命令

for(h=0;h<100;h++) //開機顯示"0000"

{scan();}

while(1)

{

switch(st) //分支

{

case 1:{

work_temp(read_temp());

scan(); //顯示溫度

BEEP();

break;

}

case 2: {

high1(); // 顯示上限溫度

key10();

key2();

key3();

break;

}

case 3: {

low1(); //顯示下限溫度

key10();

key2();

key3();

break;

}

}

key11();

}

}

//***********************結束**************************//

  • 上一篇:天下手遊全新勢力副本皇陵寶庫上線,開學季壹起探險去
  • 下一篇:求十部關於機器人戰鬥的電影
  • copyright 2024編程學習大全網