寻求 DS18B20+89C51单片机+蜂鸣器报警同时LED灯亮的温度报警程序,汇编C语言都可以,谢谢。

寻求 DS18B20+89C51单片机+蜂鸣器报警同时LED灯亮的温度报警程序,汇编C语言都可以,谢谢。,第1张

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

//

#include "reg51h"

#include "intrinsh" //_nop_();延时函数

#include "mathh"

#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();

}

}

//结束//

#include <reg52h>

#include <stdioh>

#define uchar unsigned char

#define uint unsigned int

sbit ds=P2^2; //温度传感器信号线

sbit dula=P2^6; //数码管段选线

sbit wela=P2^7; //数码管位选线

sbit beep=P2^3; //蜂鸣器

uint temp;

float f_temp;

uint warn_l1=260;

uint warn_l2=250;

uint warn_h1=300;

uint warn_h2=320;

sbit led0=P1^0;

sbit led1=P1^1;

sbit led2=P1^2;

sbit led3=P1^3;

unsigned char code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0xbf,0x86,

0xdb,0xcf,0xe6,0xed,

0xfd,0x87,0xff,0xef}; //不带小数点的编码

void delay(uint z)//延时函数

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void dsreset(void) //18B20复位,初始化函数

{

uint i;

ds=0;

i=103;

while(i>0)i--;

ds=1;

i=4;

while(i>0)i--;

}

bit tempreadbit(void) //读1位函数

{

uint i;

bit dat;

ds=0;i++; //i++ 起延时作用

ds=1;i++;i++;

dat=ds;

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

return (dat);

}

uchar tempread(void) //读1个字节

{

uchar i,j,dat;

dat=0;

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

{

j=tempreadbit();

dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里

}

return(dat);

}

void tempwritebyte(uchar dat) //向18B20写一个字节数据

{

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

{

ds=0; //写 0

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

ds=1;

i++;i++;

}

}

}

void tempchange(void) //DS18B20 开始获取温度并转换

{

dsreset();

delay(1);

tempwritebyte(0xcc); // 写跳过读ROM指令

tempwritebyte(0x44); // 写温度转换指令

}

uint get_temp() //读取寄存器中存储的温度数据

{

uchar a,b;

dsreset();

delay(1);

tempwritebyte(0xcc);

tempwritebyte(0xbe);

a=tempread(); //读低8位

b=tempread(); //读高8位

temp=b;

temp<<=8; //两个字节组合为1个字

temp=temp|a;

f_temp=temp00625; //温度在寄存器中为12位 分辨率位00625°

temp=f_temp10+05; //乘以10表示小数点后面只取1位,加05是四舍五入

f_temp=f_temp+005;

return temp; //temp是整型

}

////////////////////显示程序//////////////////////////

void display(uchar num,uchar dat)

{

uchar i;

dula=0;

P0=table[dat];

dula=1;

dula=0;

wela=0;

i=0XFF;

i=i&(~((0X01)<<(num)));

P0=i;

wela=1;

wela=0;

delay(1);

}

void dis_temp(uint t)

{

uchar i;

i=t/100;

display(0,i);

i=t%100/10;

display(1,i+10);

i=t%100%10;

display(2,i);

}

//////////////////////////////////////////////

void warn(uint s,uchar led) //蜂鸣器报警声音 ,s控制音调

{

uchar i;i=s;

dula=0;

wela=0;

beep=0;

P1=~(led);

while(i--)

{

dis_temp(get_temp());

}

beep=1;

P1=0XFF;

i=s;

while(i--)

{

dis_temp(get_temp());

}

}

void deal(uint t)

{

uchar i;

if((t>warn_l2)&&(t<=warn_l1)) //大于25度小于27度

{

warn(40,0x01);

}

else if(t<=warn_l2) //小于25度

{

warn(10,0x03);

}

else if((t<warn_h2)&&(t>=warn_h1)) //小于32度大于30度

{

warn(40,0x04);

}

else if(t>=warn_h2) //大于32度

{

warn(10,0x0c);

}

else

{

i=40;

while(i--)

{

dis_temp(get_temp());

}

}

}

void init_com(void)

{

TMOD = 0x20;

PCON = 0x00;

SCON = 0x50;

TH1 = 0xFd;

TL1 = 0xFd;

TR1 = 1;

}

