當前位置:編程學習大全網 - 源碼下載 - STC89C52單片機數字溫度傳感器設計 (溫度傳感器是DS18B20) 尋高手幫在C語言程序中加個報警程序。急需。

STC89C52單片機數字溫度傳感器設計 (溫度傳感器是DS18B20) 尋高手幫在C語言程序中加個報警程序。急需。

#include<reg52.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

#define upzero 1

#define downzero 0

uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

uchar code seg[]={0xfe,0xfd,0xfb}; //加了PNP的情況下的段選

sbit DQ=P3^3;

sbit led=P1^1;

sbit DIN=P0^7;//小數點

//sbit LE=P3^0;

uint temperature;

uint wendu,flag=0;

void delay(uchar k)

{

while(--k);

}

void delay1(uint k)

{

uint i,j;

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

for(j=0;j<121;j++);

}

void time0_init()

{

TMOD=0x01;

EA=1;

ET0=1;

TR0=1;

TH0=-30000/256;//定時50毫秒

TL0=-30000%256;

}

/*void init_display()//上電時數碼管的顯示

{

P2=0xff;

delay(3);

} */

void display(uint k)//顯示溫度

{

uchar ge,shi,bai;

ge=k%10;

shi=k/10%10; //shiwei

bai=k/100;

if(!flag)//溫度為負數

{

P2=seg[0];

P0=0xbf;//負號 顯示"-"

delay1(4);

P2=0xff;

P2=seg[1];

P0=tab[k/10%10];

delay1(4);

P2=0xff;

P2=seg[2];

P0=tab[k%10];

//DIN=0;

delay1(4);

P2=0xff;

/*P2=seg[3];

P0=tab[0];

delay1(4);

P2=0xff;

*/

}

if(flag)//溫度為正數 由於實際的焊的板子只有三個數碼管 所以,沒加“+” 了。如 45.0度

{

//DIN=1;

P2=0xff;

P2=seg[0];

P0=tab[0];

delay1(4);

P2=0xff;

P2=seg[1];

P0=tab[ge];

DIN=0; // 問題問什麽 加小數點要在P2口上加才能正常顯示。

delay1(4);

DIN=1;

P2=0xff;

P2=seg[2];

P0=tab[shi];

delay1(4);

P2=0xff;

}

}

/*

每次讀寫前對DS18B20進行復位初始化。復位要求主CPU將數據線下拉500μ

,然後釋放,DS18B20收到信號後等待16 - 60us然後60-240us的存在低脈沖

脈沖,主CPU收到此信號後表示復位成功。

*/

initial_ds18b20()//返回為0表示初始化成功

{

uchar j=0;

DQ=1;//這兩條語句用不用不關緊要

delay(4);

DQ=0;

delay(180);//精確延時 730us 檢測總線上是否有480-960微秒的低電平出現

delay(200);

DQ=1;

delay(15);//35us 如果有總線轉為高電平後等待15-60微秒自動將總線電平拉低60-240微秒做出響應存在脈沖

j=DQ;

delay(50);//105us 至少要100秒以上

//return(j);

}

uchar read_byte(void)

{

uchar i=0,dat;

for(i=0;i<8;i++)

{

DQ=0;

delay(5);//15us

DQ=1;

if(DQ)

dat=(dat>>1)|0x80;//讀1

else

dat=((dat>>1))|0x00;//讀0

delay(25);

}

return(dat);

}

void write_byte(uchar dat)

{

uchar i;

for(i=0;i<8;i++)

{

DQ=0;

delay(5);//15us

DQ=dat&0x01;//從低位到高位 壹位壹位的寫入DS18B20,即控制它的工作方式

delay(10);//寫所需時間

DQ=1;

dat>>=1;

delay(2);

}

delay(1);

}

uchar readwendu(void)

{

//float tt;

uint j=200;

uchar templ=0,temph=0;

initial_ds18b20();

write_byte(0xcc);//跳過ROM

write_byte(0x44);

while(--j);

initial_ds18b20();

write_byte(0xcc);

write_byte(0xbe);

templ=read_byte();//低位

temph=read_byte();//高位

if(temph>0x7f)//處理數據 負數

{

temph=~temph;

templ=~templ+1;

flag=downzero;

temph<<=4; //

temph+=(templ&0xf0)>>4;//

wendu=temph;//

delay(10);

}

else //正數

{

flag=upzero;

temph<<=4; // 左移四位 留壹位符號位 因為高五位為符號位

temph+=(templ&0xf0)>>4;//低八位的高四位 即低八位的整數部分 再與temph相加得到壹個新的八位

wendu=temph;

delay(10);

}

return(wendu);

}

void main()

{

time0_init();

//init_display();

while(1)

{

temperature=readwendu();

display(temperature);

TR0=1;

}

}

void time0() interrupt 2 //50毫秒判斷 溫度

{

TR0=0;

TH0=-30000/256;

TL0=-30000%256;

if(temperature>25 || temperature<30)

led=~led;

delay(10);

}

這是我做的 能用。 用LED報警 妳也可以添加個聲音報警,溫度都讀出來了,加個報警那是很容易的事,真心懷疑這個程序是不是妳自己寫的

  • 上一篇:誰能告訴我最近股票的漲跌情況?
  • 下一篇:求DOS教程!以及.Bat入門知識。不要網址。我學過C語言、匯編語言
  • copyright 2024編程學習大全網