之前参考别人的帖子做了这个温度报警器,报警功能可以实现,但是出现了数码管显示不完全的问题,本人萌新一枚,希望有大神可以指点一二,谢谢啦!!!
源码如下:
#include<reg51.h>
#include<intrins.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^6;
sbit sounder=P3^7;
sbit D1=P1^4;
sbit D2=P1^5;
uchar temperature1,temperature0,TH,TL;
float tt;
int t;
uint count0,count1;
int baojing[]={700,-200};
uchar code smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code smg1[]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0xF7,0xFC,0xB9,0xDE,0xF9,0xF1};
void delayms(int j)
{
int aa,kk;
for(aa=0;aa<j;aa++)
for(kk=120;kk>0;kk--);
}
void delay5us()
{
_nop_();
}
void delay10us()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void delay102us()
{
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
}
void delay614us()
{
delay102us();
delay102us();
delay102us();
delay102us();
delay102us();
delay102us();
}
uchar init_DS18B20()
{
uchar status ;
DQ=1;
delay10us();
DQ=0;
delay614us();
DQ=1;
delay10us();
delay10us();
delay10us();
status=DQ;
delay102us();
delay102us();
delay102us();
delay102us();
DQ=1;
return status;
}
uchar DS18B20_readbyte()
{
uchar i,dat=0;
DQ=1;
_nop_();
for(i=0;i<8;i++)
{
DQ=0;
_nop_();
_nop_();
_nop_();
dat>>=1;
DQ=1;
_nop_();
_nop_();
if(DQ)dat|=0x80;
else
dat=dat|0x00;
delay102us();
delay102us();
delay102us();
delay102us();
DQ=1;
}
return dat;
}
void DS18B20_writebyte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay10us();
delay5us();
dat>>=1;
delay10us();
delay10us();
delay10us();
delay10us();
delay5us();
DQ=1;
}
DQ=1;
}
void read_temperature()
{
if(init_DS18B20()==0)
{
DS18B20_writebyte(0xcc);
DS18B20_writebyte(0x44);
}
if(init_DS18B20()==0)
{
DS18B20_writebyte(0xcc);
DS18B20_writebyte(0xbe);
temperature0=DS18B20_readbyte();
temperature1=DS18B20_readbyte();
}
}
void xianshi()
{
uchar bai,shi,ge,i;
uint wendu;
read_temperature();
t=temperature1;
t<<=8;
t=t|temperature0;
tt=t*0.0625;
t=tt*10+(t>0?0.5:-0.5);
TH=t>=baojing[0]?1:0;
TL=t<=baojing[1]?1:0;
wendu=abs(t);
bai=wendu/100;
shi=wendu/10%10;
ge=wendu%10;
for(i=0;i<30;i++)
{
if(t<0)
{
P2=0xfb;
P0=0x40;
delayms(2);
}
P2=0xff;
P2=0xf7;
P0=smg[bai];
delayms(2);
P2=0xef;
P0=smg1[shi];
delayms(2);
P2=0xdf;
P0=smg[ge];
delayms(2);
P2=0xbf;
P0=0x63;
delayms(2);
P2=0x7f;
P0=0x39;
delayms(2);
}
}
void main()
{
D1=1;
D2=1;
sounder=0;
P2=0x00;
P0=0x00;
TMOD=0x11;
TH0=-(1000/256);
TL0=-(1000%256);
TH1=-(1000/256);
TL1=-(1000%256);
ET0=1;
ET1=1;
EA=1;
TR1=0;
TR0=0;
read_temperature();
while(1)
{
read_temperature();
xianshi();
if(TH==1)
TR0=1;
else
TR0=0;
if(TL==1)
TR1=1;
else
TR1=0;
}
}
void ET0_time1() interrupt 1
{
TH0 =-(1000 / 256);
TL0 =-(1000 % 256);
sounder=~sounder;
if(++count0== 400)
{
count0= 0;
if(TH) D1= ~D1; else D1 = 1;
}
}
void ET1_time1()interrupt 3
{
TH1 =-(1000 / 256);
TL1 =-(1000 % 256);
sounder=~sounder;
if(++count1== 400)
{
count1= 0;
if(TL) D2 = ~D2; else D2 = 1;
}
}
|