void comm(char parr)

{

do

{

SBUF = parr++; //发送数据

while(!TI); //等待发送完成标志为1

TI =0; //标志清零

}while(parr); //保持循环直到字符为'\0'

}

void main()

{

uchar buff[4],i;

dula=0;

wela=0;

init_com();

while(1)

{

tempchange();

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

{

dis_temp(get_temp());}

deal(temp);

sprintf(buff,"%f",f_temp);

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

{

dis_temp(get_temp());}

comm(buff);

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

{

dis_temp(get_temp());}

}

}

#include < reg51h >

#include < intrinsh >

#define uchar unsigned char

#define uint unsigned int

#define temp_high 60 //温度报警限设置

uchar data temph;

uchar data templ;

uchar data dat;

uchar temp_buzzer,b,fuhao;

uchar code tab[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};

uchar shi,ge,shifen; //全局变量

bit flag;

sbit DQ=P1^0;

sbit buzzer=P1^7;

void delay_50us(unsigned int t) //每次50us延时,最大误差13us

{

unsigned char j;

for(;t>0;t--)

for(j=19;j>0;j--)

;

}

void delay_2us(unsigned char i) //每次2us精确延时,最大误差6us

{

while(--i);

}

void buzzer_sound() //蜂鸣器报警函数

{

if (temp_buzzer>temp_high)

buzzer=0;

else

buzzer=1;

}

void Display() //LCD 显示函数

{

P2=tab[shi];

P3=0xfd;

delay_50us(20);//十位 延时1ms

P3=0xff;

P2=tab[ge]+0x80;

P3=0xfb;

delay_50us(20);//个位 延时1ms

P3=0xff;

P2=tab[shifen];

P3=0xf7;

delay_50us(20);//十分位 延时1ms

P3=0xff;

}

Ds_Reset() //初始化

{

DQ=1;

_nop_();

_nop_();

DQ=0;

delay_50us(10); //延时513us

DQ=1;

delay_2us(23);//延时53us

flag=DQ;

delay_50us(4);//延时200us

DQ=1;//拉伸至高电平

return(flag);

}

Ds_Read() //读函数

{

uint i;

uchar dat=0x00;

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

{

DQ=0;

_nop_(); //延时1us

dat>>=1;

DQ=1; //释放

_nop_();

_nop_();

_nop_();

if(DQ)

{

dat|=0x80;}

delay_2us(30); // 延时67us

DQ=1;

}

return(dat);

}

void Ds_Write(unsigned char datt)

{

uchar j;

bit bitt;

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

{

bitt=datt&0x01;

DQ=0;

_nop_();

_nop_(); //延时2us

if(bitt)

{

DQ=1;

delay_2us(28);

}

else delay_2us(28); //延时56us

datt>>=1;

DQ=1;

_nop_();

}

}

void Set_Tempchange() //温度转换指令

{

Ds_Reset();

Ds_Write(0xcc);// 跳过读序号列号的 *** 作

Ds_Write(0x44);// 启动温度转

}

void Read_Temp() //读出温度

{

Ds_Reset();

Ds_Write(0xcc);// 跳过读序号列号的 *** 作

Ds_Write(0xBE);// 读RAM数据

templ=Ds_Read();//温度的低八位

temph=Ds_Read();//温度的高八

}

void Change_Temp() //转换温度

{

uchar intn,xiaoshu;

uchar k,temp;

fuhao=temph&0xf8;

if(!fuhao) //正数

{

intn=(temph<<4)|(templ>>4);

xiaoshu=(templ&0x0f)625;

}

else //负数

{

intn=((~temph<<4)|(~templ>>4))+1;

xiaoshu=(((~templ)&0x0f)+1)625;

}

k=templ;

temp=intn;

temp=temp&0x80;

if(temp==0x80)

k=~k+1;

k=k&0x0f;

temp_buzzer=intn;

switch (k)

{

case 0x00: b=0;break;

case 0x01: b=1;break;

case 0x02: b=1;break;

case 0x03: b=2;break;

case 0x04: b=2;break;

case 0x05: b=3;break;

case 0x06: b=3;break;

case 0x07: b=4;break;

case 0x08: b=4;break;

case 0x09: b=5;break;

case 0: b=5;break;

case 0x0b: b=6;break;

case 0x0c: b=7;break;

case 0x0d: b=8;break;

case 0x0e: b=9;break;

case 0x0f: b=9;break;

}

shi=intn%100/10;//十位

ge=intn%10; //个位

shifen=b;//xiaoshu/1000;//十分位

buzzer_sound();

}

