标题:
单片机温度报警器 电路图+程序
[打印本页]
作者:
benbens
时间:
2015-7-14 19:47
标题:
单片机温度报警器 电路图+程序
00000000.png
(73.5 KB, 下载次数: 384)
下载附件
2015-7-14 19:46 上传
#include <REG52.H>
#include<intrins.h> //包含_nop_()函数定义的头文件
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
sbit DQ=P3^3;
sbit LED1=P2^3;
sbit LED2=P2^6;
sbit fmq=P1^6;
union{
uchar c[2];
uint x;
}temp;
uint cc,cc2;
float cc1;
bit flag1;
uchar buffer1[]={"dangerous!!"} ;
uchar buffer2[]={"welcome!!!!"};
uchar buffer3[]={"tem"};
uchar num[6]={"+00.0"};
/*void delay1us(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--)
{;} //500us
}*/
void delay500us()
{
unsigned char j;
for(j=0;j<57;j++)
{;} //500us
}
void beep()
{
fmq=0;
delay500us(); /* 频率为1kHz,500us的低电平,导通(三极管)*/
fmq=1; /* 频率为1kHz,500us的高电平,未通(三极管)*/
delay500us();
}
//查忙函数
void wait()
{
P0=0xff;
RS=0;
RW=1;
EN=1;
EN=0;
while(P0&0x80)
{
EN=0;
EN=1;
}
}
void wc51com(uchar com)
{
wait();
EN=0;
RS=0;
RW=0;
EN=1;
P0=com;
EN=0;
}
void wc51r(uchar dat)
{
wait();
EN=0;
RS=1;
RW=0;
EN=1;
P0=dat;
EN=0;
}
void init()
{
wc51com(0x01);
wc51com(0x38);
wc51com(0x0c);
wc51com(0x06);
}
/*****************************
**********************************************/
void delay(int useconds)
{
for(; useconds>0;useconds--);
}
uchar ow_reset(void)
{
uchar presence;
DQ=0;//CPU把总线拉低的操作;
delay(50);//拉低480微秒到960微秒
DQ=1;//CPU释放总线
delay(3);//延时15——60微秒;待总线回到高电平唤醒13B20
presence=DQ;//DS13B20把总线发送低电平表示复位成功;13B20完好可以工作
delay(25);//延时60到240
return(presence) ;
}
uchar read_byte(void)
{
uchar i;
uchar value=0;
for(i=8; i>0;i--)
{
value>>=1;
DQ=0;
DQ=1;
delay(1);
if(DQ) value|=0x80;
delay(6);
}
return(value);
}
void write_byte(uchar val)
{
uchar i;
for(i=8;i>0;i--)
{
DQ=0;
DQ=val&0x01;
delay(5);
DQ=1;
val=val/2;
}
delay(5);
}
void read_Temperature(void)
{
ow_reset();//初始化; 复位
write_byte(0xCC);//温度变化指令(最开始为0)
write_byte(0xBE);//读9个字节类容的温度
temp.c[1]=read_byte(); //读出来显示低位
temp.c[0]=read_byte(); //读出来显示高位
_nop_(); _nop_();_nop_();
ow_reset(); //初始化
write_byte(0xCC); //温度变化指令
write_byte(0x44);//读存入到9个字节中
return;
}
void main()
{
uchar k=0;
uint t=0;
delay(10); fmq=1;
EA=0;
flag1=0;
init();
wc51com(0x80+0x00);
wc51r('m');
wc51r('e');
while(1)
{
delay(10000);
read_Temperature();
cc=temp.c[0]*256.0+temp.c[1];
if(temp.c[0]>0xf8){flag1=1;cc=~cc+1;}else flag1=0;
cc1=cc*0.0625; //得到实际的值;
cc2=cc1*100;//1710
if(((cc2/1000)*10+(cc2/100-(cc2/1000)*10)>=37)&((cc2/1000)*10+(cc2/100-(cc2/1000)*10)<=40))
{
LED2=1;
LED1=0;
wc51com(0x80+0x04);
for(k=0;k<11;k++)
{wc51r(buffer2[k]);}
}
else
{
LED2=0;
LED1=1;
wc51com(0x80+0x04);
for(k=0;k<11;k++)
{
wc51r(buffer1[k]);
}
wc51com(0x80+0x40) ;
for(k=0;k<3;k++)
{
wc51r(buffer3[k]);
}
for(t=0;t<1000;t++) //响
{
{
beep(); //一次循环是1kHz,1MS;1000表示蜂鸣器响起来
}
fmq=1; //不响;
delay500us();
delay500us();
}
}
num[1]=cc2/1000+0x30;//1710/100=1;
if(num[1]==0x30)
num[1]=0x20;
num[2]=cc2/100-(cc2/1000)*10+0x30;//1710/100=17-(1*10)=7;
num[4]=cc2/10-(cc2/100)*10+0x30;//1710/10=171-(17*10)=1
if(flag1==1)
{
num[0]='-';
}
else
num[0]='+';
wc51com(0x80+0x44);
for(k=0;k<5;k++)
{wc51r(num[k]);}
}
}#include <REG52.H>
#include<intrins.h> //包含_nop_()函数定义的头文件
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
sbit DQ=P3^3;
sbit LED1=P2^3;
sbit LED2=P2^6;
sbit fmq=P1^6;
union{
uchar c[2];
uint x;
}temp;
uint cc,cc2;
float cc1;
bit flag1;
uchar buffer1[]={"dangerous!!"} ;
uchar buffer2[]={"welcome!!!!"};
uchar buffer3[]={"tem"};
uchar num[6]={"+00.0"};
/*void delay1us(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--)
{;} //500us
}*/
void delay500us()
{
unsigned char j;
for(j=0;j<57;j++)
{;} //500us
}
void beep()
{
fmq=0;
delay500us(); /* 频率为1kHz,500us的低电平,导通(三极管)*/
fmq=1; /* 频率为1kHz,500us的高电平,未通(三极管)*/
delay500us();
}
//查忙函数
void wait()
{
P0=0xff;
RS=0;
RW=1;
EN=1;
EN=0;
while(P0&0x80)
{
EN=0;
EN=1;
}
}
void wc51com(uchar com)
{
wait();
EN=0;
RS=0;
RW=0;
EN=1;
P0=com;
EN=0;
}
void wc51r(uchar dat)
{
wait();
EN=0;
RS=1;
RW=0;
EN=1;
P0=dat;
EN=0;
}
void init()
{
wc51com(0x01);
wc51com(0x38);
wc51com(0x0c);
wc51com(0x06);
}
/*****************************
**********************************************/
void delay(int useconds)
{
for(; useconds>0;useconds--);
}
uchar ow_reset(void)
{
uchar presence;
DQ=0;//CPU把总线拉低的操作;
delay(50);//拉低480微秒到960微秒
DQ=1;//CPU释放总线
delay(3);//延时15——60微秒;待总线回到高电平唤醒13B20
presence=DQ;//DS13B20把总线发送低电平表示复位成功;13B20完好可以工作
delay(25);//延时60到240
return(presence) ;
}
uchar read_byte(void)
{
uchar i;
uchar value=0;
for(i=8; i>0;i--)
{
value>>=1;
DQ=0;
DQ=1;
delay(1);
if(DQ) value|=0x80;
delay(6);
}
return(value);
}
void write_byte(uchar val)
{
uchar i;
for(i=8;i>0;i--)
{
DQ=0;
DQ=val&0x01;
delay(5);
DQ=1;
val=val/2;
}
delay(5);
}
void read_Temperature(void)
{
ow_reset();//初始化; 复位
write_byte(0xCC);//温度变化指令(最开始为0)
write_byte(0xBE);//读9个字节类容的温度
temp.c[1]=read_byte(); //读出来显示低位
temp.c[0]=read_byte(); //读出来显示高位
_nop_(); _nop_();_nop_();
ow_reset(); //初始化
write_byte(0xCC); //温度变化指令
write_byte(0x44);//读存入到9个字节中
return;
}
void main()
{
uchar k=0;
uint t=0;
delay(10); fmq=1;
EA=0;
flag1=0;
init();
wc51com(0x80+0x00);
wc51r('m');
wc51r('e');
while(1)
{
delay(10000);
read_Temperature();
cc=temp.c[0]*256.0+temp.c[1];
if(temp.c[0]>0xf8){flag1=1;cc=~cc+1;}else flag1=0;
cc1=cc*0.0625; //得到实际的值;
cc2=cc1*100;//1710
if(((cc2/1000)*10+(cc2/100-(cc2/1000)*10)>=37)&((cc2/1000)*10+(cc2/100-(cc2/1000)*10)<=40))
{
LED2=1;
LED1=0;
wc51com(0x80+0x04);
for(k=0;k<11;k++)
{wc51r(buffer2[k]);}
}
else
{
LED2=0;
LED1=1;
wc51com(0x80+0x04);
for(k=0;k<11;k++)
{
wc51r(buffer1[k]);
}
wc51com(0x80+0x40) ;
for(k=0;k<3;k++)
{
wc51r(buffer3[k]);
}
for(t=0;t<1000;t++) //响
{
{
beep(); //一次循环是1kHz,1MS;1000表示蜂鸣器响起来
}
fmq=1; //不响;
delay500us();
delay500us();
}
}
num[1]=cc2/1000+0x30;//1710/100=1;
if(num[1]==0x30)
num[1]=0x20;
num[2]=cc2/100-(cc2/1000)*10+0x30;//1710/100=17-(1*10)=7;
num[4]=cc2/10-(cc2/100)*10+0x30;//1710/10=171-(17*10)=1
if(flag1==1)
{
num[0]='-';
}
else
num[0]='+';
wc51com(0x80+0x44);
for(k=0;k<5;k++)
{wc51r(num[k]);}
}
}
复制代码
作者:
ludaijin
时间:
2015-9-25 09:44
怎么有两个头件定义啊
作者:
ludaijin
时间:
2015-9-25 10:36
正好做一个太强了,赚点币
作者:
月灵影只
时间:
2015-9-25 18:52
大神请问一下= =
cc=temp.c[0]*256.0+temp.c[1];
if(temp.c[0]>0xf8){flag1=1;cc=~cc+1;}else flag1=0;
cc1=cc*0.0625; //得到实际的值;
cc2=cc1*100;//1710
这一段是怎么算的= =代表了什么意思
作者:
一闪而过丶
时间:
2015-12-20 19:50
大神可以发张原理图看看吗?放大太模糊了
作者:
li8zhen
时间:
2016-6-14 22:04
大神请问一下= =
cc=temp.c[0]*256.0+temp.c[1];
if(temp.c[0]>0xf8){flag1=1;cc=~cc+1;}else flag1=0;
cc1=cc*0.0625; //得到实际的值;
作者:
amazing明
时间:
2016-11-14 18:05
这个图能发个清晰点点吗
作者:
罗塔尼尼的黑犬
时间:
2016-11-14 18:19
这个图能发个清晰点点吗谢谢分享
作者:
a598089072
时间:
2017-2-26 13:50
没有文件下载?
作者:
a598089072
时间:
2017-3-25 07:52
学习了,不错不错
作者:
way。
时间:
2017-6-13 21:59
有图吗
作者:
348652560
时间:
2017-6-15 17:40
非常好
作者:
小和尚2
时间:
2017-6-19 17:38
大神,这个温度范围是多少啊,
作者:
A_One
时间:
2017-10-16 10:52
楼主,能不能发一张清楚一点的图,这个图太模糊了,谢谢啦
作者:
yyfpy
时间:
2017-10-17 11:16
学习了!
作者:
zlzw1500
时间:
2018-3-18 22:02
可以的
作者:
GTY123
时间:
2018-3-20 17:27
很厉害
作者:
奇怪的荔枝
时间:
2018-5-4 11:07
大神,能把电路图的文件发来么
作者:
我只是过客
时间:
2019-4-8 21:48
非常给力!!!
作者:
fujiyyqx
时间:
2020-6-15 11:41
可以发下仿真链接吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1