#include <stc12c5a60s2.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
unsigned short cp;
int hour=12;
int minute=30
uchar second;
int flag=0;
/******DS18B2***********/
code unsigned char ROM1[] ={0x28,0x39,0x6d,0xA0,0x17,0x13,0x01,0xe6};
code unsigned char ROM2[] ={0x28,0xcb,0xb9,0xb0,0x17,0x13,0x01,0x83};
sbit DQ = P1^0;
void delay(uint x)
{
char i;
while(x--)
for (i=0;i<12;i++)
;
}
void Init_DS18B20(void)
{
unsigned char x = 255;
DQ = 1;
DQ = 0;
delay(80);
DQ = 1;
while(DQ && x--);
delay(20);
}
unsigned char Read_OneChar(void)
{
uchar i = 0;
uchar dat = 0;
for(i = 0;i < 8;i++)
{
DQ = 0;
dat =dat >> 1;
DQ = 1;
if(DQ)
dat =dat | 0x80;
delay(8);
}
return(dat);
}
void Write_OneChar(unsigned char dat)
{
uchar i = 0;
for(i = 0;i < 8;i++)
{
DQ = 0;
DQ = dat & 0x01;
delay(10);
DQ = 1;
dat= dat >> 1;
}
delay(8);
}
void PP_ROM() //Æ¥ÅäROM
{
uchar i;
Write_OneChar(0x55);
for(i=0;i<8;i++) //•¢ËíDòáDoÅ
{
if(tm==1) Write_OneChar(ROM1);
if(tm==2) Write_OneChar(ROM2);
}
}
uchar a=0,b=0;
float c=0;
/************18B20¶áè¡Î¶è3ìDò***********/
uchar get_temp()
{
int t;
Init_DS18B20();
PP_ROM();
Write_OneChar(0x44);
Init_DS18B20();
PP_ROM();
Write_OneChar(0xbe); //¶áÔY′æÆ÷
a = Read_OneChar(); //¶áè¡Æ¥Åäds18B20ζè //a 1001 0111
b = Read_OneChar();
t=b;
t<<=8;
t=t|a;
c=t*0.0625;
t=c*10+0.5;
return(t);
}
/*********************°′¼üoˉêy********************/
sbit key1 = P2^2; //¼ó
sbit key2 = P2^1; //¼õ
void key(void)
{
if(key1 == 0)
{
delay(12000);
//·-ò3¼ó
flag=flag+1;
if(flag>2) flag=2;
}
if(key2 == 0)
{
delay(480);
//•-ò3¼õ
flag=flag-1;
if(flag<=0) flag=0;
delay(20);
}while (key2==0);
}
/****************displayÏÔê¾oˉêy*******************/
sbit SEG_bit1=P2^6;
sbit SEG_bit2=P2^5;
sbit SEG_bit3=P2^4;
sbit SEG_bit4=P2^3;
uchar cp2,flash;
uint temp_num,m;
code uchar seven_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; /0-9
void display0(void)//显示时间
{
P2&=0x87;
switch(cp2)
{
case 0: P0 = seven_seg[hour/10]; SEG_bit4=1;break;
case 1: P0 = seven_seg[hour%10] & (0x7f | flash) ;SEG_bit3=1;break;
case 2: P0 = seven_seg[minute/10]; SEG_bit2=1;break;
case 3: P0 = seven_seg[minute%10]; SEG_bit1=1; break;
}
cp2++;
if(cp2 >= 4)cp2 = 0;
}
void display1(void)
{
P2&=0x87;
switch(cp2)
{
case 0: P0 = seven_seg[temp_num / 1000]; SEG_bit4=1;break;
case 1: P0 = seven_seg[temp_num / 100 % 10];SEG_bit3=1;break;
case 2: P0 = seven_seg[temp_num % 100/10]&0x7f; SEG_bit2=1;break;
case 3: P0 = seven_seg[temp_num % 10]; SEG_bit1=1;break;
}
cp2++;
if(cp2 >= 4)cp2 = 0;
}
/******ÖD¶Ï•tÎñoˉêy***********/
void timer0_isr(void)interrupt 1
{
TH0 = 0xf8; //12Mhz£¬¶¨ê±2ms
TL0 = 0x2f;
cp++;
if(cp >= 500) //àÛ¼Æ1s
{
cp = 0;
flash = ~flash;
if(++second>=60) //μ½60Ãë
{
second=0;
if(++minute>=60) //μ½60•Ö
{
minute=0;
if(++hour>=24) hour=0;
}
}
temp_num= get_temp();
}
if(flag==0) display0();
if((flag == 1)|(flag == 2)) display1(); //显示18b20温度
}
void main(void)
{
TMOD = 0x01;
TH0 = 0xf8;
TL0 = 0x2f;
EA = 1; //×üÖD¶ÏÔêDí′ò¿a
ET0 = 1; //ÖD¶ÏT0ÔêDí ′ò¿a
TR0 = 1; //T0 ′ò¿a
P2M0=0x78; //推挽
P2M1=0x00;
while(1)
{
key();
}
}
|