void main()

{

uchar i,j;

while(1)

{

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

{

Set_Tempchange();

_nop_();

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

{

Display();

}

Read_Temp(); //将读RAM的函数放到这儿是因为温度的转换要用750ms时间,这里用Display()函数来达到延时效果

Change_Temp();

}

}

}

参考一下喔

#include <AT89X52h>#include "DS18B20h"&nbsp;&nbsp;&nbsp;#define uint unsigned int#define uchar unsigned char&nbsp; &nbsp;//宏定义#define SET&nbsp; P3_1&nbsp;&nbsp;&nbsp;&nbsp;//定义调整键#define DEC&nbsp; P3_2&nbsp;&nbsp;&nbsp;&nbsp;//定义减少键#define ADD&nbsp; P3_3&nbsp;&nbsp;&nbsp;&nbsp;//定义增加键#define BEEP P3_7&nbsp;&nbsp;&nbsp;&nbsp;//定义蜂鸣器bit shanshuo_st;&nbsp;&nbsp;&nbsp;&nbsp;//闪烁间隔标志bit beep_st;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//蜂鸣器间隔标志sbit DIAN = P2^7;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//小数点uchar x=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//计数器signed char m;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//温度值全局变量uchar n;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//温度值全局变量uchar set_st=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//状态标志signed char shangxian=38;&nbsp;&nbsp;//上限报警温度,默认值为38signed char xiaxian=5;&nbsp;&nbsp;&nbsp;//下限报警温度,默认值为38uchar code&nbsp; LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};

/延时子程序/void Delay(uint num){&nbsp;while( --num );}

