寻求 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();

}

}

//结束//

没时间给你写了,大概意思就是开一个T0,初值65536-50000(05秒)触发一次,再设定一个变量每触发加1,每两次控制蜂鸣器变量取反,直到60时,长开,就这个意思,挺简单的,自己写写吧

以上就是关于寻求 DS18B20+89C51单片机+蜂鸣器报警同时LED灯亮的温度报警程序,汇编\C语言都可以,谢谢。全部的内容,包括:寻求 DS18B20+89C51单片机+蜂鸣器报警同时LED灯亮的温度报警程序,汇编\C语言都可以,谢谢。、c51单片机: 利用定时器+蜂鸣器实现定时报警功能,30秒内,每一秒响一下,30秒时间到了,蜂鸣器长鸣 求程序、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/10219219.html

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

发表评论

登录后才能评论

评论列表(0条)

保存