|
现在可以把数码管检测示数但不懂如何触发报警和按键储存温度上下限,多天无解,还望解惑。
#include<reg52.h>
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define MAIN_Fosc 11059200UL
sbit DS = P3^7;
sbit we1=P2^0;
sbit we2=P2^1;
sbit we3=P2^2;
sbit we4=P2^3;
sbit deep=P3^6;
sbit key=P3^5;
sbit key2=P3^4;
sbit key3=P3^3;
sbit key4=P3^2;
uchar temp;
uchar num;
uchar settemp=35;
uchar settemp2=10;
bit DS18B20;
uchar msec, sec;
unsigned char code leddata[]={
0xC0, //"0"
0xF9, //"1"
0xA4, //"2"
0xB0, //"3"
0x99, //"4"
0x92, //"5"
0x82, //"6"
0xF8, //"7"
0x80, //"8"
0x90, //"9"
0x88, //"A"
0x83, //"B"
0xC6, //"C"
0xA1, //"D"
0x86, //"E"
0x8E, //"F"
0x89, //"H"
0xC7, //"L"
0xC8, //"n"
0xC1, //"u"
0x8C, //"P"
0xA3, //"o"
0xBF, //"-"
0xFF, //???
0xFF //?????
};
void delay (uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=84;y>0;y--);
}
void us(uchar us)//us???????
{
while(us--);
}
void display( uint value)
{
we1=1;
we1=0;
P0=0xff;
P0=leddata[value/1000];
delay(1);
we1=1;
we2=0;
P0&=0x7f;
P0=leddata[value%1000/100];
delay(1);
we2=1;
we3=0;
P0=0xff;
P0=leddata[value%100/10];
delay(1);
we3=1;
P0=0xff;
P0=leddata[value%10];
we4=0;
delay(1);
we4=1;
}
void display3( uint value)
{
we1=1;
we1=0;
P0=0xff;
P0=leddata[value/1000];
delay(1);
we1=1;
we2=0;
P0&=0x7f;
P0=leddata[value%1000/100];
delay(1);
we2=1;
we3=0;
P0=0xff;
P0=leddata[value%100/10];
delay(1);
we3=1;
P0=0xff;
P0=leddata[value%10];
we4=0;
delay(1);
we4=1;
}
void beep1()
{
temp=0xfe;
P1=temp;
delay(100);
while(1)
{
temp=_crol_(temp,1);
P1=temp;
deep=~deep;
delay(100);
}
}
void display2()
{
if(key == 0)
{
delay(5);
if(key == 0)
{
while(!key);
settemp++;
delay(50);
if(settemp==99)
settemp=0;
delay(50);
}
}
if(key2 == 0)
{
delay(5);
if(key2 == 0)
{
while(!key2);
if(settemp!=0)
settemp--;
delay(50);
}
}
if(key3 == 0)
{
delay(5);
if(key3 == 0)
{
while(!key3);
settemp2++;
delay(50);
if(settemp2==99)
settemp2=0;
delay(50);
}
}
if(key4 == 0)
{
delay(5);
if(key4 == 0)
{
while(!key4);
if(settemp2!=0)
settemp2--;
delay(50);
}
}
}
void duan ()
{
EA=1;
ET0=1;
TR0=1;
TMOD=0x01;
TH0=0x4b;
TL0=0xfd;
}
void timer0() interrupt 1
{
TH0=0x4b;
TL0=0xfd;
msec++;
if(msec==20)
{
msec=0;
}
}
//?????????????
bit init()
{
bit i;
DS = 1;//??????
_nop_();
DS = 0;
us(75); //????????75*6.5+11.95=499.45us ????????????18B20???????????
DS=1;
us(4);//???
i = DS;
us(20); //141.95us ???????
DS = 1;
_nop_();
return (i);
}
void write (uchar dat)//д ???
{
uchar i;
for(i=0;i<8;i++)
{
DS = 0;
_nop_();//????д???
DS = dat & 0x01;//?????????
us(10);//76.95us
DS = 1; //???????????????????д??
_nop_();
dat >>= 1;//??????
}
}
uchar read_byte()
{
uchar i, j, dat;
for(i=0;i<8;i++)
{
DS = 0;
_nop_();//?????????
DS = 1;
_nop_();//???????
j = DS;
us(10);//76.95us
DS = 1;
_nop_();
dat = (j<<7)|(dat>>1);//????
}
return (dat);
}
void main()
{
uint i;
uchar L, M;
init();//?????DS18B20
write(0xcc);//???????ROM???
write(0x4e);//????д????????
write(0x18);
write(0x10);
write(0x7f);
init();
write(0xcc);
write(0x48);
while(1)
{
init();//?????DS18B20
write(0xcc);//???????ROM???
write(0x44);//?????????????
init(); //?????DS18B20
write(0xcc);//???????ROM???
write(0xbe);//???DS18B20??????
L = read_byte();
M = read_byte();
i = M;
i <<= 8;
i |= L;
i = i * 0.0625 * 100 + 0.05;
display(i);
duan();
if(key==0|key2==0|key3==0|key4==0)
{ if(key==0)
{
settemp=settemp*100;
while(!key);
while(1)
{
display3(settemp);}
if(key2==0)
{ settemp=settemp*100;
while(!key2);
display3(settemp);}
if(key3==0)
{ settemp2=settemp2*100;
while(!key3);
display3(settemp2);}
if(key4==0)
{settemp2=settemp2*100;
while(!key4);
display3(settemp2);}
}
}
|
|