/初始化定时器0/void InitTimer(void){&nbsp;&nbsp;TMOD=0x1;&nbsp;&nbsp;TH0=0x3c;&nbsp;&nbsp;TL0=0xb0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//50ms(晶振12M)}

/定时器0中断服务程序/void timer0(void) interrupt 1{&nbsp;TH0=0x3c;&nbsp;TL0=0xb0;&nbsp;x++;}

/外部中断0服务程序/void int0(void) interrupt 0{&nbsp;&nbsp;EX0=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关外部中断0&nbsp;if(DEC==0&&set_st==1)&nbsp;{&nbsp;&nbsp;shangxian--;&nbsp;&nbsp;if(shangxian<xiaxian)shangxian=xiaxian;&nbsp;}&nbsp;else if(DEC==0&&set_st==2)&nbsp;{&nbsp;&nbsp;xiaxian--;&nbsp;&nbsp;if(xiaxian<0)xiaxian=0;&nbsp;}}

/外部中断1服务程序/void int1(void) interrupt 2{&nbsp;EX1=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关外部中断1&nbsp;if(ADD==0&&set_st==1)&nbsp;{&nbsp;&nbsp;shangxian++;&nbsp;&nbsp;if(shangxian>99)shangxian=99;&nbsp;}&nbsp;else if(ADD==0&&set_st==2)&nbsp;{&nbsp;&nbsp;xiaxian++;&nbsp;&nbsp;if(xiaxian>shangxian)xiaxian=shangxian;&nbsp;}&nbsp; }

/读取温度/void check_wendu(void){&nbsp;uint a,b,c;&nbsp;c=ReadTemperature()-5;&nbsp;&nbsp;//获取温度值并减去DS18B20的温漂误差&nbsp;a=c/100;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//计算得到十位数字&nbsp;b=c/10-a10;&nbsp;&nbsp;&nbsp;&nbsp;//计算得到个位数字&nbsp;m=c/10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//计算得到整数位&nbsp;n=c-a100-b10;&nbsp;&nbsp;&nbsp;&nbsp;//计算得到小数位&nbsp;if(m<0){m=0;n=0;}&nbsp;&nbsp;&nbsp;//设置温度显示上限&nbsp;if(m>99){m=99;n=9;}&nbsp;&nbsp;&nbsp;//设置温度显示上限&nbsp;&nbsp;&nbsp;&nbsp;}

/显示开机初始化等待画面/Disp_init()&nbsp; &nbsp;&nbsp;{&nbsp;P2 = 0xbf; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//显示-&nbsp;P1 = 0xf7;&nbsp;Delay(200);&nbsp;P1 = 0xfb;&nbsp;Delay(200); &nbsp;&nbsp;&nbsp;P1 = 0xfd;&nbsp;Delay(200);&nbsp;P1 = 0xfe;&nbsp;Delay(200);

&nbsp;P1 = 0xff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//关闭显示}

/显示温度子程序/Disp_Temperature()&nbsp; &nbsp;&nbsp;&nbsp;//显示温度{&nbsp;P2 =0xc6; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//显示C&nbsp;P1 = 0xf7;&nbsp;Delay(300);

&nbsp;P2 =LEDData[n]; &nbsp;&nbsp;&nbsp;//显示个位&nbsp;P1 = 0xfb;&nbsp;Delay(300);

&nbsp;P2 =LEDData[m%10]; &nbsp;&nbsp;&nbsp;//显示十位&nbsp;DIAN = 0;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;//显示小数点&nbsp;P1 = 0xfd;&nbsp;Delay(300);

&nbsp;P2 =LEDData[m/10]; &nbsp;&nbsp;&nbsp;//显示百位&nbsp;P1 = 0xfe;&nbsp;Delay(300);

&nbsp;P1 = 0xff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//关闭显示}

/显示报警温度子程序/Disp_alarm(uchar baojing){&nbsp;P2 =0xc6; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//显示C&nbsp;P1 = 0xf7;&nbsp;Delay(200);

P2=0xff;

&nbsp;P2 =LEDData[baojing%10];&nbsp;//显示十位&nbsp;P1 = 0xfb;&nbsp;P2=0xff;

Delay(200);

&nbsp;P2 =LEDData[baojing/10];&nbsp;//显示百位&nbsp;P1 = 0xfd;&nbsp;P2=0xff;

Delay(200);

&nbsp;if(set_st==1)P2 =0x89;&nbsp;else if(set_st==2)P2 =0xc7;&nbsp;//上限H、下限L标示&nbsp;P1 = 0xfe;&nbsp;Delay(200);

&nbsp;P1 = 0xff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//关闭显示}

/报警子程序/void Alarm(){&nbsp;if(x>=10){beep_st=~beep_st;x=0;}&nbsp;if((m>=shangxian&&beep_st==1)||(m<xiaxian&&beep_st==1))BEEP=0;&nbsp;else BEEP=1;}

/主函数/void main(void){&nbsp;&nbsp;&nbsp; uint z;&nbsp;InitTimer();&nbsp;&nbsp;&nbsp;&nbsp;//初始化定时器&nbsp;EA=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//全局中断开关&nbsp;TR0=1;&nbsp;ET0=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开启定时器0&nbsp;IT0=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IT1=1;&nbsp;check_wendu();&nbsp;check_wendu();&nbsp;for(z=0;z<300;z++)&nbsp;{&nbsp;&nbsp;Disp_init();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;while(1)&nbsp;&nbsp;{&nbsp;&nbsp;if(SET==0)&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;Delay(2000);&nbsp;&nbsp;&nbsp;do{}while(SET==0);&nbsp;&nbsp;&nbsp;set_st++;x=0;shanshuo_st=1;&nbsp;&nbsp;&nbsp;if(set_st>2)set_st=0;&nbsp;&nbsp;}&nbsp;&nbsp;if(set_st==0)&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;EX0=0;&nbsp;&nbsp;&nbsp;&nbsp;//关闭外部中断0&nbsp;&nbsp;&nbsp;EX1=0;&nbsp;&nbsp;&nbsp;&nbsp;//关闭外部中断1&nbsp;&nbsp;&nbsp;&nbsp;check_wendu();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;Disp_Temperature();&nbsp;&nbsp;&nbsp;Alarm();&nbsp;&nbsp;&nbsp;//报警检测&nbsp;&nbsp;}&nbsp;&nbsp;else if(set_st==1)&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;BEEP=1;&nbsp;&nbsp;&nbsp;&nbsp;//关闭蜂鸣器&nbsp;&nbsp;&nbsp;EX0=1;&nbsp;&nbsp;&nbsp;&nbsp;//开启外部中断0&nbsp;&nbsp;&nbsp;EX1=1;&nbsp;&nbsp;&nbsp;&nbsp;//开启外部中断1&nbsp;&nbsp;&nbsp;if(x>=10){shanshuo_st=~shanshuo_st;x=0;}&nbsp;&nbsp;&nbsp;if(shanshuo_st)&nbsp;{Disp_alarm(shangxian);}&nbsp;&nbsp;}&nbsp;&nbsp;else if(set_st==2)&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;BEEP=1;&nbsp;&nbsp;&nbsp;&nbsp;//关闭蜂鸣器&nbsp;&nbsp;&nbsp;EX0=1;&nbsp;&nbsp;&nbsp;&nbsp;//开启外部中断0&nbsp;&nbsp;&nbsp;EX1=1;&nbsp;&nbsp;&nbsp;&nbsp;//开启外部中断1&nbsp;&nbsp;&nbsp;if(x>=10){shanshuo_st=~shanshuo_st;x=0;}&nbsp;&nbsp;&nbsp;if(shanshuo_st)&nbsp;{Disp_alarm(xiaxian);}&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; }}

/END/

DS18B20h:

#include <AT89X52h>#define&nbsp; DQ&nbsp; P3_6&nbsp; &nbsp;&nbsp;&nbsp;//定义DS18B20总线I/O

/延时子程序/void Delay_DS18B20(int num){&nbsp;&nbsp;while(num--) ;}

/初始化DS18B20/void Init_DS18B20(void){&nbsp;&nbsp;unsigned char x=0;&nbsp;&nbsp;DQ = 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//DQ复位&nbsp;&nbsp;Delay_DS18B20(8);&nbsp;&nbsp; &nbsp;//稍做延时&nbsp;&nbsp;DQ = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//单片机将DQ拉低&nbsp;&nbsp;Delay_DS18B20(80);&nbsp; &nbsp;//精确延时,大于480us&nbsp;&nbsp;DQ = 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//拉高总线&nbsp;&nbsp;Delay_DS18B20(14);&nbsp;&nbsp;x = DQ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//稍做延时后,如果x=0则初始化成功,x=1则初始化失败&nbsp;&nbsp;Delay_DS18B20(20);}

/读一个字节/unsigned char ReadOneChar(void){&nbsp;&nbsp;unsigned char i=0;&nbsp;&nbsp;unsigned char dat = 0;&nbsp;&nbsp;for (i=8;i>0;i--)&nbsp;&nbsp;{&nbsp; &nbsp;&nbsp;DQ = 0;&nbsp; &nbsp;&nbsp;&nbsp;// 给脉冲信号&nbsp; &nbsp;&nbsp;dat>>=1;&nbsp; &nbsp;&nbsp;DQ = 1;&nbsp; &nbsp;&nbsp;&nbsp;// 给脉冲信号&nbsp; &nbsp;&nbsp;if(DQ)&nbsp; &nbsp;&nbsp;dat|=0x80;&nbsp; &nbsp;&nbsp;Delay_DS18B20(4);&nbsp;&nbsp;}&nbsp;&nbsp;return(dat);}

/写一个字节/void WriteOneChar(unsigned char dat){&nbsp;&nbsp;unsigned char i=0;&nbsp;&nbsp;for (i=8; i>0; i--)&nbsp;&nbsp;{&nbsp; &nbsp;&nbsp;DQ = 0;&nbsp; &nbsp;&nbsp;DQ = dat&0x01;&nbsp; &nbsp;&nbsp;Delay_DS18B20(5);&nbsp; &nbsp;&nbsp;DQ = 1;&nbsp; &nbsp;&nbsp;dat>>=1;&nbsp;&nbsp;}}

/读取温度/unsigned int ReadTemperature(void){&nbsp;&nbsp;unsigned char a=0;&nbsp;&nbsp;unsigned char b=0;&nbsp;&nbsp;unsigned int t=0;&nbsp;&nbsp;float tt=0;&nbsp;&nbsp;Init_DS18B20();&nbsp;&nbsp;WriteOneChar(0xCC); &nbsp;//跳过读序号列号的 *** 作&nbsp;&nbsp;WriteOneChar(0x44); &nbsp;//启动温度转换&nbsp;&nbsp;Init_DS18B20();&nbsp;&nbsp;WriteOneChar(0xCC); &nbsp;//跳过读序号列号的 *** 作&nbsp;&nbsp;WriteOneChar(0xBE); &nbsp;//读取温度寄存器&nbsp;&nbsp;a=ReadOneChar();&nbsp;&nbsp; &nbsp;&nbsp;//读低8位&nbsp;&nbsp;b=ReadOneChar();&nbsp; &nbsp;&nbsp;//读高8位&nbsp;&nbsp;t=b;&nbsp;&nbsp;t<<=8;&nbsp;&nbsp;t=t|a;&nbsp;&nbsp;tt=t00625;&nbsp;&nbsp;t= tt10+05;&nbsp;&nbsp; &nbsp;&nbsp;//放大10倍输出并四舍五入&nbsp;&nbsp;return(t);}

#include <reg52h>

#define uchar unsigned char

#define uint unsigned int

sbit DS=P3^7; //define interface 定义DS18B20接口

uint temp; // variable of temperature

uchar flag1; // sign of the result positive or negative

sbit p0_5=P0^5;

sbit p2_7=P2^7;

sbit p2_4=P2^4;

sbit p2_5=P2^5;

sbit p2_6=P2^6;

unsigned char code TABLE[]={

0xd7,0x11,0xcd,0x5d,0x1b,

0x5e,0xde,0x15,0xdf,0x5f,

0x9f,0xdf,0xc6,0xd7,0xce,0x8e};

void delay(uint count) //delay

{

uint i;

while(count)

{

i=200;

while(i>0)

i--;

count--;

}

}

void Init_Com(void)

{

TMOD = 0x20;

PCON = 0x00;

SCON = 0x50;

TH1 = 0xFd;

TL1 = 0xFd;

TR1 = 1;

}

void dsreset(void) //send reset and initialization command

{

uint i; //DS18B20初始化

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

{ //写一个字节到DS18B20里

uint i;

uchar j;

bit testb;

for(j=1;j<=8;j++)

{

testb=dat&0x01;

dat=dat>>1;

if(testb) //write 1 写1部分

{

DS=0;

i++;i++;

DS=1;

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

}

else

{

DS=0; //write 0 写0部分

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

DS=1;

i++;i++;

}

}

}

void tmpchange(void) //DS18B20 begin change 发送温度转换命令

{

dsreset(); //初始化DS18B20

delay(1); //延时

tmpwritebyte(0xcc); // 跳过序列号命令

tmpwritebyte(0x44); //发送温度转换命令

}

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=temp00625; //得到真实十进制温度值,因为DS18B20

//可以精确到00625度,所以读回数据的最低位代表的是

//00625度。

temp=tt10+05; //放大十倍,这样做的目的将小数点后第一位

//也转换为可显示数字,同时进行一个四舍五入 *** 作。

return temp; //返回温度值

}

void delay10ms() //delay

{

uchar a,b;

for(a=10;a>0;a--)

for(b=60;b>0;b--);

}

void display(uint temp)

{

uchar a,b,c,d;

a=temp/100;

b=temp/10-a10;

d=temp%10;

c=(temp%100-d)/10;

P0=TABLE[d];

p0_5=0;

p2_7=0;

delay(1);

p2_7=1;

P0=TABLE[c];

p2_4=0;

delay(1);

p2_4=1;

P0=TABLE[b];

p0_5=1;

p2_5=0;

delay(1);

p2_5=1;

P0=TABLE[a];

p2_6=0;

delay(1);

p2_6=1;

}

void main() //主函数

{

uchar a;

Init_Com(); //初始化串口

do

{

tmpchange(); //温度转换

for(a=10;a>0;a--)

{

display(tmp()); //显示十次

}

}

while(1);

}

以上就是关于寻求 DS18B20+89C51单片机+蜂鸣器报警同时LED灯亮的温度报警程序,汇编\C语言都可以,谢谢。全部的内容,包括:寻求 DS18B20+89C51单片机+蜂鸣器报警同时LED灯亮的温度报警程序,汇编\C语言都可以,谢谢。、基于AT89C51和DS18B20制作的温度报警器原理图和单片机内部程序、求用AT89C51单片机和DS18B20做温度报警器,报警器用蜂鸣器,温度显示用数码管,用c语言编写程序最好有注释等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10005502.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存