温度记录器
#include <STC15F2K60S2.H>
#include “DS18b20.H”
#include <INTRINS.H>
#define Y(n) P2=P2&0x1F|(n<<5),P2=P2&0x1F
unsigned char digit[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF,0xC6};
unsigned char num[8];
unsigned char c;
static unsigned long s=0;
void buzz_relay(char i,char j)
{
if(i0&&j0)
{
P0=~((1<<6)|(1<<4));
Y(5);
}
}
void led_on(unsigned char n)
{
if(n1)
{
P0=0xFF;
P00=0;
Y(4);
}
if(n2)
{
P0=0xFF;
P01=0;
Y(4);
}
if(n==3)
{
P0=0xFF;
P02=0;
Y(4);
}
}
void digit0num(unsigned char a,unsigned long n)
{
char i;
for(i=7;i>=4;i–)
{
num[i]=n%10;
n/=10;
}
num[0]=11;
num[1]=a;
num[2]=11;
num[3]=10;
}
void digit1num(unsigned long n)
{
char i;
for(i=6;i>=5;i–)
{
num[i]=n%10;
n/=10;
}
num[0]=11;
num[1]=4;
num[2]=11;
num[3]=10;
num[4]=10;
num[7]=12;
}
void display()
{
static char i=0;
P0=0xFF;
Y(7);
P0=(1<<i);
Y(6);
P0=digit[num[i]];
Y(7);
if(++i==8)
i=0;
}
unsigned short TH1_H,TL1_H,TH1_L,TL1_L;
unsigned short W;
bit keyflag0=0; //有时间就减
bit keyflag1=0; //一秒一秒减
static unsigned short keycount0=0;
void timer0_init()
{
EA=1;
ET0=1;
ET1=1;
TMOD=TMOD&0x00|0x11;
TH0=(65536-2000)>>8;
TL0=(65536-2000)&0x0F;
TR0=1;
TR1=0;
}
void timer0_isr() interrupt 1
{
TH0=(65536-2000)>>8;
TL0=(65536-2000)&0x0F;
display();
if(++keycount0==500)
{
keycount0=0;
keyflag1=1;
}
}
void timer1_isr() interrupt 3
{
if(P34==1)
{
TH1=TH1_H;
TL1=TL1_H;
P34=0;
}
else
{
TH1=TH1_L;
TL1=TL1_L;
P34=1;
}
}
unsigned char key_id()
{
unsigned char id=0;
P3=P3|0x0F;
if(P300)
id=7;
if(P310)
id=6;
if(P320)
id=5;
if(P330)
id=4;
return id;
}
unsigned char key_id_down()
{
static unsigned char lastid=0;
unsigned char thisid;
static unsigned char ret=0;
thisid=key_id();
if(lastid==0&&thisid!=0)
ret=thisid;
else
ret=0;
lastid=thisid;
return ret;
}
void key_proc(unsigned char id)
{
static unsigned char n=1;
static unsigned char d=0;
if(id==4)
{
n=n+1;
if(n==4)
n=1;
}
if(id==5)
{
s=s+60;
keyflag0=1;
}
if(keyflag0==1)
{
if(keyflag1==1)
{
s--;
keyflag1=0;
if(s==0)
{
keyflag0=0; //当没时间,停止减
TR1=0;
}
}
}
if(id==6)
{
TR1=0;
s=0;
keyflag0=0;
//led_off();
}
if(id==7)
{
d=d+1;
if(d==2)
d=0;
}
if(d==1)
{
digit1num(c);
}
if(d==0)
{
digit0num(n,s);
}
if(n==1)
{
led_on(n);
W=200;
TH1_H=(65536-W)>>8;
TL1_H=(65536-W)&0x00FF;
TH1_L=(65536-(1000-W))>>8;
TL1_L=(65536-(1000-W))&0x00FF;
TR1=1;
}
if(n==2)
{
led_on(n);
W=300;
TH1_H=(65536-W)>>8;
TL1_H=(65536-W)&0x00FF;
TH1_L=(65536-(1000-W))>>8;
TL1_L=(65536-(1000-W))&0x00FF;
TR1=1;
}
if(n==3)
{
led_on(n);
W=700;
TH1_H=(65536-W)>>8;
TL1_H=(65536-W)&0x00FF;
TH1_L=(65536-(1000-W))>>8;
TL1_L=(65536-(1000-W))&0x00FF;
TR1=1;
}
}
int main()
{
buzz_relay(0,0);
digit0num(1,0);
timer0_init();
while(1)
{
key_proc(key_id_down());
c=ds18b20_read_value();
}
}